티스토리 뷰

Web-Back-End/jsp

답변형 게시판

vkein 2009. 8. 9. 18:49
계층형 게시판의 경우 최근 답변이 위로 올라오는 형태를 많이 보았다.  하지만 내가 보기에는 아래로 나열 되는 것이 훨씬 더 추적(?) 하기 쉽게 느껴졌다. 최신 답변이 위로 올라올 경우 로직상 편리함이 있다는 사실은 알고 있지만 어자피 유저는 로직따위에는 관심이 없다. 화면에 어떻게 보여지는가 중요하다는 것.. 잡소리는 그만하고 구현 방법에 대해 연구해 보려 한다. 

일단 설명을 자세히 쓴다고 했지만 내용이 이해가지 않는 사람(?) 있을 것이다. (없을 것이라 믿는다... )
그럼 데이터베이스에 그냥 테스트 해보자 그럼 어떤 원리인지 대충 감이 올 것이다
데이터베이스 영역만 회색으로 표시를 해두었다. 무조건 날려보자 하나씩..  

CREATE TABLE BOARD(
BOARD NUMBER NOT NULL,
BGROUP NUMBER NOT NULL,
SORTS NUMBER NOT NULL,
DEPTH NUMBER NOT NULL,
SUBJECT VARCHAR(255)
);

 BOARD BGROUP  SORTS  DEPTH  SUBJECT
         

간단하게 5개가 필요하다  
board : 고유번호
bgroup : 그룹
sorts : 정렬
depth : 깊이
subject : 제목

기본적으로 두개를 추가해본다. 

INSERT INTO BOARD VALUES ('1', '1', '0','0','1번글'); 
INSERT INTO BOARD VALUES ('2', '2', '0','0','2번글');

 board  bgroup  sorts  depth  subject
 1  1  0  0 1번글
 2  2  0  0 2번글

리스트 쿼리를 통해 보도록 하겠다. 

SELECT * FROM BOARD ORDER BY BGROUP DESC, SORTS ASC

 board  bgroup  sorts  depth  subject
 2  2  0  0 2번글
 1  1  0  0 1번글

이제 시작이다. 조회를 할때는 위에 SELECT문으로 조회하자

자 이제 답변에 따라서  2가지로 나눠 진다. 
1. 최신글이 위로 올라가는 형태
2. 최신글이 아래로 내려가는 형태 (1번을 무시하고 봐도 무방!)

1. 답변 최신글이 위로 올라가는 형태

* 공식
1.UPDATE BOARD SET SORTS = SORTS + 1 
  WHERE BGROUP =  (원글의 BGROUP)  AND SORTS >(원글의 SORTS)
2. INSERT INTO BOARD VALUES
   (번호, (원글의 BGROUP), (원글의 SORTS +1), (원글의 DEPTH +1) ,'
 제목')

이렇게 두가지만 해주면 된다. 이해를 위해 따라 해보자
2번글(원글)에 대해서 답변을 달아 보겠다. 
필요한 것은 2번글에 대한 bgroup, sorts, depth에 대한 정보가 필요하다.  비교적 간단하다. 

INSERT INTO BOARD VALUES ('3','2','1','1','2번글 - 1')

bgroup : 2번글과 동일
sorts : 2번글 + 1
depth : 2번글 + 1 을 해준다. 

 BOARD  BGROUP  SORTS  DEPTH  SUBJECT
 2  2  0  0  2번글
 3  2  1  1  2번글 - 1
 1  1  0  0  1번글

하나더 추가해보자 

*INSERT문 하기 전 반드시 해주어야 할 것이 있다. 바로 SORTS는 증가 시켜야 한다는 것이다. 

UPDATE BOARD SET SORTS = SORTS + 1 WHERE BGROUP =  2  AND SORTS > 0

2번글 GROUP과  SORT를 정보를 가지고 UPDATE 시킨다. 

INSERT INTO BOARD VALUES ('4','2','1','1','2번글 -2')

 board  bgroup sorts depth subject 
 2  2  0  0  2번글
 4  2  1  1  2번글-2
 3  2  2  1  2번걸-1
 1  1  0  0  1번글

공식은 나왔다.  깊이도 상관없이 잘 된다. 테스트를 위해 데이터를 더 집어 넣고 확인해보자

UPDATE BOARD SET SORTS = SORTS + 1 WHERE BGROUP =  2  AND SORTS > 1;
INSERT INTO BOARD VALUES ('5','2','2','2','2번글-2-1');

 board  group  sort  depth  subject
 2  2  0  0  2번글
 4  2  1  1  2번글-2
 5  2  2  2  2번글-2-1
 3  2  3  1  2번글-1
 1  1  0  0  1번글

UPDATE BOARD SET SORTS = SORTS + 1 WHERE BGROUP =  2  AND SORTS > 3;
INSERT INTO BOARD VALUES ('6','2','4','2','2번글-1-1');

 board  bgroup  sorts  depth  subject
 2  2  0  0  2번글
 4  2  1  1  2번글-2
 5  2  2  2  2번글-2-1
 3  2  3  1  2번글-1
 6  2  4  2  2번글-1-1
 1  1  0  0  1번글

흠... 간단하군.. 

2. 답변 최신글이 아래로 내려가는 형태
  우선 이야기하자면 약간 복잡하다. 일단 공식을 보자 

*공식
1. SELECT NVL(MIN(SORTS),0) FROM BOARD
   WHERE  BGROUP = (원글의 BGROUP)
   AND SORTS > (원글의 SORTS)
   AND DEPTH <= (원글의 DEPTH)

2-1. 1번이 0 일 경우 

3. SELECT NVL(MAX(SORTS),0) + 1 FROM BOARD 
    WHERE BGROUP = (원글의 BGROUP);

4. INSERT INTO BOARD VALUES 
   (번호, (원글의 BGROUP), (3번값), (원글의 DEPTH +1) ,' 제목')

2-2. 1번이 0이 아닐 경우 

3. UPDATE BOARD SET SORTS = SORTS + 1 
  WHERE BGROUP =  (원글의 BGROUP)  AND SORTS >= (1번값)

4. INSERT INTO BOARD VALUES 
   (번호, (원글의 BGROUP), (1번값), (원글의 DEPTH +1) ,' 제목')

1번에 따라 2단계로 나눠진다. 말하자면 1번에서 SORTS를 구하는 것이다. 
만약 0일 경우 맨 마지막 오는 경우이다.
아닐 경우 중간에 넣는 것인데 중간이후에 있는 다른 것들을 SORTS를 1씩 더해주고 넣는 것이다.

일단 답변이 위로 가는 것을 해보신 분들을 위해서 DELETE문이 있다. 안 해본신 분은 살짝 무시해주자.

DELETE FROM BOARD WHERE SORTS > 0

시작이다. 시작 전에 SELECT문은 이 형태이다. 

SELECT * FROM BOARD ORDER BY BGROUP DESC, SORTS ASC

 board  bgroup  sorts  depth  subject
 2  2  0  0 2번글
 1  1  0  0 1번글

2번글에 대한 답변을 달겠다.

SELECT NVL(MIN(SORTS),0) FROM BOARD
   WHERE  BGROUP = 2
   AND SORTS > 0
   AND DEPTH <= 0

0이 나오는 경우이다. 2-1의 공식으로 진행되어야 한다. 

SELECT NVL(MAX(SORTS),0) + 1 FROM BOARD WHERE BGROUP = 2;

처음 답글이라 수행할 필요없는 구문이지만 우리는 알 수가 없다. 1이 나온다. 이것이 답글이 SORTS가 되는 것이다.

INSERT INTO BOARD VALUES (3, 2, 1, 1 ,'2번글-1')

bgroup : 원글의 bgroup
sorts : 계산한 값
depth : 원글의 depth+1

 board bgroup  sorts  depth  subject 
 2  2  0  0  2번글
 3  2  1  1  2번글-1
 1  1  0  0  1번글

2번글에 대하여 또다시 답글을 달아보자

SELECT NVL(MIN(SORTS),0) FROM BOARD
   WHERE  BGROUP = 2
   AND SORTS > 0
   AND DEPTH <= 0;

SELECT NVL(MAX(SORTS),0) + 1 FROM BOARD WHERE BGROUP = 2;

INSERT INTO BOARD VALUES (4, 2, 2, 1 ,'2번글-2');

물론 0이 나와 2-1 공식에 따르게 된다. 

 board  bgroup sorts  depth  subject 
 2  2  0  2번글
 3  2  1  2번글-1
 4  2  2   2번글-2
 1  1  0  0  1번글

이제 '2번글-1' 에 대한 답변을 달아 보겠다. 

SELECT NVL(MIN(SORTS),0)
FROM BOARD WHERE  BGROUP = 2
AND SORTS > 1
AND DEPTH <= 1;

2가 나올 것이다. 이럴 경우 2-2공식을 이용해야 한다. 빨간색부분을 유의하자 같은 것보다 큰 것이다.

UPDATE BOARD SET SORTS = SORTS + 1 
WHERE BGROUP = 2  AND SORTS >= 2

즉 2번글-2 의 sorts 번호를 올려주고 중간에 밀어 넣는 것이다. 

INSERT INTO BOARD VALUES (5, 2, 2, 2 ,'2번글-1-1')

bgroup : 2번글-1 의 bgroup  
sorts : 계산값
depth : 2번글-1의 depth + 1

 board  bgroup  sorts  depth  board
 2  2  0   0  2번글
 3  2  1  1  2번글-1
 5  2  2  2  2번글-1-1
 4  2  3  1  2번글-2
 1  1  0  0  1번글

board 번호 3번과 4번 사이에 밀어 넣음을 알 수 있다.  

가장 궁금한 것은 공식을 나누는 1번 공식일 것이다. 

SELECT NVL(MIN(SORTS),0) FROM BOARD
   WHERE  BGROUP = (원글의 BGROUP)
   AND SORTS > (원글의 SORTS)
   AND DEPTH <= (원글의 DEPTH)

자세히 보면 원글의 답글의 SORTS 큰 것 중에서 DEPTH 깊은 것을 제하고 가장 작은 SORTS값을 구하는 것이다. 
설명하기가 나의 실력으로는 이해하기 힘들다. 그냥 쓴다.  

더 나은 설명이나 더 좋은 게시판 로직이 있으면 알려주시기 바라면서 이렇게 글을 쓴다. 특히 아래로 떨어지는 것에 대한 게시판 로직이 좀 더 편한 방법이 없는지 궁금하다. 위아래로 떨어지는 방식에 대해서 성능상 이슈나 뭐 그런것에 대하여 태클은.... 어자피 내가 만든 로직도 아니니.. 친철한 설명으로 가르쳐주실 바라며 글을 마친다.  





댓글
  • 프로필사진 넷기어 전체 소스좀 볼수 없을까요? 2016.02.04 11:04
  • 프로필사진 개린이 감사합니다 ^^
    덕분에 해결했습니당

    공식부분에 정리를 잘해놓으셔서 쉽게해결했어요~
    2020.04.13 13:41
  • 프로필사진 코린이 감사합니다...DEPTH <= (원글의 DEPTH) < 요게 핵심이군요...
    혼자서 머리 굴리면서 구현해봐도 저부분을 정확히 세팅을 안하니까 처음엔 괜찮다가 답글을 많이 달면 중간에 엉키더라고요
    덕분에 해결했습니다^^
    2020.11.11 14:17
  • 프로필사진 Thanks 정말 너무 감사합니다. 대대대댓글 관련해서 엄청 헤메다 님의 글을 보고 문제를 해결했습니다.
    진짜 이런데 글 안 남기는데... 너무 감사해요~~~ 덕분에 오늘은 잘 수 있을거 같습니다. ㅎㅎㅎ
    2021.01.13 01:39
댓글쓰기 폼
공지사항