티스토리 뷰
일단 설명을 자세히 쓴다고 했지만 내용이 이해가지 않는 사람(?) 있을 것이다. (없을 것이라 믿는다... )
그럼 데이터베이스에 그냥 테스트 해보자 그럼 어떤 원리인지 대충 감이 올 것이다
데이터베이스 영역만 회색으로 표시를 해두었다. 무조건 날려보자 하나씩..
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)
1.UPDATE BOARD SET SORTS = SORTS + 1
WHERE BGROUP = (원글의 BGROUP) AND SORTS >(원글의 SORTS)
2. INSERT INTO BOARD VALUES
(번호, (원글의 BGROUP), (원글의 SORTS +1), (원글의 DEPTH +1) ,' 제목')
(번호, (원글의 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 | 0 | 2번글 |
3 | 2 | 1 | 1 | 2번글-1 |
4 | 2 | 2 | 1 | 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
공지사항