백엔드 개발에서 가장 중요한 출밤점은
데이터를 어떻게 저장하고 관리하는 것인가 라고 생각합니다.
코드를 작성하기 전에 데이터베이스 테이블을 먼저 설계하면,
프로젝트 전체 구조를 더 명확하게 잡을 수 있습니다.
이번 글에서는 게시판 프로젝트를 진행하기 위해
데이터베이스 테이블을 개념적 → 논리적 설계 순서로 정리해보겠습니다.
1. 개념적 설계
엔티티 (Entity)
- User : 회원 정보 (이름, 이메일, 비밀번호, 프로필 이미지, 만든 시간/날짜, 마지막 로그인 기록)
- Role : 권한 정보 (USER, ADMIN)
- Post : 게시글 (작성자, 제목, 내용, 조회수, 공개 여부, 만든 시간, 수정 시간)
- Comment : 댓글 (게시글에 속함, 대댓글 구조, 내용, 만든 시간, 수정 시간)
- Tag : 글 분류를 위하 태그(예 ; java, spring, database)
관계 (Relation Ship)
- User ↔ Role : N:M 관계 → user_role 매핑 테이블 필요
- Post ↔ Tag : N:M 관계 → post_tag 매핑 테이블 필요
- User ↔ Post : 1:N (사용자가 여러 게시글 작성 가능)
- Post ↔ Comment : 1:N (게시글마다 여러 댓글 가능)
- User ↔ Likes : N:M (사용자는 여러 글에 좋아요, 하나의 글은 여러 사용자에게 좋아요)
2. 논리적 설계
-- 0. role table
create table role(
roleId int primary key auto_increment,
name varchar(20)
);
-- 1. user table
create table user (
userId int primary key auto_increment,
name VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL unique,
password VARCHAR(255) NOT NULL,
profileImage VARCHAR(255),
createdAt timestamp default current_timestamp,
lastLogin timestamp
);
-- 2. post table
create table post (
postId int primary key auto_increment,
userId int not null,
title varchar(200) not null,
content text not null,
viewCount int default 0,
isPublic boolean default true,
createdAt timestamp default current_timestamp,
updatedAt timestamp default current_timestamp on update current_timestamp,
foreign key (userId) references user(userId) on delete cascade
);
create index idx_post_user on post(userId);
-- 3. comment table
create table comment (
commentId int primary key auto_increment,
postId int not null,
userId int not null,
parentId int null,
content text not null,
createdAt timestamp default current_timestamp,
updatedAt timestamp default current_timestamp on update current_timestamp,
foreign key (postId) references post(postId) on delete cascade,
foreign key (userId) references user(userId) on delete cascade,
foreign key (parentId) references comment(commentId) on delete cascade
);
create index idx_comment_post on comment(postId);
create index idx_comment_user on comment(userId);
-- 4. tag table
create table tag (
tagId int primary key auto_increment,
name varchar(50) not null unique
);
-- 5. post_tag mapping table
create table post_tag (
postId int not null,
tagId int not null,
primary key (postId, tagId),
foreign key (postId) references post(postId),
foreign key (tagId) references tag(tagId)
);
create index idx_post_tag_post on post_tag(postId);
create index idx_post_tag_tag on post_tag(tagId);
-- 6. user_role mapping table
create table user_role (
userId int not null,
roleId int not null,
primary key (userId, roleId),
foreign key (userId) references user(userId) on delete cascade,
foreign key (roleId) references role(roleId)
);
create index idx_user_role_user on user_role(userId);
create index idx_user_role_role on user_role(roleId);
-- 7. likes table
create table likes (
postId int not null,
userId int not null,
primary key (postId, userId),
foreign key (postId) references post(postId) on delete cascade,
foreign key (userId) references user(userId) on delete cascade
);
create index idx_likes_post on likes(postId);
create index idx_likes_user on likes(userId);
이 설계에서는 N:M 관계를 별도의 매핑 테이블로 풀어내는 것이 핵심입니다.
예를 들어 post_tag, user_role, likes 테이블이 대표적입니다.
3. 설계 포인트
- 우결성 보장 : 외래 키(FK)와 on delete cascade를 활용해 데이터 적합성을 유지합니다.
- 확장성 고려 : User-Role 관계처럼 권한이 늘어날 경우에도 테이블 구조를 수정하지 않고 데이터만 추가할 수 있습니다.
- 단순화 : mention(언급) 같은 복잡한 기능은 초기 버전에서 제외하고, 핵심 기능 (게시글, 댓글, 좋아요)에 집중합니다.
이렇게 게시판 프로젝트의 데이터베이스 설계를 완료했습니다.
이제 이 설계를 바탕으로 Java(Spring) 코드에서 엔티티의 매핑을 구현하면 됩니다.
'백엔드 > Java' 카테고리의 다른 글
[개인 프로젝트] 게시판 만들기 3 - PostDTO 수정 (0) | 2025.09.26 |
---|---|
[개인 프로젝트] 게시판 만들기 2 - DTO, DAO(User, Post, LoginInfo) 작성 (0) | 2025.09.25 |
[개인 프로젝트] 게시판 만들기 0 - 주제 선정 (0) | 2025.09.23 |
디렉토리 구조 잡기 (0) | 2025.09.08 |
application.yml (0) | 2025.05.31 |