카테고리 없음

[JSP] 10강 - 글쓰기 기능 구현

Egu99 2021. 3. 11. 17:58

본 포스팅은

정보 제공용이 아닌

유튜브 동빈나님의 JSP 게시판 만들기 강좌 10강을

바탕으로 보고 배운 것을 직접 정리해본 포스트 입니다.

 


** 이번 강좌에선 글쓰기 기능을 구현해보았다. 

따라 구현하면서 어? 이부분은 이렇게 안해도 될 거 같은데, 이렇게 하는 게 좋을 거 같은데, 이런 게 추가되면 좋을 것 같아 라는 생각이 많이 들었다. 아마도 그동안 인터넷을 통해 많이 경험했던 글쓰기라 더욱 그랬던 거 같다. 

인터페이스적인 부분은 나중에 추가해도 상관없는 것이고 일단 동작에 중점을 두었다.

 


 

** 프로세스 

  1. write.jsp에서 제목과 내용을 form 방식으로 writeAction.jsp 보낸다.
  2. writeAction.jsp에서는 Bbs라는 VO 클래스를 토대로(?) 자바빈즈로 만들어주고 bbsDAO에서 글쓰기 메서드인 wrtie()를 호출한다.
  3. bbsDAO에서는 write메서드를 통해 게시물을 만들어 insert하고 성공여부에 따라 알람과 이동을 해준다.

 


 

** writeAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <!-- 클래스 import -->
 <%@ page import = "bbs.BbsDAO" %>
 <%@ page import = "java.io.PrintWriter" %>  
 <!-- 요청의 인코딩 타입을 UTF-8로 지정  -->
 <% request.setCharacterEncoding("UTF-8"); %> 
 <!-- JSP의 자바빈 기능. Bbs클래스로 자바빈을 만들고 범위를 이 페이지로 한정 -->
 <jsp:useBean id="bbs" class="bbs.Bbs" scope="page" />
 <!-- 위의 자바빈의 속성을 저장.  -->
 <jsp:setProperty name="bbs" property="bbsID" />
 <jsp:setProperty name="bbs" property="bbsTitle" />
 <jsp:setProperty name="bbs" property="userID" />
 <jsp:setProperty name="bbs" property="bbsDate" />
 <jsp:setProperty name="bbs" property="bbsContent" />
 <jsp:setProperty name="bbs" property="bbsAvailable" />
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
	String userID = null;
	if(session.getAttribute("userID")!=null){
		userID = (String)session.getAttribute("userID");
	}
	//login이 안됐을 경우
	if(userID == null){
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('먼저 로그인 하세요.')");
		script.println("location.href = 'login.jsp'");
		script.println("</script>");
		
	} else { //로그인이 된 경우
		//제목이나 내용이 누락된 경우
		if(bbs.getBbsTitle()== null || bbs.getBbsContent() == null){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('입력하지 않은 정보가 있습니다.')");
			script.println("history.back'");
			script.println("</script>");
		//누락된 게 없을 경우
		}else{
			BbsDAO bao = new BbsDAO();
			int result = bao.write(bbs.getBbsTitle(), userID, bbs.getBbsContent());
			
			if(result == -1){
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('글쓰기에 실패했습니다.')");
				script.println("histroy.back()");
				script.println("</script>");
			}else {
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('글이 등록되었습니다.')");
				script.println("location.href = 'main.jsp'");
				script.println("</script>");
			}
		}
	}
	%>
</body>
</html>

 

  • 일단 jsp의 useBean 태그를 통해 자바빈즈를 만들어준다. 
  • 세션을 통해 userID를 받아야하므로 로그인이 안되어있을 땐 로그인을 먼저 하게 한다.
  • 개인적으로 이 부분은 글을 다 쓰고 나서 로그인 시키는 것은 좋은 방향은 아닌 것 같다. 힘들게 쓴 글이 일단 날아가기 때문에 다음 포스팅에 로그인을 해야 글쓰기 버튼을 할 수 있도록 스스로 수정해볼 것이다.
  • 위쪽 세션을 통해 userID를 받았고, 넘어온 title과 content, 이렇게 3가지로 bbsDAO의 wirte 메서드를 호출한다.
  • 반환 값에 따라 알림과 이동을 시켜주도록 하자.

 


 

** writeDAO.jsp

package bbs;

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

public class BbsDAO {

		//데이터베이스를 접근하게 해주는 객체.
		private Connection conn;
		//쿼리를 실행시키고 결과값을 내는 객체.
		private ResultSet rs;
		
		public BbsDAO() {
			try {
				String dbURL = "jdbc:mysql://localhost:3306/DONG_BBS";
				String dbID = "root";
				String dbPassword = "1111";
				Class.forName("com.mysql.jdbc.Driver");
				conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		public int write(String bbstitle, String userID, String content) {
			
			String sql = "INSERT INTO BBS VALUES( ? , ? , ? , ? , ? , ?) "; 
			try {
				PreparedStatement pst = conn.prepareStatement(sql);
				pst.setInt(1, getNext());
				pst.setString(2, bbstitle);
				pst.setString(3, userID);
				pst.setString(4, getDate());
				pst.setString(5, content);
				pst.setInt(6, 1);
				//insert는 업데이트시 1을 반환함.
				return pst.executeUpdate();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return -1; //데이터베이스 오류
		}
}

					......

 

  • 어느 때와 같이 생성자에서 jdbc연결을 먼저 해준다.
  • 인자로 넘겨받은 title, userID, content를 바탕으로 insert문의 sql 쿼리를 짜준다.
  • 넘겨받은 인자들을 꽂아줘야하니 당연히 preparedStatement를 쓴다.
  • 등록 날짜와 등록할 글의 번호는 넘겨받지 않았으니 만들어줘야한다. 
  • 6번째 ?는 Available인데 1이 보여짐, 0이 삭제되어 안보여짐으로 만들 것이므로 등록할 땐 1을 넣어준다.

 

//등록 날짜를 위한 현재 날짜 반환 메서드 
public String getDate() {
		
	String sql = "SELECT NOW()"; 
	try {
		PreparedStatement pst = conn.prepareStatement(sql);
		rs = pst.executeQuery();
		if(rs.next()) {
			return  rs.getString(1);
		}			
	} catch (Exception e) {
		e.printStackTrace();
	}
	return "";
}

 

  • MySQL에는 현재 날짜를 구한 함수 now()가 있다. 이를 통해 현재 날짜 시간을 구하여 반환하여 준다.
  • 개인적으로 이 부분은 굳이? 라는 생각이 들긴 했다. 왜냐하면 DB에 자주 접근해도 괜찮은가? 라는 생각이 들어서인데 이 부분도 다음 포스팅에서 간단하게 수정해볼 것이다.

 

//마지막 글 번호 알아내서 다음 글 번호 만드는 메서드
public int getNext() {
	
	String sql = "SELECT bbsID FROM BBS ORDER BY bbsID DESC"; 
	try {
		PreparedStatement pst = conn.prepareStatement(sql);
		rs = pst.executeQuery();
		if(rs.next()) {
			//다음 글 번호 = 현재 글 번호 +1
			//bbsID로 내림차순 했기 때문에 가장 최근의 글이 제일 위에 있다.
			return  rs.getInt(1) +1;
		}
		return 1;//첫게시물인 경우
	} catch (Exception e) {
		e.printStackTrace();
	}
	return -1; //데이터베이스 오류
}
  • select문을 통해 글 번호를 기준으로 내림차순을 하면 가장 최근 글이 제일 위로 올라오기 때문의 그 튜플의 글번호 bbsID를 가져온다.
  • 그리고 작성 중인 글은 그것의 다음 번호가 되야하므로 +1을 해주고 반환시켜준다.
  • 예전에 배울 땐 글의 번호의 경우 자동으로 증가 시켜주는 시퀀스를 쓰긴 했었다. 찾아보니 mySQL도 시퀀스가 있는데 이건 다음에 시도해봐야겠다.
  • 하지만 이렇게 자바코드로 증가시켜주는 것도 좋은 것 같다.

 

 


 

 

 

** 결과화면

 

로그인 없이 글쓰기 시도

 

 

로그인하라는 창과 함께 로그인 페이지로 이동

 

로그인 후 다시 글쓰기 시도

 

등록 성공!

 

DB에도 정상적으로 등록됨