Conversation
…-151-BE-게시판-추가
워크스루댓글의 부모-자식 관계를 명시적으로 처리하기 위해 변경사항
예상 코드 리뷰 노력🎯 2 (Simple) | ⏱️ ~10분
시
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
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
🧹 Nitpick comments (5)
backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java (1)
277-336: 대댓글 테스트에 parentCommentId 검증 추가 제안부모/자식 댓글의 내용과
replies사이즈는 잘 검증되고 있는데, 이번 PR에서 핵심으로 추가된parentCommentId까지 함께 검증해 두면 더 좋을 것 같습니다. 예를 들어:
parentResponse.getReplies().get(0).getParentCommentId()가parentResponse.getCommentId()와 동일한지,- 혹은 실제
parentComment.getCommentId()와 동일한지를 assert하면, DTO 계층 관계가 정확히 맵핑되는지까지 테스트에서 잡아줄 수 있습니다.
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (3)
174-196: 게시판 삭제 시 삭제 순서 및 다단계 계층 처리 검토 제안현재
targetBoardIds가Stream.of(boardId)→ 자식 보드 순으로 구성되어deleteById가 부모 → 자식 순으로 호출됩니다. DB에서 부모-자식 FK 제약이 걸려 있다면, 부모를 먼저 삭제할 때 제약 위반이 날 수 있어서 자식 보드를 먼저 삭제하거나, JPA 매핑의 cascade 설정을 한 번 확인해 보는 게 안전합니다.또한
findAllByParentBoard_BoardId(boardId)는 직계 자식만 포함하므로, 트리가 2단계 이상인 경우 손자 보드가 남을 수 있습니다. 필요하다면 재귀적으로 하위 보드의 ID를 모두 수집하는 헬퍼를 두는 것도 고려해 볼 만합니다.
201-220: 게시글 조회 공통 빌더 사용은 좋지만 User 조회/전달 패턴 정리 여지
getPosts,searchPosts,getPostDetail에서 모두userRepository.findById(userId)로User를 조회한 뒤getCommonPostBuilder(post, user)에 넘겨 isLiked/isBookmarked를 계산하는 패턴이 잘 통일되어 있습니다.다만
getCommonPostBuilder안에서는 실제로user.getUserId()만 사용하고 있으므로,
- 공통으로
private User getUserOrThrow(UUID userId)같은 헬퍼를 두거나,- 아예
getCommonPostBuilder(Post post, UUID userId)로 바꿔 User 엔티티가 꼭 필요 없는 경우 쿼리를 줄이는 방향을 고려해 볼 수 있습니다. 성능 이슈는 크지 않겠지만, 코드 의도를 더 분명하게 드러낼 수 있습니다.
Also applies to: 225-245, 353-372
343-351: getChildBoards에도 @OverRide 추가 권장
PostService인터페이스에getChildBoards()가 정의되어 있으므로, 구현부 메서드에도@Override를 붙여 두면 시그니처 변경 시 컴파일 타임에 더 빨리 잡을 수 있고,getParentBoards와의 일관성도 좋아집니다.backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)
158-167: 부모/하위 게시판 조회에서 인증 파라미터 사용 여부 명확화 제안
getParentBoards,getChildBoards두 메서드가@AuthenticationPrincipal CustomUserDetails를 파라미터로 받지만, 현재 구현에서는 userId나 role을 사용하지 않고 바로postService.getParentBoards()/getChildBoards()만 호출합니다.
- 완전히 공개해도 되는 목록 API라면
@AuthenticationPrincipal파라미터를 제거하거나,- 특정 권한만 접근해야 한다면 서비스/시큐리티 설정 쪽에서 role 체크를 추가
하는 식으로 의도를 코드에 더 드러내면, 나중에 읽을 때 혼란이나 정적 분석 도구의 unused-parameter 경고를 줄일 수 있을 것 같습니다.
Also applies to: 170-179
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java(6 hunks)backend/src/main/java/org/sejongisc/backend/board/dto/CommentResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/board/service/PostService.java(1 hunks)backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java(8 hunks)backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java(6 hunks)
🔇 Additional comments (8)
backend/src/main/java/org/sejongisc/backend/board/dto/CommentResponse.java (1)
28-35: parentCommentId 추가 및 매핑 로직 적절
parentCommentId를 필드로 추가하고, 두from(...)팩토리 메서드에서parentComment가 없을 때 null 처리까지 포함해 UUID를 세팅하는 구조가 명확합니다. 프런트에서 트리 구조를 복원하기에도 충분한 정보라 보이고, NPE 리스크도 없어 보입니다.Also applies to: 36-45, 47-60
backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java (1)
31-32: 사용자별 상태 필드(isLiked, isBookmarked) 추가 타이밍 적절
isLiked,isBookmarked를 DTO에 추가해 서비스 레이어에서 per-user 상태를 내려줄 수 있게 한 방향이 좋습니다.Boolean으로 선언해 상태 미정(null)도 표현 가능해 확장성도 괜찮아 보입니다.backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java (2)
41-43: 테스트 setUp에서 필수 필드 세팅으로 DTO 변환 안정성 확보
mockUser에role,name을 채우고,mockBoard/mockParentBoard의createdBy를 설정해 둔 덕분에UserInfoResponse.from등 DTO 변환 시 NPE 가능성을 잘 제거했습니다. 실제 도메인 제약(Role.TEAM_MEMBER 등)에 맞춘 값이라 테스트 신뢰성도 높습니다.Also applies to: 90-111
246-267: getPosts 테스트에서 per-user 상태 검증 추가 좋음
userRepository.findById(userId)mocking과 함께postLikeRepository.existsByUserUserIdAndPostPostId,postBookmarkRepository.existsByUserUserIdAndPostPostId를 설정하고, 결과 DTO에서isLiked,isBookmarked값을 직접 assert 하는 부분이 새 로직을 정확히 커버하고 있습니다. 목록 조회 시에도 사용자별 상태가 잘 내려가는지 보장해 줍니다.backend/src/main/java/org/sejongisc/backend/board/service/PostService.java (1)
22-30: PostService 시그니처 확장 방향 일관성 있음게시글 조회/검색/상세 조회에
userId를 추가하고, 게시판 조회/삭제용 메서드를 인터페이스에 정의한 구조가 Controller·Impl 코드와 잘 맞습니다. per-user DTO 필드(isLiked/isBookmarked) 계산을 서비스 레이어에서 책임지도록 설계한 점도 자연스럽습니다.Also applies to: 34-41
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (1)
262-284: 댓글/대댓글 DTO 변환 로직이 parentCommentId·replies 요구사항을 충족부모 댓글을 페이징으로 조회한 뒤, 각 부모에 대해
findByParentComment로 자식 목록을 가져와CommentResponse::from과CommentResponse.from(parent, replyResponses)조합으로 DTO를 만드는 구조가 요구사항(부모 댓글 + 대댓글 + parentCommentId 전달)을 잘 반영하고 있습니다.
childComments.forEach(child -> child.setParentComment(parent));를 통해 DTO 변환 시parentCommentId가 확실히 채워지도록 한 방어 로직도, 실제로 parent 연관 정보가 누락되는 케이스를 겪었다면 실용적인 해결책이라고 보입니다.Also applies to: 292-300
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (2)
97-105: 게시글 조회/검색/상세에서 userId 전달로 per-user 필드 계산이 가능해짐
getPosts,searchPosts,getPostDetail에@AuthenticationPrincipal CustomUserDetails를 추가하고, 여기서 얻은userId를 서비스 레이어에 넘겨주는 구조가PostService/PostServiceImpl변경과 잘 맞습니다. 이로 인해 각 PostResponse에서 isLiked/isBookmarked 같은 사용자별 상태를 일관되게 내려줄 수 있게 된 점이 좋습니다.Also applies to: 114-123, 132-140
181-195: 게시판 삭제 엔드포인트와 서비스 연동이 명확함
DELETE /api/board/{boardId}에서 인증 사용자 ID를 추출해postService.deleteBoard(boardId, userId)로 넘기는 구조가 서비스 구현의 Role.PRESIDENT 체크와 잘 맞습니다. 응답 메시지도 한글로 명확하게 내려 주고 있어, 클라이언트 입장에서 처리하기 수월해 보입니다.
Summary by CodeRabbit
릴리스 노트
✏️ Tip: You can customize this high-level summary in your review settings.