1. 설계 개요
1-1. 주요 필드 정의
필드명 | 설명 |
seq | 글번호(순서). 게시판의 모든 글(댓글, 답글 포함)에 대해 고유한 번호. 자동 증가 (AUTO_INCREMENT). |
grp | 글그룹. 하나의 글과 그에 속한 모든 답글이 동일한 grp 값을 가짐. |
grps | 그룹 내 순서. 같은 그룹(grp) 내에서의 정렬 순서를 나타냄. |
grpl | 그룹 내 깊이. 댓글은 0, 답글은 1 이상으로 계층적 깊이를 나타냄. |
2. 테이블 구조
2-1. 테이블 생성
rep_board1 테이블은 댓글과 답글을 포함한 계층적 데이터를 관리합니다.
CREATE TABLE rep_board1 (
seq INT AUTO_INCREMENT PRIMARY KEY, -- 고유 글번호
grp INT NOT NULL, -- 글그룹 번호
grps INT NOT NULL, -- 그룹 내 순서
grpl INT NOT NULL, -- 그룹 내 깊이
subject VARCHAR(150) NOT NULL, -- 제목
writer VARCHAR(12) NOT NULL, -- 작성자
mail VARCHAR(50), -- 이메일
password VARCHAR(41) NOT NULL, -- 비밀번호
content VARCHAR(2000), -- 내용
hit INT NOT NULL DEFAULT 0, -- 조회수
wip VARCHAR(15) NOT NULL, -- 작성자 IP
wdate DATE NOT NULL DEFAULT CURDATE()-- 작성일
);
3. SQL 로직
3-1. 모글 삽입
모글은 새로운 그룹으로 추가되며, grp 값은 seq와 동일합니다.
INSERT INTO rep_board1 (grp, grps, grpl, subject, writer, mail, password, content, hit, wip, wdate)
VALUES (LAST_INSERT_ID() + 1, 0, 0, '모글 제목', '작성자', 'test@example.com', PASSWORD('1234'), '모글 내용', 0, '127.0.0.1', CURDATE());
3-2. 답글 삽입
답글은 부모 글의 grp와 동일한 그룹에 추가되며, 부모 글의 순서를 기준으로 정렬합니다.
1. grps 값 조정
부모 글의 grps보다 큰 값을 가진 모든 글의 grps를 +1 증가시킵니다.
UPDATE rep_board1
SET grps = grps + 1
WHERE grp = ? AND grps > ?;
2. 답글 삽입
부모 글의 grp, grps, grpl 값을 기반으로 답글을 삽입합니다.
INSERT INTO rep_board1 (grp, grps, grpl, subject, writer, mail, password, content, hit, wip, wdate)
VALUES (?, ?, ?, '답글 제목', '작성자', 'test@example.com', PASSWORD('1234'), '답글 내용', 0, '127.0.0.1', CURDATE());
- grp: 부모 글의 grp.
- grps: 부모 글의 grps + 1.
- grpl: 부모 글의 grpl + 1.
3-3. 댓글/답글 조회
ORDER BY grp DESC, grps ASC를 통해 계층적으로 데이터를 정렬합니다.
SELECT seq, grp, grps, grpl, subject, writer, wdate
FROM rep_board1
ORDER BY grp DESC, grps ASC;
4. 데이터 예시
4-1. 데이터 삽입 후
seq | grp | grps | grpl | subject | action |
1 | 1 | 0 | 0 | 모글1 | board_write |
2 | 2 | 0 | 0 | 모글2 | board_write |
3 | 1 | 4 | 1 | 1-1 | board_reply |
4 | 1 | 2 | 1 | 1-2 | board_reply |
5 | 1 | 1 | 1 | 1-3 | board_reply |
6 | 1 | 6 | 2 | 1-1-1 | board_reply |
7 | 1 | 5 | 2 | 1-1-2 | board_reply |
8 | 1 | 3 | 2 | 1-2-1 | board_reply |
4-2. 정렬 결과
쿼리:
SELECT seq, grp, grps, grpl, subject
FROM rep_board1
ORDER BY grp DESC, grps ASC;
출력:
seq | grp | grps | grpl | subject |
2 | 2 | 0 | 0 | 모글2 |
1 | 1 | 0 | 0 | 모글1 |
5 | 1 | 1 | 1 | 1-3 |
4 | 1 | 2 | 1 | 1-2 |
8 | 1 | 3 | 2 | 1-2-1 |
3 | 1 | 4 | 1 | 1-1 |
7 | 1 | 5 | 2 | 1-1-2 |
6 | 1 | 6 | 2 | 1-1-1 |
모글2
└── (그룹 내 순서 없음)
모글1
├── 1-3
├── 1-2
│ └── 1-2-1
└── 1-1
├── 1-1-2
└── 1-1-1
'Spring' 카테고리의 다른 글
Spring Web MVC - HTTP 요청 RequestMapping (1) | 2024.12.20 |
---|---|
SpringBoot 웹 애플리케이션의 MVC 패턴 (0) | 2024.12.20 |
JSP로 페이징 구현하기 (1) | 2024.12.20 |
MVC 패턴이란? (2) | 2024.12.19 |
Spring Web MVC - Http 요청 (0) | 2024.12.19 |