[JSP] 게시판 (2)

2024. 10. 7. 19:26JSP

이번에는 게시판 댓글 기능까지 추가하여 구현을 해보자.


Reply 테이블

컬럼명 null 여부 데이터 타입 참조  
IDX NOT NULL NUMBER   primary key
BOARD_IDX NOT NULL NUMBER board 테이블의 idx를 참조  
WRITER NOT NULL VARCHAR2(500) member 테이블의 userid 참조  
CONTENT NOT NULL VARCHAR2(2000)    
WRITEDATE   DATE    

 

ReplyDTO

getter, setter 생성

 

ReplyDAO

댓글 기능 구현 함수들을 작성해준다.

public class ReplyDAO {

	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Context init;
	private DataSource ds;
	
	private static ReplyDAO instance = new ReplyDAO();
	
	public static ReplyDAO getInstance() {
		return instance;
	}
	
	private ReplyDAO() {
		try {
			init = new InitialContext();
			ds = (DataSource) init.lookup("java:comp/env/jdbc/oracle");
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	private void close() {
		try {
			if(rs != null) 		rs.close();
			if(pstmt != null) 	pstmt.close();
			if(conn != null) 	conn.close();
		} catch(SQLException e) {}
	}
	
	// 게시글 번호를 전달받아서, 해당 게시글에 달린 댓글 목록을 불러오는 함수
	public List<ReplyDTO> selectList(int board_idx) {
		ArrayList<ReplyDTO> list = new ArrayList<>();
		String sql = "select * from reply where board_idx = ? order by idx";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, board_idx);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				ReplyDTO dto = new ReplyDTO();
				dto.setBoard_idx(rs.getInt("board_idx"));
				dto.setContent(rs.getString("content"));
				dto.setIdx(rs.getInt("idx"));
				dto.setWriteDate(rs.getDate("writeDate"));
				dto.setWriter(rs.getString("writer"));
				list.add(dto);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { close(); }
		return list;
	}
	
	
	// 댓글 작성
	public int insert(ReplyDTO dto) {
		int row = 0;
		String sql = "insert into reply (board_idx, writer, content) values (?, ?, ?)";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, dto.getBoard_idx());
			pstmt.setString(2, dto.getWriter());
			pstmt.setString(3, dto.getContent());
			row = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace(); 
		} finally { close(); }
		return row;
	}
	
	// 댓글 삭제
	public int delete(ReplyDTO dto) {
		int row = 0;
		String sql = "delete from reply where idx = ? and writer = ?";
		try {
			conn = ds.getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, dto.getIdx());
			pstmt.setString(2, dto.getWriter());
			row = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { close(); }
		return row;
	}	
}

 

reply-write.jsp

게시글 상세 페이지에 댓글 달기 기능이 있기 때문에 replyDAO 에 있는 insert() 함수를 이용해서 댓글을 추가생성하고 나면,

댓글을 달았던 해당 게시물로 리다이렉트 시킨다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<jsp:useBean id="dto" class="reply.ReplyDTO" />
<jsp:setProperty property="*" name="dto" />

<c:set var="row" value="${replyDAO.insert(dto) }" />
<c:redirect url="/view.jsp?idx=${dto.board_idx }#reply" />

</body>
</html>

 

reply-delete.jsp

 댓글 삭제시 유의할 점

댓글을 삭제하기 위해서는 reply의 PK에 해당하는 idx값이 필요하다.
delete from reply where idx = ?

 

현재 로그인 사용자 본인의 댓글이 아니면 삭제되지 않게끔 코드를 추가해 준다.
delete from reply where idx = ? and writer = ?


삭제 프로세스가 끝나면, 게시글 보기 페이지로 이동(이동하기 위해서 board의 idx가 필요하다)
redirect url="board.jsp"
redirect url="view.jsp"

 

결론) 삭제할 댓글의 idx, 이동할 게시글의 idx 2개가 필요하다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>

<jsp:useBean id="dto" class="reply.ReplyDTO" />
<jsp:setProperty property="*" name="dto" />
<jsp:setProperty property="writer" name="dto" value="${login.userid }" />

${replyDAO.delete(dto) }

<c:redirect url="/view.jsp?idx=${param.board_idx }" />
 

</body>
</html>

 


댓글 삭제 기능을 구현 하면서 처음에는 idx만으로 해보려고 하니까,

자신의 댓글이 아닌 다른 댓글이 삭제되는 경우가 더러 생겼다.

 

이를 해결하기 위해서 login.userid로 자신의 댓글을 추출하여 삭제 기능을 구현하였다.

 

에러가 발생하는 것이 이제는 더 나의 흥미를 자극하는 것 같다.

왜 이러한 에러가 발생했는지 생각을 하면서 해결해 나가는 것이 진정한 코딩의 재미라고 할 수 있지 않을까..?

'JSP' 카테고리의 다른 글

[JSP] MVC - 페이징 및 검색  (5) 2024.10.09
[JSP] MVC  (1) 2024.10.09
[JSP] 게시판 (1)  (0) 2024.10.07
[JSP] 회원 기능 (2)  (0) 2024.10.07
[JSP] 회원 기능 (1)  (0) 2024.10.05