today_is
[ 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
: 댓글기능과 관련된 함수들
package reply;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
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>
study_review
추가한 로직
: <jsp:setProperty property="writer" name="dto" value="${login.userid }" />
댓글 삭제 기능을 구현할때 많은 어려움이 있었다.
처음에는 별 생각 없이 댓글의 idx 만을 이용하여
댓글 삭제를 진행하였는데, 나의 댓글이 아닌 경우에도 삭제되어버렸다
나의 댓글일때만 삭제 될 수 있도록 로직을 추가하고자 하였고
writer를 가장 단순하게 추출할 수 있는 방법을 모색하다가
login.userid 를 이용하면 되겠다는 생각이 들었다 !!
항상 실제 사이트에서는 어떻게 기능이 구현되는지를 염두하면서 코드를 작성해야겠다
'java' 카테고리의 다른 글
[ jsp ] MVC패턴 - Servlet 활용, 게시판 페이징 및 검색 (0) | 2023.12.25 |
---|---|
[ jsp ] MVC 패턴 (0) | 2023.12.24 |
[ jsp ] 회원 + 게시판 (0) | 2023.12.14 |
[ jsp ] 회원기능 구현 (2) - 수정, 삭제 (0) | 2023.12.12 |
[ jsp ] 회원기능 구현 (1) - 회원가입, 로그인, 로그아웃 (0) | 2023.12.12 |