카테고리 없음
[JSP] 10강 - 글쓰기 기능 구현
Egu99
2021. 3. 11. 17:58
본 포스팅은
정보 제공용이 아닌
유튜브 동빈나님의 JSP 게시판 만들기 강좌 10강을
바탕으로 보고 배운 것을 직접 정리해본 포스트 입니다.
** 이번 강좌에선 글쓰기 기능을 구현해보았다.
따라 구현하면서 어? 이부분은 이렇게 안해도 될 거 같은데, 이렇게 하는 게 좋을 거 같은데, 이런 게 추가되면 좋을 것 같아 라는 생각이 많이 들었다. 아마도 그동안 인터넷을 통해 많이 경험했던 글쓰기라 더욱 그랬던 거 같다.
인터페이스적인 부분은 나중에 추가해도 상관없는 것이고 일단 동작에 중점을 두었다.
** 프로세스
- write.jsp에서 제목과 내용을 form 방식으로 writeAction.jsp 보낸다.
- writeAction.jsp에서는 Bbs라는 VO 클래스를 토대로(?) 자바빈즈로 만들어주고 bbsDAO에서 글쓰기 메서드인 wrtie()를 호출한다.
- 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도 시퀀스가 있는데 이건 다음에 시도해봐야겠다.
- 하지만 이렇게 자바코드로 증가시켜주는 것도 좋은 것 같다.
** 결과화면