개발/JSP 게시판 만들기

[JSP 게시판 만들기] 10강 게시판 글쓰기 기능 구현하기

ee2ee2 2021. 11. 8. 16:27
728x90
반응형

참고 유튜브

지난 시간 게시판 데이터베이스 구축을 완료했다.
이제 게시판 글 쓰기 기능을 구현해보자!


우선, 현재 상황을 살펴보자.

로그인 후, 게시판 메인 화면

글 작성하기 버튼 클릭시, write.jsp 파일이 없기에 404에러가 발생한다.

write.jsp이 현재 없으므로, 404 에러

write.jsp

: 해당 부분은 글쓰기 입력 양식을 구현한 부분으로 입력한 데이터를 writeAction.jsp로 보내는 역할을 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<!-- 어느 기기에서도 맞춤으로 보이는 반응형 웹에 사용되는 기본 Meta Tag -->
<meta name="viewport" content="width-device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		String userID = null;
	
		//로그인한 사용자들이라면, userID에 값이 담기게될 것!
		if(session.getAttribute("userID") != null){
			userID = (String) session.getAttribute("userID");
		}
	%>
	<!-- 전반적인 웹사이트 구성을 나타내는 네비게이션 -->
	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed" 
			data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp"> JSP 게시판 웹 사이트</a>
		</div>
		
		
		<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			<!-- ul은 리스트를 보여줄 때 쓰는 tag -> 안에 원소는 li로 사용 -->
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a>
				<li class="active"><a href="boardSite.jsp">게시판</a>
			</ul>
		<%
			//아무도 로그인 되어있지 않을 때만 로그인/회원가입 메뉴를 보이게 하기 위함.
			if(userID == null) { 
		%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle" data-toggle="dropdown"
					role="button" aria-haspopup="true" aria-expanded="false"> 접속하기 <span class="caret"></span>
					</a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>
					</ul>
				</li>
			</ul>
		<%		
			} else { //로그인이 되어있는 사용가자 보는 메뉴
		%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle" data-toggle="dropdown"
					role="button" aria-haspopup="true" aria-expanded="false"> 회원관리 <span class="caret"></span>
					</a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul>
				</li>
			</ul>
		<%
			}
		%>
		</div>
	</nav>
	
	<!-- 게시판 글쓰기 양식 부분 -->
	<div class="container">
		<div class="row">
			<form method="post" action="writeAction.jsp">
				<table class="table table-striped" style="text-align: center; border:1px solid #dddddd">
					<thead>
						<tr><th colspan="2" style="backgroud-color:#eeeeee; text-align: center;"> 게시판 글쓰기 양식 </th></tr>
					</thead>
					<tbody>
						<tr>
							<td><input type="text" class="form-control" placeholder="글 제목" name="boardTitle" maxlength="50"></input></td>
						</tr>
						<tr>
							<td><textarea class="form-control" placeholder="글 내용" name="boardContent" maxlength="3000" style="height: 350px;"></textarea></td>
						</tr>
					</tbody>
				</table>
				<input type="submit" class="btn btn-primary pull-right" value="저장하기"></input>
			</form>
		</div>
	</div>
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html>


<구현한 글쓰기 양식>


writeAction.jsp

: write.jsp에서 받은 Data를 write 함수를 호출함으로써 데이터 저장을 가능하게 하는 부분.
userID 세션값을 검사하여 로그인한 사용자만 글쓰기 기능을 사용 가능할 수 있도록 할 수 있다.

<%@page import="boardSite.BoardSite"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="boardSite.BoardSiteDAO" %>
<%@ page import="java.io.PrintWriter" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="board" class="boardSite.BoardSite" scope="page"/>
<jsp:setProperty name="board" property="boardTitle"/>
<jsp:setProperty name="board" property="boardContent"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		String userID = null;
		if(session.getAttribute("userID") != null){	
			userID = (String) session.getAttribute("userID");
		}
		
		if(userID == null){	
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('로그인 이후 이용가능한 서비스 입니다.')");
			script.println("location.href = 'login.jsp'");
			script.println("</script>");	
		}
		else {
			if(board.getBoardTitle() == null || board.getBoardContent() == null) {
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('모든 칸을 입력해주십시오.')");
				script.println("history.back()");
				script.println("</script>");	
			}
			else {
				//실제 Data 저장을 위해 저장 함수를 호출하는 부분
				BoardSiteDAO boardrDao = new BoardSiteDAO();
				int result = boardrDao.write(board.getBoardTitle(), userID, board.getBoardContent()); 
				
				if(result >= 0){
					PrintWriter script = response.getWriter();
					script.println("<script>");
					script.println("location.href = 'boardSite.jsp'");
					script.println("</script>");	
				} else if(result == -1){
					PrintWriter script = response.getWriter();
					script.println("<script>");
					script.println("alert('글 등록에 실패하였습니다.')");
					script.println("history.back()");
					script.println("</script>");	
				}
			}
		}

	%>
</body>
</html>

이제 실질적으로 DB에 접속하여 데이터를 저장하는 DAO를 구현해본다!
총 3가지 함수 구현이 필요하다.
-. String getDate() : 현재 시간을 갖고 오는 함수 (게시글 작성일자를 저장할 때 필요함)
-. int getNext() : 가장 최근 게시물의 ID값을 가져오는 함수 (이번에 저장할 게시글의 ID를 지정하기 위해)
-. int write(String boardTitle, String userID, String boardContent) : 게시글을 저장하는 함수

BoardSiteDAO.java

package boardSite;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BoardSiteDAO {
	private Connection conn;
	private ResultSet rs;
	
	//생성자는 인스턴스를 생성할 때 자동으로 실행되는 부분
	public BoardSiteDAO() {
		try {
			String dbURL ="jdbc:mysql://localhost:3306/BOARDSITE";
			String dbID = "root";
			String dbPW = "root계정 패스워드";
			
			Class.forName("com.mysql.cj.jdbc.Driver");	 //MySQL에 접속할 수 있도록 하는 매개체(라이브러리)
			conn = DriverManager.getConnection(dbURL, dbID, dbPW); //매개변수를 통해 DB에 접속할 수 있도록 함. 접속이 완료되면 conn객체에 접속정보가 담기게 됨.
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	//현재 시간을 갖고 오는 함수 (게시글 작성일자를 저장할 때 필요함)
	public String getDate() {
		String SQL = "SELECT NOW()";
		
		try {
			//여러개의 함수가 사용되기 때문에 각 DB 접근에 있어서 마찰이 일어나지 않도록 각 함수 내부에서 선언하도록 함.
			PreparedStatement pstat = conn.prepareStatement(SQL); //SQL 실행 준비상태
			rs = pstat.executeQuery();
			
			if(rs.next())
				return rs.getString(1);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	
		return "";	//DB오류가 나면 빈 문자열을 반환
	}
	
	//가장 최근 게시물의 ID값을 가져오는 함수
	public int getNext() {
		String SQL = "SELECT boardID from BOARD ORDER BY boardID DESC";
		
		try {
			PreparedStatement pstat = conn.prepareStatement(SQL); //SQL 실행 준비상태
			rs = pstat.executeQuery();
			
			if(rs.next())
				return rs.getInt(1) + 1;
			
			return 1; // 첫 번째 게시물인 경우
		} catch (Exception e) {
			e.printStackTrace();
		}
	
		return -1;	//DB 오류
	}
	
	public int write(String boardTitle, String userID, String boardContent) {
		String SQL = "INSERT INTO BOARD VALUES (?, ?, ?, ?, ?, ?)";
		
		try {
			PreparedStatement pstat = conn.prepareStatement(SQL); //SQL 실행 준비상태
			pstat.setInt(1, getNext());
			pstat.setString(2, boardTitle);
			pstat.setString(3, userID);
			pstat.setString(4, getDate());
			pstat.setString(5, boardContent);
			pstat.setInt(6, 1);

			return pstat.executeUpdate();	//성공했을 경우 0이상의 숫자를 반환
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return -1; //DB오류
	}

}

이제 실행해보자!

<로그인 후 게시판 메인페이지> - 글 작성하기 클릭

<게시판 글쓰기 양식 기본>

<게시판 글쓰기> - 글 작성하기 클릭

<저장 완료> - 아직 게시글을 보여주는 부분은 구현안했으므로 화면에는 안보임.

<DB 상에는 정상적으로 저장된 것을 확인>


<로그인 하지 않은 상태로 글을 작성하려 할 때>

로그인 후 이용가능하다는 알림 메세지 출력

<DB에는 저장 안됨>

<로그인 페이지로 전환>


게시글 저장하기까지 구현 완료하였다.
다음 시간에는 저장할 게시글이 보일 수 있도록 해본다! 고지가 눈 앞이다 :)