백엔드/Java

[개인 프로젝트] 게시판 만들기 1 - DB 설계하기

hawon6691 2025. 9. 24. 10:06
728x90

백엔드 개발에서 가장 중요한 출밤점은

데이터를 어떻게 저장하고 관리하는 것인가 라고 생각합니다.

 

코드를 작성하기 전에 데이터베이스 테이블을 먼저 설계하면,

프로젝트 전체 구조를 더 명확하게 잡을 수 있습니다.

 

이번 글에서는 게시판 프로젝트를 진행하기 위해

데이터베이스 테이블을 개념적 → 논리적 설계 순서로 정리해보겠습니다.


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) 코드에서 엔티티의 매핑을 구현하면 됩니다.

728x90