Dev.GA

[spring/게시판] #7 계층형 게시판(답글달기) 본문

Dev.Project/project1-spring게시판

[spring/게시판] #7 계층형 게시판(답글달기)

Dev.GA 2018. 3. 9. 02:31



개발환경

Server OS : Windows10

Language : JAVA 1.6

Framework : Spring 3.1.1

WEB Server : Apache 

WAS Server : Tomcat 7

build tool : maven 2.5.1

DB : MySQL 5.7.16

ORM : mybatis 3.2.7


7. 계층형 게시판(답글달기)



이번 포스팅은 지난번에 말한대로 계층형 게시판, 즉 원글에 답글기능을 추가하도록 해보겠다.


계층형 게시판은 특별하게 어려운점은 없고 간단한 테이블 구조 변경과 쿼리를 통해서 구현할 수 있다.


고민스러운 부분은 답글을 계속 추가될때 최신 답글을 밑으로 보내냐 아니면 최신 답글이 제일 위로 올라와야 하는 것인데...


뭐가 맞는건지는 잘 모르겠다. 이것에 따라 방법이 조금은 다를것이다....


뭐 어쨌든... 직접 답글을 달면서 확인해보자.



7-1. 테이블 구조 변경하기


테이블 구조를 변경하기전 먼저 추가해야할 필드를 보겠다.


BoardVO.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class BoardVO extends PageVO{
    
    /** 글 번호 **/
    private int code;
    
    /** 글 제목 **/
    private String title = "";
    
    /** 글 내용 **/
    private String content = "";
    
    /** 작성자 **/
    private String writer = "";
    
    /** 등록시간 **/
    private String reg_datetime = "";
    
    /*
     * 계층형 게시판을 위한 추가 필드
     * originNo, groupOrd, groupLayer 
     */
    
    /** 원글 번호 **/
    private int originNo;
    
    /** 원글(답글포함)에 대한 순서 **/
    private int groupOrd;
 
    /** 답글 계층 **/
    private int groupLayer;
}
cs


추가된 필드를 살펴보자.


- originNo : 원글번호, 답변을 단 원래 글(부모글)의 번호, 여기서는 code가 되며 원글의 경우 본인의 code값을 가진다.


- groupOrd : 원글과 답글(과 답글의 답글)들은 originNo로 묶일것이다. 이것을 하나의 그룹으로 봤을때 그룹내의 순서를 의미한다.


- groupLayer : 원글에 대한 답글인지, 답글에 대한 답글인지를 구분하는 계층을 의미한다.


추가된 필드에 맞게 테이블을 수정해준다.


1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `board` (
  `code` INT(10NOT NULL AUTO_INCREMENT,
  `originNo` INT(10DEFAULT NULL,
  `groupOrd` INT(10DEFAULT NULL,
  `groupLayer` INT(10DEFAULT NULL,
  `title` VARCHAR(250DEFAULT NULL,
  `content` LONGTEXT,
  `writer` VARCHAR(50DEFAULT NULL,
  `reg_datetime` DATETIME DEFAULT NULL,
  PRIMARY KEY (`code`)
ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
cs



7-2. 원글에 답글달기


원글에 답글을 달아보겠다.


우선, 현재 3개의 글이 있다.


위의 3개의 글에 대한 테이블을 조회해 보겠다.


3개의 글 전부 원글이기때문에 originNo는 글번호(code값)과 동일하며, 그룹내 순서(groupOrd)와 groupLayer는 원글이기에 모두 0으로 지정하였다. 글로 설명하려니 전달에 어려움이 있을것 같아 직접 답글을 작성해보겠다.


2번째 글에 답글을 달아보자.



답글은 원글의 originNo값을 그대로 originNo로 가져가며 원글에 속하는 그룹으로 묶였다는 의미를 가진다.

그대로 가져가는 이유는 원글은 originNo과 글번호인 code값이 동일하기 때문이다.


originNo를 그룹이라는 기준으로 그룹내 순서(groupOrd)는 원글의 다음에 위치함으로 원글+1이 되며 원글의 답글이라는 의미로 groupLayer(계층)도 원글+1이 된다.


다음과 같은 원리로 원글에 대한 답글이 추가된다.


code(글번호)

originNo(그룹) 

groupOrd(그룹내 순서) 

groupLayer(계층) 

 auto Increment 

 원글의 originNo값 

 원글 + 1 

 원글 + 1 


비교를 위하여 원글에 답글을 하나 더 작성해 보겠다.



7-3. 원글에 답글을 하나 더 추가로 작성한다.


2번째 글에 답글을 하나 더 추가해본다.



새로운 답글이 상단에 위치하는 구조이기 때문에 새로운 답글의 groupOrd가 원글+1이 되어 기존 답글의 groupOrd를 수정해주어야 한다.


update board set groupOrd = groupOrd + 1 where originNo = #{originNo} and groupOrd > #{groupOrd}


여기서 #{originNo}와 #{groupOrd}는 원글의 데이터를 가져온다.


7-4. 답글에 답글을 달아보자.


5번글(최신답글)에 답글을 달아보자.



답글을 달때 원글의 제목 앞에 "RE : "를 붙여주기 때문에 답글에 답글은 앞에 "RE : "가 2번 붙었다.


답글에 답글을 달때는 원글이라는 표현이 부모글에 해당되게 된다.


코드가 변한건 없다. 위의 표를 다시보자.


code(글번호)

originNo(그룹) 

groupOrd(그룹내 순서) 

groupLayer(계층) 

 auto Increment 

 원글의 originNo값 

 원글 + 1 

 원글 + 1 


code : 자동증가


originNo : 부모글(5번)의 originNo값인 2가 된다.


groupOrd : 부모글(5번)의 groupOrd값인 1에 +1이 되어 2가 되며, 기존의 groupOrd값이 2인 값은 동시에 +1 이 추가되어 순서가 밀린다.


groupLayer : 원글에 대한 답글이 아닌 답글(부모글)에 대한 답글이기 때문에 부모글의 groupLayer값에 +1이 된다.


이런 방법으로 원글에 답글을 달때, 답글에 답글을 달때 모두 같은 방법으로 계층형 게시판을 작성할 수 있다.



7-5. 리스트


이제 마지막으로 화면을 통해 확인해보자.


DB에서 게시판 데이터를 조회 할 때 정렬만 다시 해주면 우리가 원하는 리스트 화면을 볼 수 있다.


SELECT * FROM board

ORDER BY originNo DESC, groupOrd ASC


원글에게는 code값이나 originNo값이나 같은 데이터이기 때문에 그룹의 기준이 되는 originNo로 내림차순 정렬하고,

그룹내에서는 최신글을 뜻하는 그룹내 순서(groupOrd)로 오름차순 정렬해주면 된다.


화면을 통해 확인하자.


이번 포스팅에서는 계층형 게시판에 대한 포스팅을 진행하였다.


소스코드에 많은 수정이 없었는데, 사실 계층형 게시판은 DB구조와 쿼리만 조금 만져주면 간단하게 구현할 수 있다.


그럼...






Comments