Skip to content

♻️Refactor: 게시글 좋아요 기능 추가 및 댓글 수, 좋아요 수 조회 추가#14

Merged
uni-j-uni merged 1 commit intomainfrom
refactor/community
Dec 13, 2025
Merged

♻️Refactor: 게시글 좋아요 기능 추가 및 댓글 수, 좋아요 수 조회 추가#14
uni-j-uni merged 1 commit intomainfrom
refactor/community

Conversation

@uni-j-uni
Copy link
Contributor

@uni-j-uni uni-j-uni commented Dec 13, 2025

✨ 새로운 기능

  • 게시글 좋아요 토글 추가
  • 게시글 응답에 댓글 수, 좋아요 수 필드 추가

🔗 관련 문서 / 이슈

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능
    • 게시글 좋아요 기능 추가: 게시글에 좋아요를 표시하거나 취소할 수 있는 새로운 API 엔드포인트 추가
    • 게시글 상세 정보에 좋아요 수, 댓글 수, 현재 사용자의 좋아요 표시 여부가 표시됨

✏️ Tip: You can customize this high-level summary in your review settings.

@uni-j-uni uni-j-uni self-assigned this Dec 13, 2025
@uni-j-uni uni-j-uni added the ♻️ refactor 리팩토링 작업 label Dec 13, 2025
@uni-j-uni uni-j-uni linked an issue Dec 13, 2025 that may be closed by this pull request
2 tasks
@coderabbitai
Copy link

coderabbitai bot commented Dec 13, 2025

Walkthrough

게시글 좋아요 기능이 추가되었습니다. PostLike 엔티티와 repository를 신규 작성하고, 서비스 레이어에 좋아요 토글 로직을 구현하며, 컨트롤러에 POST 엔드포인트를 추가하고, 응답 DTO에 좋아요 카운트 및 사용자 좋아요 상태 필드를 포함했습니다.

Changes

Cohort / 파일 변경 요약
Post 엔티티 및 저장소
src/main/java/com/sku/refit/domain/post/entity/PostLike.java, src/main/java/com/sku/refit/domain/post/repository/PostLikeRepository.java
좋아요 정보를 저장하는 새 PostLike JPA 엔티티(post_id, user_id 복합 유니크 제약) 추가 및 게시글별 좋아요 조회/카운팅을 위한 PostLikeRepository 인터페이스 작성
서비스 레이어
src/main/java/com/sku/refit/domain/post/service/PostService.java, src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java
PostService에 togglePostLike 메서드 추가; PostServiceImpl에 좋아요 토글 로직 구현 및 좋아요 카운트/상태를 조회 결과에 포함하도록 기존 메서드(getAllPosts, getPostsByCategory, getPostById, updatePost, createPost) 수정
컨트롤러
src/main/java/com/sku/refit/domain/post/controller/PostController.java, src/main/java/com/sku/refit/domain/post/controller/PostControllerImpl.java
POST /{postId}/like 엔드포인트 추가; PostControllerImpl에서 @Slf4j 제거
응답 DTO 및 매퍼
src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java, src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java
PostDetailResponse에 likes(Long), comments(Long), isLiked(Boolean) 필드 추가; PostMapper.toDetailResponse 메서드 시그니처 변경(likeCount, isLiked 파라미터 추가)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50분

  • 주의 필요 영역:
    • PostServiceImpl.java의 여러 메서드 수정으로 인한 좋아요 데이터 수집 및 매핑 로직 검증 필요
    • PostLikeRepository의 커스텀 JPQL 쿼리(countByPostIds, findLikedPostIds) 성능 및 정확성 확인
    • togglePostLike 메서드의 동시성 처리 및 race condition 검토 권장
    • PostDetailResponse 필드 추가에 따른 직렬화 및 클라이언트 호환성 확인

Possibly related issues

Possibly related PRs

  • Feature/community #2: 동일한 post 컨트롤러, 서비스, 매퍼, DTO 파일을 수정하며 좋아요 기능 추가 관련 코드 레벨 연관성 높음
  • ✨Feat: 교환 관련 API 기능 개발 #11: PostDetailResponse와 PostMapper.toDetailResponse 변경으로 post 상세 응답 구조 수정, 코드 레벨 직접 연관

Suggested labels

✨ feature

Poem

🐰 새로운 기능이 자라났어요,
좋아요 버튼을 톡톡 눌러요!
Repository와 Service, 손을 잡고,
Controller는 요청을 받아 춤을 춰요.
사용자의 마음을 담은 데이터베이스,
게시글에 사랑을 남기는 날! ❤️✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Description check ❓ Inconclusive PR 설명은 일부 필수 섹션이 누락되어 있습니다. 개발 상세(구현 방식, 라이브러리), 테스트 방법, 추가 고려사항 섹션이 부족합니다. 구현 방식 요약, 테스트 케이스 확인, UX/UI 확인 여부, 배포 시 주의사항 등의 정보를 추가하여 PR 설명을 더욱 완성도 있게 작성해주세요.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 게시글 좋아요 기능 추가 및 댓글 수, 좋아요 수 조회 추가라는 주요 변경 사항을 명확하게 요약하고 있으며, 변경 사항과 완벽하게 관련이 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/community

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java (2)

218-220: increaseViews()가 중복 호출됨 - 조회수가 2씩 증가합니다.

post.increaseViews()가 두 번 연속 호출되어 게시글 조회 시 조회수가 1이 아닌 2씩 증가하는 버그가 있습니다.

     post.increaseViews();

-    post.increaseViews();
-
     log.info(

252-264: S3 이미지 삭제가 중복으로 호출됨.

Lines 254-256과 262-264에서 oldImageUrls에 대한 S3 삭제가 두 번 수행됩니다. 첫 번째 삭제 후 두 번째 삭제 시 존재하지 않는 파일을 삭제하려 시도하거나 오류가 발생할 수 있습니다.

       try {
-        for (String imageUrl : oldImageUrls) {
-          s3Service.deleteFile(s3Service.extractKeyNameFromUrl(imageUrl));
-        }
-
         for (MultipartFile image : images) {
           newImageUrls.add(s3Service.uploadImage(PathName.POST, image).getImageUrl());
         }

         for (String imageUrl : oldImageUrls) {
           s3Service.deleteFile(s3Service.extractKeyNameFromUrl(imageUrl));
         }
🧹 Nitpick comments (1)
src/main/java/com/sku/refit/domain/post/repository/PostLikeRepository.java (1)

23-30: Object[] 대신 타입 안전한 프로젝션 사용 고려.

현재 List<Object[]> 반환 타입은 동작하지만 타입 안전성이 떨어집니다. 간단한 인터페이스 프로젝션이나 record를 사용하면 가독성과 유지보수성이 향상됩니다.

// 프로젝션 인터페이스 정의
public interface PostLikeCount {
  Long getPostId();
  Long getCount();
}

// Repository 메서드 수정
@Query("""
  select pl.post.id as postId, count(pl) as count
  from PostLike pl
  where pl.post.id in :postIds
  group by pl.post.id
""")
List<PostLikeCount> countByPostIds(@Param("postIds") List<Long> postIds);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c072e63 and 6fef1e3.

📒 Files selected for processing (8)
  • src/main/java/com/sku/refit/domain/post/controller/PostController.java (1 hunks)
  • src/main/java/com/sku/refit/domain/post/controller/PostControllerImpl.java (2 hunks)
  • src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java (2 hunks)
  • src/main/java/com/sku/refit/domain/post/entity/PostLike.java (1 hunks)
  • src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java (1 hunks)
  • src/main/java/com/sku/refit/domain/post/repository/PostLikeRepository.java (1 hunks)
  • src/main/java/com/sku/refit/domain/post/service/PostService.java (1 hunks)
  • src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java (8 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
src/main/java/com/sku/refit/domain/post/entity/PostLike.java (1)
src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java (1)
  • Getter (15-58)
src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java (1)
src/main/java/com/sku/refit/domain/event/dto/response/EventResponse.java (1)
  • Schema (12-151)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build
🔇 Additional comments (8)
src/main/java/com/sku/refit/domain/post/service/PostService.java (1)

39-47: LGTM!

인터페이스 메서드와 Javadoc이 명확하게 작성되어 있습니다. 토글 동작에 대한 반환 타입 boolean이 적절합니다.

src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java (1)

35-51: LGTM!

새로운 필드들(likes, comments, isLiked)이 적절한 Schema 어노테이션과 함께 추가되었습니다. 기존 DTO 구조와 일관성이 유지됩니다.

src/main/java/com/sku/refit/domain/post/controller/PostController.java (1)

51-54: LGTM!

좋아요 토글 API 엔드포인트가 기존 패턴과 일관되게 잘 정의되었습니다. Swagger 어노테이션이 적절합니다.

src/main/java/com/sku/refit/domain/post/entity/PostLike.java (1)

13-34: LGTM!

PostLike 엔티티가 JPA 모범 사례에 따라 잘 설계되었습니다. (post_id, user_id) 복합 유니크 제약 조건으로 중복 좋아요를 방지하고, LAZY 페치 전략이 적절하게 적용되었습니다.

src/main/java/com/sku/refit/domain/post/controller/PostControllerImpl.java (1)

37-42: LGTM!

컨트롤러 구현이 서비스 레이어에 적절히 위임하며, 기존 엔드포인트 구현 패턴과 일관됩니다.

src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java (2)

85-111: LGTM!

togglePostLike 메서드가 잘 구현되었습니다. Optional.map().orElseGet() 패턴을 사용하여 좋아요 토글 로직을 깔끔하게 처리하고, 적절한 로깅이 포함되어 있습니다.


120-145: 배치 쿼리를 사용한 효율적인 좋아요 데이터 조회.

N+1 문제를 방지하기 위해 countByPostIdsfindLikedPostIds 배치 쿼리를 사용한 점이 좋습니다. 빈 리스트 체크도 적절합니다.

src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java (1)

41-41: 이 부분은 null 안전성 문제가 없습니다.

Post 엔티티에서 commentList@Builder.Default 어노테이션과 함께 new ArrayList<>()로 명시적으로 초기화되어 있으므로, post.getCommentList()는 절대 null을 반환하지 않습니다. FetchType.LAZY를 사용하더라도 필드는 기본값으로 초기화되므로 NullPointerException이 발생할 위험이 없습니다.

@uni-j-uni uni-j-uni merged commit e3b9b88 into main Dec 13, 2025
3 checks passed
@uni-j-uni uni-j-uni deleted the refactor/community branch December 16, 2025 01:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

♻️ refactor 리팩토링 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

♻️Refactor: 커뮤니티 기능 수정

1 participant