[JSP] JSP 게시판 답변 기능 추가하기
Oracle DB Table 구성
--------- -------- --------------
B_NAME VARCHAR2(20)
B_EMAIL VARCHAR2(50)
B_TITLE VARCHAR2(80)
B_CONTENT VARCHAR2(3000)
B_ID NOT NULL NUMBER(5)
B_DATE TIMESTAMP(6)
B_HIT NUMBER(5)
B_PWD VARCHAR2(12)
B_IP VARCHAR2(15)
B_REF NUMBER(5)
B_STEP NUMBER(5)
B_LEVEL NUMBER(5)
게시판에서 답변 기능 추가를 위한 Column인 B_ref , B_step , B_level을 통해 답변 기능을 만든다.
주요 로직은 다음과 같다.
게시글 번호가 100번인 특정 게시글 A에 답변 A1을 작성하면 ,
답변 A1 게시글은 참조번호(B_ref) = 100, B_level(답변 단계) = 1, B_step(답변글 게시 순서)= 1로 할당된다.
즉, B_ref는 어떠한 게시글의 답변인지를 나타내기때문에 원 게시물의 ref 값을 가져와 할당한다.
B_level은 답변이 1번이면 1, 답변의 답변이면 2,....식으로 답변의 작성 횟수에 따라 1씩 증가 시킨다.
B_Step는 원 게시글을 0이라고 했을때, 1씩 순차적으로 증가시킨다.
이러한 로직에 따라 PrepareStatement 메소드 쿼리문을 작성해서 DB에 추가한다.
public int insertBoard(BoardBean board) {
Connection conn= null;
DataSource ds=null;
PreparedStatement pstmt = null;
ResultSet rs;
int re = -1; //초기값 -1, insert 정상실행시 1
int number;
String sql = "";
String sql3 = "";
// 답변글을 위한 변수
int id = board.getB_id();
int ref = board.getB_ref();
int step = board.getB_step();
int level = board.getB_level();
System.out.println("step :"+step);
System.out.println("level :"+level);
try {
conn = getConnection();
String sql2 = "select max(b_id) from board";
pstmt=conn.prepareStatement(sql2);
rs = pstmt.executeQuery();
if(rs.next()) {
number = rs.getInt(1)+1;
}else {
number = 1;
}
if(id!=0) { // id가 0이 아니면 글번호를 가지고 오는 경우 답변글이다.
// 기존 글 업데이트
sql3 = "UPDATE board SET b_step=b_step+1 WHERE b_ref=? and b_step > ?";
pstmt= conn.prepareStatement(sql3);
pstmt.setInt(1, ref);
pstmt.setInt(2, step);
pstmt.executeUpdate();
step = step+1;
level = level+1;
}else { //신규글
ref=number;
step=0;
level=0;
}
sql = "insert into board values(?,?,?,?,(select nvl(max(b_id),0)+1 from board),?,?,?,?,?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setString(1,board.getB_name());
pstmt.setString(2,board.getB_email());
pstmt.setString(3,board.getB_title());
pstmt.setString(4,board.getB_content());
pstmt.setTimestamp(5, board.getB_date());
pstmt.setInt(6, board.getB_hit());
pstmt.setString(7,board.getB_pwd());
pstmt.setString(8,board.getB_ip());
pstmt.setInt(9,ref);
pstmt.setInt(10,step);
pstmt.setInt(11,level);
re = pstmt.executeUpdate();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
try {
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
}catch(SQLException se) {
se.printStackTrace();
}
}
return re;
}
가장 먼저 글 작성 JSP 페이지(이하 Write.jsp)에 답변글 작성하기 버튼을 만들고, 해당 게시글의 id값을 쿼리스트링으로 넘겨준다.
이후, 다음의 insertBoard 메소드에서 넘어온 id값의 유무를 통해 답변 글인지. 신규 글인지 판단한다.
매개변수 Board 객체에 id값이 담겨져 넘어왔다면 해당 게시글은 답변글 이므로,
해당 ref 값이면서(And) 넘어온 b_step값보다 큰 게시물들의 step값을 1씩 증가시킨다.
이후, step와 level값들을 1씩 증가시켜준다.
해당 로직은 숫자를 넣어보면 이해하기 쉽다.
즉, 게시글이 ref= 1, step = 0 , level = 0 인 게시글에 답변글을 달면
답변글의 ref = 1, step = 1 , level = 1 이다.
step,level 는 step = step+1; level=level+1 이후 insert 쿼리문에 의해 1 이 할당되기 때문이다.
다시한번 답변의 답변글을 작성한다면,
답변글의 ref = 1, step = 1 , level = 1 인 게시글에 대한 답변글 이므로
ref = 1 , step=2, level = 2 이다. ( level = level+1에서 답변의 답변은 초기 level값 1 )
그리고 원 게시글의 다른 사람이 답변을 단다면,
원 게시글은 ref= 1, step = 0 , level = 0
새로운 답변글 값이 ref = 1, step = 1 , level = 1 가 되고, "b_step > ?" 쿼리 조건에 의해 기존의 나머지 댓글들은 step값이 1씩 추가되므로, 다음과 같다.
이러한 방식으로 DB값을 할당한 뒤, 게시글 list를 출력할때,
ORDER BY 를 통해 B_Step값을 내림차순, B_level 값을 오름차순으로 정렬한뒤
(<img> 태그를 통해 답변글 이미지를 넣어줘도 된다.) List 출력을 하게되면 아래와 같이 출력된다.