[JSP] 게시판 (2)
2024. 10. 7. 19:26ㆍJSP
이번에는 게시판 댓글 기능까지 추가하여 구현을 해보자.
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 |