[Day 30 | JSP] 답글이 있는 게시판 만들기

y♡ding·2024년 11월 22일
0

데브코스 TIL

목록 보기
163/163

1. 설계 개요

1-1. 주요 필드 정의

필드명설명
seq글번호(순서). 게시판의 모든 글(댓글, 답글 포함)에 대해 고유한 번호. 자동 증가 (AUTO_INCREMENT).
grp글그룹. 하나의 글과 그에 속한 모든 답글이 동일한 grp 값을 가짐.
grps그룹 내 순서. 같은 그룹(grp) 내에서의 정렬 순서를 나타냄.
grpl그룹 내 깊이. 댓글은 0, 답글은 1 이상으로 계층적 깊이를 나타냄.

1-2. 동작 규칙

  1. 모글:
    • seq: 자동 증가.
    • grp: seq와 동일.
    • grps: 0.
    • grpl: 0.
  2. 자식글(답글):
    • seq: 자동 증가.
    • grp: 부모 글의 grp와 동일.
    • grps:
      1. 부모 글의 grps보다 큰 값을 가진 모든 글의 grps를 +1 증가.
      2. 자신의 grps는 부모 글의 grps + 1.
    • grpl: 부모 글의 grpl + 1.
  3. 정렬:
    • ORDER BY grp DESC, grps ASC.

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. 데이터 삽입 후

seqgrpgrpsgrplsubjectaction
1100모글1board_write
2200모글2board_write
31411-1board_reply
41211-2board_reply
51111-3board_reply
61621-1-1board_reply
71521-1-2board_reply
81321-2-1board_reply

4-2. 정렬 결과

쿼리:

SELECT seq, grp, grps, grpl, subject
FROM rep_board1
ORDER BY grp DESC, grps ASC;

출력:

seqgrpgrpsgrplsubject
2200모글2
1100모글1
51111-3
41211-2
81321-2-1
31411-1
71521-1-2
61621-1-1

모글2
└── (그룹 내 순서 없음)

모글1
├── 1-3
├── 1-2
│   └── 1-2-1
└── 1-1
    ├── 1-1-2
    └── 1-1-1

0개의 댓글

관련 채용 정보