- ํ๋ก์ ํธ ๊ธฐ๊ฐ: 2025.02.14 - 2025.02.20
- ์ฌ์ฉ ๊ธฐ์ : JAVA, SpringBoot, JPA, Spring Data JPA, MySQL
๐ฆฆ juno-soodal : user crud, ์ธ์ฆ/์ธ๊ฐ, ๊ณตํต ๋ก์ง ์ฒ๋ฆฌ, comment like
๐คก mmj-159 : bookmark
๐ป SuhyeonB : post crud, post like
๐ euuns : comment crud, friend, friend-apply
1. API ๋ฐ ๊ธฐ๋ฅ ๋ช
์ธ์
2. ERD ์์ฑ
3. SQL ์์ฑ
4. ํธ๋ฌ๋ธ ์ํ
5. ์์ธ ์ฒ๋ฆฌ
๐ ์ธ์ฆ/์ธ๊ฐ: Session
๐จ 400 Bad Request: ์๋ชป๋ ์ ๊ทผ(๋น๋ฐ๋ฒํธ, ์ด๋ฉ์ผ ๋ฑ ํ์)
ใ 401 Unauthorized: ์ ํจํ ์ธ์ฆ ์๊ฒฉ์ด ์์ (๋ก๊ทธ์ธ)
ใ 403 Forbidden: ์์ธ์ค ๊ถํ ์์ (์ธ์
)
ใ 404 Not Found: ์ฐพ์ ์ ์๋ ์ ๊ทผ(์์ฒญ id)
๐ค User
CREATE TABLE user (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
interest_tag VARCHAR(255) NOT NULL,
status VARCHAR(50) DEFAULT 'ACTIVE',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);๐ post
CREATE TABLE post (
id BIGINT NOT NULL AUTO_INCREMENT,
user_id BIGINT NOT NULL,
title VARCHAR(255) NOT NULL,
contents LONGTEXT NOT NULL,
keyword VARCHAR(255),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
CONSTRAINT fk_post_user FOREIGN KEY (user_id) REFERENCES user(id)
);โค post_like
CREATE TABLE post_like (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
post_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
CONSTRAINT unique_post_user UNIQUE (post_id, user_id),
CONSTRAINT fk_post_like_post FOREIGN KEY (post_id) REFERENCES post(id) ON DELETE CASCADE,
CONSTRAINT fk_post_like_user FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
);๐ Comment
CREATE TABLE comment (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
post_id BIGINT NOT NULL,
contents TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_comment_user FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE,
CONSTRAINT fk_comment_post FOREIGN KEY (post_id) REFERENCES post(id) ON DELETE CASCADE
);๐ Comment_like
CREATE TABLE comment_like (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
comment_id BIGINT NOT NULL,
CONSTRAINT unique_comment_user UNIQUE (user_id, comment_id),
CONSTRAINT fk_comment_like_user FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE,
CONSTRAINT fk_comment_like_comment FOREIGN KEY (comment_id) REFERENCES comment(id) ON DELETE CASCADE
);๐ apply
CREATE TABLE apply (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
sender_id BIGINT NOT NULL,
receiver_id BIGINT NOT NULL,
CONSTRAINT friend_apply UNIQUE (sender_id, receiver_id),
CONSTRAINT fk_apply_sender FOREIGN KEY (sender_id) REFERENCES user(id) ON DELETE CASCADE,
CONSTRAINT fk_apply_receiver FOREIGN KEY (receiver_id) REFERENCES user(id) ON DELETE CASCADE
);๐ฅ Friends
CREATE TABLE friend (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
to_user_id BIGINT NOT NULL,
from_user_id BIGINT NOT NULL,
CONSTRAINT unique_friend UNIQUE (to_user_id, from_user_id),
CONSTRAINT fk_friend_to_user FOREIGN KEY (to_user_id) REFERENCES user(id) ON DELETE CASCADE,
CONSTRAINT fk_friend_from_user FOREIGN KEY (from_user_id) REFERENCES user(id) ON DELETE CASCADE
);๐ Bookmarks
CREATE TABLE bookmark (
bookmark_id BIGINT AUTO_INCREMENT PRIMARY KEY,
bookmark_user_id BIGINT NOT NULL,
bookmark_post_id BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_bookmark_user FOREIGN KEY (bookmark_user_id) REFERENCES user(id) ON DELETE CASCADE,
CONSTRAINT fk_bookmark_post FOREIGN KEY (bookmark_post_id) REFERENCES post(id) ON DELETE CASCADE
);๐ ์ํฉ
๋๊ธ ๋ชฉ๋ก ์กฐํ ์ ์์ฑ์(User)์ ๊ฒ์๊ธ ์ ๋ชฉ(Post) ์ ๋ณด๋ฅผ ํจ๊ป ๋ฐํ.
Comment entity์์ User์ Post๋ฅผ @ManyToOne(fetch = FetchType.LAZY)๋ก ์ค์ .
CommentResponseDto์์ getUser().getName() ๋๋ getPost().getTitle()์ ํธ์ถํ๋ฉด ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์
๐ฅ N+1 ๋ฌธ์ ๋ฐ์
1๊ฐ ์ฟผ๋ฆฌ ํ ์ถ๊ฐ์ ์ผ๋ก N๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ๋นํจ์จ์ ์ธ ๋ฐ์ดํฐ ์กฐํ ๋ฌธ์
๐ JOIN FETCH ํ์ฉ์ผ๋ก ํด๊ฒฐ
โ JOIN FETCH๊ฐ ์ ์ฉ๋ ํ,
findCommentsWithPostAndUserByPostId() ์คํ ์
Comment ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด์ ์ฆ์ User์ Post ๊ฐ์ฒด๋ฅผ ํจ๊ป ํธ์ถ
๋ฐ๋ผ์ proxy ๊ฐ์ฒด๊ฐ ์๋๋ผ ์ค์ entity ๋ก๋
์ถ๊ฐ์ ์ธ LazyInitializationException ์์ด getUser().getName() ์์ ํ๊ฒ ํธ์ถ ๊ฐ๋ฅ
๐ฏ common/exception/ErrorCode.java
โป ๋ชจ๋ ์์ธ๊ฐ ์๋ ์ผ๋ถ ์์ธ ์์ฑ










