Skip to content

sparta-mvp/java-springboot-restful-newsfeed

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

163 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๊ธฐ์ดˆ ํ”„๋กœ์ ํŠธ: ๋‰ด์Šค ํ”ผ๋“œ ์•ฑ ๋งŒ๋“ค๊ธฐ

ํŒ€ ๋…ธ์…˜ ๋งํฌ



๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  1. ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„: 2025.02.14 - 2025.02.20
  2. ์‚ฌ์šฉ ๊ธฐ์ˆ : 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. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ




์„ค๊ณ„

API ๋ฐ ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ


๐Ÿ‘ค Users

users1 users2



๐Ÿ“‘ Posts

posts1 posts2



๐Ÿท๏ธ Comments

comments



๐Ÿ‘ฅ Friends

friends1 friedns2



๐Ÿ”– Bookmarks

bookmarks



๐Ÿ” ์ธ์ฆ/์ธ๊ฐ€: Session

๐Ÿšจ 400 Bad Request: ์ž˜๋ชป๋œ ์ ‘๊ทผ(๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ ๋“ฑ ํ˜•์‹)
ใ€€ 401 Unauthorized: ์œ ํšจํ•œ ์ธ์ฆ ์ž๊ฒฉ์ด ์—†์Œ (๋กœ๊ทธ์ธ)
ใ€€ 403 Forbidden: ์—‘์„ธ์Šค ๊ถŒํ•œ ์—†์Œ (์„ธ์…˜)
ใ€€ 404 Not Found: ์ฐพ์„ ์ˆ˜ ์—†๋Š” ์ ‘๊ทผ(์š”์ฒญ id)





ERD

Image





SQL

๐Ÿ‘ค 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
);





troubleshooting


image



๐Ÿ”Ž ์ƒํ™ฉ

๋Œ“๊ธ€ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ์ž‘์„ฑ์ž(User)์™€ ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ(Post) ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜.
Comment entity์—์„œ User์™€ Post๋ฅผ @ManyToOne(fetch = FetchType.LAZY)๋กœ ์„ค์ •.
CommentResponseDto์—์„œ getUser().getName() ๋˜๋Š” getPost().getTitle()์„ ํ˜ธ์ถœํ•˜๋ฉด ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒ



๐Ÿ’ฅ N+1 ๋ฌธ์ œ ๋ฐœ์ƒ

1๊ฐœ ์ฟผ๋ฆฌ ํ›„ ์ถ”๊ฐ€์ ์œผ๋กœ N๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฌธ์ œ



๐Ÿš€ JOIN FETCH ํ™œ์šฉ์œผ๋กœ ํ•ด๊ฒฐ


image


โœ… JOIN FETCH๊ฐ€ ์ ์šฉ๋œ ํ›„,

findCommentsWithPostAndUserByPostId() ์‹คํ–‰ ์‹œ
Comment ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด์„œ ์ฆ‰์‹œ User์™€ Post ๊ฐ์ฒด๋ฅผ ํ•จ๊ป˜ ํ˜ธ์ถœ

๋”ฐ๋ผ์„œ proxy ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ entity ๋กœ๋“œ
์ถ”๊ฐ€์ ์ธ LazyInitializationException ์—†์ด getUser().getName() ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ





exception


image

๐ŸŽฏ common/exception/ErrorCode.java


โ€ป ๋ชจ๋“  ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€ ์˜ˆ์™ธ ์ž‘์„ฑ



About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages