PlotPath 프로젝트의 핵심 기능 중 하나는 사용자들이 각 시리즈에 대해 깊이 있는 토론을 나눌 수 있는 커뮤니티 공간을 제공하는 것입니다. 이를 위해 특정 '시리즈(Series)'에 종속되는 게시판 기능을 설계했으며, 주요 구조와 정책은 다음과 같습니다.
Series → Board → Article각 시리즈별로 독립된 커뮤니티 공간을 제공하기 위해, 데이터를 계층 구조로 설계했습니다.
시리즈와 게시판 (1:1 관계): 하나의 Series는 자신만의 고유한 Board(게시판)를 하나만 가집니다. 이를 통해 '진격의 거인 게시판', '왕좌의 게임 게시판'처럼 명확하게 공간이 분리됩니다.
Board 테이블에 seriesId를 외래 키로 추가하여 Series 테이블과 1:1 관계를 맺습니다.게시판과 게시글 (1:N 관계): 생성된 Board에는 여러 개의 Article(게시글)이 작성될 수 있습니다.
Article 테이블에 boardId를 외래 키로 추가하여 Board 테이블과 1:N 관계를 맺습니다.사용자 간의 깊이 있는 상호작용을 위해 계층형 댓글 구조를 지원합니다.
Reply(댓글) 테이블에 parentId 컬럼을 두어 자기 자신을 참조하게 합니다.parentId가 없는 댓글은 최상위 댓글이 되며, 특정 댓글의 id를 parentId로 갖는 새로운 댓글은 해당 댓글의 대댓글이 됩니다.게시글과 댓글에 대한 사용자의 선호를 표현할 수 있습니다.
Article(게시글)과 Reply(댓글) 모두에 '좋아요' 또는 '싫어요' 반응이 가능합니다.reactionPoint 테이블이 사용자의 모든 반응을 기록합니다.relTypeCode 컬럼('article' 또는 'reply')으로 반응의 대상을 구분합니다.relId 컬럼으로 대상의 고유 ID를 저장합니다.memberId를 통해 한 명의 사용자는 하나의 콘텐츠에 대해 한 번만 반응할 수 있도록 제한합니다. (좋아요를 누른 상태에서 싫어요를 누르면 기존 반응이 변경됩니다.)한 명의 사용자가 비정상적으로 조회수를 올리는 것을 방지합니다.
HttpSession에 '이미 본 게시글 ID 목록'을 저장하고, 게시글을 조회할 때마다 이 목록을 확인하여 조회수 증가 여부를 결정합니다. (로그아웃 후 다시 로그인하면 초기화됩니다.)운영의 단순성과 기록의 보존을 위해 댓글은 수정할 수 없도록 설계했습니다.
board 테이블 (시리즈별 게시판)
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 게시판 고유 번호 |
regDate | DATETIME | NOT NULL | 등록 날짜 |
updateDate | DATETIME | NOT NULL | 수정 날짜 |
seriesId | BIGINT | NOT NULL, UNIQUE | 게시판이 속한 시리즈 ID |
name | VARCHAR(255) | NOT NULL | 게시판 이름 (보통 시리즈 제목과 동일) |
code | CHAR(50) | NOT NULL, UNIQUE | 게시판 코드 (예: series_1) |
article 테이블 (게시글)
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 게시글 고유 번호 |
regDate | DATETIME | NOT NULL | 등록 날짜 |
updateDate | DATETIME | NOT NULL | 수정 날짜 |
memberId | BIGINT | NOT NULL | 작성한 회원 ID (member.id 참조) |
boardId | BIGINT | NOT NULL | 게시글이 속한 게시판 ID (board.id 참조) |
title | VARCHAR(255) | NOT NULL | 게시글 제목 |
body | TEXT | NOT NULL | 게시글 내용 |
hitCount | INT UNSIGNED | NOT NULL, DEFAULT 0 | 조회수 |
goodReactionPoint | INT UNSIGNED | NOT NULL, DEFAULT 0 | 좋아요 수 |
badReactionPoint | INT UNSIGNED | NOT NULL, DEFAULT 0 | 싫어요 수 |
reply 테이블 (댓글)
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 댓글 고유 번호 |
regDate | DATETIME | NOT NULL | 등록 날짜 |
updateDate | DATETIME | NOT NULL | 수정 날짜 |
memberId | BIGINT | NOT NULL | 작성자 ID (member.id 참조) |
relTypeCode | CHAR(50) | NOT NULL | 관련 데이터 타입 (이 경우 항상 'article') |
relId | BIGINT | NOT NULL | 관련 게시물 (article) 번호 |
parentId | BIGINT | 부모 댓글의 ID (최상위 댓글은 NULL) | |
body | TEXT | NOT NULL | 댓글 내용 |
goodReactionPoint | INT UNSIGNED | NOT NULL, DEFAULT 0 | 좋아요 수 |
badReactionPoint | INT UNSIGNED | NOT NULL, DEFAULT 0 | 싫어요 수 |
reactionPoint 테이블 (좋아요/싫어요)
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 고유 번호 |
regDate | DATETIME | NOT NULL | 등록 날짜 |
updateDate | DATETIME | NOT NULL | 수정 날짜 |
memberId | BIGINT | NOT NULL | 누른 회원 ID (member.id 참조) |
relTypeCode | CHAR(50) | NOT NULL | 관련 데이터 타입 ('article' 또는 'reply') |
relId | BIGINT | NOT NULL | 관련 데이터 ID |
reactionType | CHAR(10) | NOT NULL | 반응 종류 (GOOD: 좋아요, BAD: 싫어요) |
point | INT | NOT NULL | 반응 점수 (일반적으로 1 또는 -1) |