♻️Refactor: 게시글 좋아요 기능 추가 및 댓글 수, 좋아요 수 조회 추가#14
Conversation
Walkthrough게시글 좋아요 기능이 추가되었습니다. PostLike 엔티티와 repository를 신규 작성하고, 서비스 레이어에 좋아요 토글 로직을 구현하며, 컨트롤러에 POST 엔드포인트를 추가하고, 응답 DTO에 좋아요 카운트 및 사용자 좋아요 상태 필드를 포함했습니다. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50분
Possibly related issues
Possibly related PRs
Suggested labels
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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
📒 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 문제를 방지하기 위해
countByPostIds와findLikedPostIds배치 쿼리를 사용한 점이 좋습니다. 빈 리스트 체크도 적절합니다.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이 발생할 위험이 없습니다.
✨ 새로운 기능
🔗 관련 문서 / 이슈
Summary by CodeRabbit
릴리스 노트
✏️ Tip: You can customize this high-level summary in your review settings.