today_is

[ jsp ] 회원 + 게시판 + 댓글 본문

java

[ jsp ] 회원 + 게시판 + 댓글

ye_rang 2023. 12. 16. 22:24

오늘의 목표

회원, 게시판, 댓글 테이블을 만들어서 게시판을 만들어보자 


 

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 를 이용하면 되겠다는 생각이 들었다 !!

 

항상 실제 사이트에서는 어떻게 기능이 구현되는지를 염두하면서 코드를 작성해야겠다