Conversation
…-151-BE-게시판-추가
Walkthrough사용자 인증 정보를 기반으로 게시물 조회 메서드들에 userId 파라미터를 추가하고, PostResponse에 isLiked와 isBookmarked 필드를 도입하여 사용자별 게시물 상태(좋아요, 북마크) 추적 기능을 구현했습니다. Changes
Sequence DiagramsequenceDiagram
participant Client
participant BoardController
participant PostService
participant UserRepository
participant PostRepository
participant PostLikeRepository
participant PostBookmarkRepository
Client->>BoardController: getPosts(boardId, page, size) + auth
BoardController->>BoardController: extract userId from `@AuthenticationPrincipal`
BoardController->>PostService: getPosts(boardId, userId, page, size)
PostService->>UserRepository: findById(userId)
PostService->>PostRepository: findByBoardId(boardId, page)
loop for each post
PostService->>PostLikeRepository: existsByUserUserIdAndPostPostId(userId, postId)
PostService->>PostBookmarkRepository: existsByUserUserIdAndPostPostId(userId, postId)
PostService->>PostService: mapToPostResponse(post, user, isLiked, isBookmarked)
end
PostService-->>BoardController: Page<PostResponse>
BoardController-->>Client: ResponseEntity<Page<PostResponse>>
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 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: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)
158-179: 잘못된 주석 수정 필요Line 158과 Line 170의 주석이 "게시판 생성"으로 되어 있지만, 실제로는 각각 부모 게시판 조회와 하위 게시판 조회 메서드입니다.
- // 게시판 생성 + // 부모 게시판 목록 조회 @Operation( summary = "부모 게시판 목록 조회", ... - // 게시판 생성 + // 하위 게시판 목록 조회 @Operation( summary = "하위 게시판 목록 조회", ...
🧹 Nitpick comments (4)
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (3)
195-195: 불필요한return문 제거
void메서드의 마지막에 있는return;문은 불필요합니다.targetBoardIds.forEach(boardRepository::deleteById); - return; }
240-243: Fail-fast를 위해 사용자 조회 순서 변경 권장게시물 조회 후 사용자를 조회하고 있어, 존재하지 않는 사용자의 경우 불필요한 게시물 조회가 발생합니다.
getPosts메서드(Line 212-214)와 동일하게 게시물 조회 전에 사용자를 먼저 조회하는 것이 일관성과 성능 면에서 좋습니다.// 게시판 조회 Board board = boardRepository.findById(boardId) .orElseThrow(() -> new CustomException(ErrorCode.BOARD_NOT_FOUND)); + // 유저 조회 + User user = userRepository.findById(userId) + .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); + // 해당 키워드가 들어간 게시물 검색 Page<Post> posts = postRepository.searchByBoardAndKeyword( board, keyword, pageable); - // 유저 조회 - User user = userRepository.findById(userId) - .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); - return posts.map(post -> mapToPostResponse(post, user));
338-345:@Override어노테이션 누락
getChildBoards메서드에@Override어노테이션이 누락되었습니다. 다른 인터페이스 구현 메서드들과 일관성을 위해 추가해 주세요.// 하위 게시판 조회 + @Override @Transactional(readOnly = true) public List<BoardResponse> getChildBoards() {backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java (1)
267-267:searchPosts메서드에 대한 테스트 누락
getPosts와getPostDetail에 대한 테스트는userId매개변수와isLiked/isBookmarked검증이 추가되었지만,searchPosts메서드에 대한 테스트가 없습니다. 동일한 사용자 컨텍스트 로직을 사용하므로 테스트 추가를 권장합니다.
searchPosts테스트 코드를 생성해 드릴까요?
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java(3 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(7 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceRoundServiceTest.java(0 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceServiceTest.java(1 hunks)backend/src/test/java/org/sejongisc/backend/attendance/service/SessionLocationUpdateTest.java(0 hunks)backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java(6 hunks)
💤 Files with no reviewable changes (2)
- backend/src/test/java/org/sejongisc/backend/attendance/service/SessionLocationUpdateTest.java
- backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceRoundServiceTest.java
🔇 Additional comments (3)
backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java (1)
31-32: LGTM!사용자별 좋아요/북마크 상태를 나타내는 새로운 필드가 올바르게 추가되었습니다.
Booleanwrapper 타입 사용은 향후 비인증 사용자 지원 시null값을 허용할 수 있어 적절한 선택입니다.backend/src/main/java/org/sejongisc/backend/board/service/PostService.java (1)
23-29: LGTM!사용자 컨텍스트를 위한
userId매개변수가 일관되게 추가되었습니다. 인터페이스 설계가 명확하고 사용자별 좋아요/북마크 상태 조회를 위한 요구사항을 잘 반영하고 있습니다.backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java (1)
248-266: LGTM!사용자 조회 및 좋아요/북마크 상태에 대한 모킹과 검증이 올바르게 추가되었습니다. 새로운
userId매개변수와isLiked/isBookmarked응답 필드에 대한 테스트 커버리지가 적절합니다.
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java
Show resolved
Hide resolved
backend/src/test/java/org/sejongisc/backend/attendance/service/AttendanceServiceTest.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)
101-104: 비인증 요청 시customUserDetails가 null 가능하여 NPE 위험 (게시글 조회/검색/상세/게시판 삭제)현재
@AuthenticationPrincipal CustomUserDetails customUserDetails에 대해 별도 null 처리 없이 곧바로customUserDetails.getUserId()를 호출하고 있습니다. 기존SecurityConfig설정상/api/board/**에 대해 별도의 인증 요구가 없고.anyRequest().permitAll()인 경우, 비로그인 사용자가 해당 엔드포인트에 접근하면customUserDetails는 null 이고 NPE가 발생합니다.의도에 따라 다음 중 한 가지로 정리하는 것을 권장합니다.
- 엔드포인트 인증 강제:
SecurityConfig에/api/board/**(또는 필요한 경로들: 목록/검색/상세/삭제 포함)에 대해.requestMatchers("/api/board/**").authenticated()를 추가해 항상CustomUserDetails가 존재하도록 만들기- 게스트 허용 + null 안전 처리: 컨트롤러에서
처럼 null-safe 하게 처리하고, 서비스 계층에서UUID userId = customUserDetails != null ? customUserDetails.getUserId() : null;userId == null인 경우에는 게스트로 간주해isLiked/isBookmarked등을 기본값(false)으로 처리하거나 권한 에러를 반환하는 방식으로 정리위 전략 중 하나를 선택해
getPosts,searchPosts,getPostDetail,deleteBoard에 일관되게 적용하는 것이 좋겠습니다. (이 이슈는 이전 리뷰 코멘트에서 이미 한번 언급된 내용과 동일한 류의 문제입니다.)다음 스크립트를 통해 SecurityConfig 에서
/api/board관련 매칭이 실제로 존재하는지 한 번 확인해 보실 수 있습니다:#!/bin/bash # /api/board 관련 보안 설정이 있는지 확인 rg -n "/api/board" backend/src/main/java/org/sejongisc/backend/common/auth/config/SecurityConfig.javaAlso applies to: 119-122, 136-139, 189-193
🧹 Nitpick comments (1)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)
158-167: 부모/하위 게시판 조회에서 사용되지 않는@AuthenticationPrincipal파라미터 정리 제안
getParentBoards,getChildBoards메서드 시그니처에@AuthenticationPrincipal CustomUserDetails customUserDetails가 추가되었지만, 메서드 내부에서는 전혀 사용되지 않습니다.
- 이 두 엔드포인트가 완전히 공개된 조회 API이고 현재로서 사용자별 분기 로직이 없다면, 시그니처를 단순화하기 위해
@AuthenticationPrincipal파라미터를 제거하는 것도 고려할 수 있습니다.- 반대로, 향후 권한 제어나 개인화(예: 특정 사용자만 볼 수 있는 게시판)를 위해 미리 추가해 둔 것이라면 그대로 유지해도 되지만, 그 경우에도 상단의
/api/board/**인증 정책과의 정합성(게스트 접근 허용 여부)은 한 번 더 점검해 두는 편이 좋습니다.크리티컬한 문제는 아니며, 코드 가독성과 API 설계를 조금 더 명확히 하기 위한 선택 사항입니다.
SecurityConfig 에서 이 두 경로(
/api/board/parents,/api/board/childs)의 인증 요구 여부를 다시 확인해 보시는 것을 추천드립니다.Also applies to: 170-177
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java(6 hunks)
Summary by CodeRabbit
릴리스 노트
✏️ Tip: You can customize this high-level summary in your review settings.