Skip to content

[BE} SISC-151 [Feat] 게시판 생성 및 대댓글#91

Merged
discipline24 merged 4 commits intomainfrom
SIsC1-151-BE-게시판-추가
Nov 10, 2025

Hidden character warning

The head ref may contain hidden characters: "SIsC1-151-BE-\uac8c\uc2dc\ud310-\ucd94\uac00"
Merged

[BE} SISC-151 [Feat] 게시판 생성 및 대댓글#91
discipline24 merged 4 commits intomainfrom
SIsC1-151-BE-게시판-추가

Conversation

@nayoung04
Copy link
Contributor

@nayoung04 nayoung04 commented Nov 10, 2025

Summary by CodeRabbit

  • 새로운 기능

    • 계층형(부모/자식) 게시판 생성 및 관리 기능 추가
    • 게시글 작성·수정·삭제, 첨부파일 업로드 지원
    • 댓글의 대댓글 작성 지원
    • 게시글 상세에서 댓글 페이징 조회 제공
  • 개선사항

    • 게시판 기준 검색 및 페이지네이션 지원
    • 좋아요·북마크 토글 기능 추가 (즉시 반영)
    • 댓글/좋아요/북마크 동작 신뢰성 향상 (락·재시도 처리)

@coderabbitai
Copy link

coderabbitai bot commented Nov 10, 2025

Walkthrough

게시판 도메인을 Board 중심으로 리팩토링하고 PostController를 제거한 뒤, BoardController와 PostInteractionService를 추가해 게시판/게시물/댓글/좋아요/북마크 관련 엔드포인트와 비즈니스 로직을 재배치했습니다. 엔티티·DTO·레포지토리·서비스·테스트가 Board 기반으로 변경되었습니다.

Changes

Cohort / File(s) 변경 요약
컨트롤러 추가
\backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java``
게시물 CRUD, 게시판 생성, 페이지네이션된 조회/검색, 댓글/좋아요/북마크 토글 등 13개 엔드포인트를 제공하는 새 REST 컨트롤러 추가 (Swagger 주석 및 인증 처리 포함)
컨트롤러 제거
\backend/src/main/java/org/sejongisc/backend/board/controller/PostController.java``
기존 PostController 파일 전체 삭제 — 게시물/댓글/상호작용 관련 기존 엔드포인트 제거
신규 엔티티 / 열거형 제거
\backend/src/main/java/org/sejongisc/backend/board/entity/Board.java`, `.../BoardType.java`, `.../PostType.java``
계층적 게시판을 위한 Board 엔티티 추가; 기존 BoardType, PostType enum 삭제
엔티티 매핑 변경
\backend/src/main/java/org/sejongisc/backend/board/entity/Post.java`, `.../Comment.java`, `.../PostAttachment.java`, `.../PostLike.java`, `.../PostBookmark.java``
Post가 Board와 연관되도록 변경, Comment에 parentComment 관계 추가, 모든 엔티티에 명시적 JPA 매핑 및 Lombok 어노테이션 적용
레포지토리 변경/추가
\backend/src/main/java/org/sejongisc/backend/board/repository/BoardRepository.java`, `.../CommentRepository.java`, `.../PostRepository.java``
BoardRepository 신규 추가; 댓글 부모-자식 조회 및 Board 기반 쿼리 메서드 추가/수정
DTO 변경/추가
\backend/src/main/java/org/sejongisc/backend/board/dto/BoardRequest.java`, `.../PostRequest.java`, `.../PostResponse.java`, `.../CommentRequest.java`, `.../CommentResponse.java``
BoardRequest 추가; PostRequest에서 boardType/postTypeboardId(UUID)로 변경; CommentRequestparentCommentId 추가; CommentResponse에 작성자(User) 및 replies 리스트 추가
서비스 계층 재배치
\backend/src/main/java/org/sejongisc/backend/board/service/PostInteractionService.java`, `.../PostService.java`, `.../PostServiceImpl.java``
댓글/좋아요/북마크 책임을 PostInteractionService로 분리(재시도 로직 포함); PostService/Impl은 Board 중심으로 리팩토링 및 createBoard 추가
예외 코드 추가
\backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java``
INVALID_PARENT_COMMENT, ALREADY_CHILD_COMMENT, BOARD_NOT_FOUND, INVALID_BOARD_TYPE 4개 코드 추가
테스트 추가/수정
\backend/src/test/java/org/sejongisc/backend/board/service/PostInteractionServiceTest.java`, `.../PostServiceImplTest.java``
PostInteractionServiceTest 신규 추가(댓글/좋아요/북마크 등); PostServiceImplTest 전면 재작성(의존성 모킹 및 시나리오 확장)

Sequence Diagram(s)

sequenceDiagram
    actor Client
    participant BoardController
    participant PostService
    participant PostInteractionService
    participant BoardRepository
    participant PostRepository
    participant CommentRepository
    participant UserRepository

    rect rgb(220,235,255)
    Note over Client,BoardController: 게시글 생성 (Board 선택)
    Client->>BoardController: POST /api/board/posts (multipart/form-data)
    BoardController->>PostService: createPost(PostRequest, userId)
    PostService->>BoardRepository: findById(boardId)
    BoardRepository-->>PostService: Board
    PostService->>PostRepository: save(Post)
    PostRepository-->>PostService: saved Post
    PostService-->>BoardController: 201 Created
    BoardController-->>Client: 201 Created
    end

    rect rgb(220,255,230)
    Note over Client,BoardController: 댓글 생성 (부모 선택 가능)
    Client->>BoardController: POST /api/board/comments (postId, parentCommentId?, content)
    BoardController->>PostInteractionService: createComment(CommentRequest, userId)
    PostInteractionService->>PostRepository: findById(postId)
    PostRepository-->>PostInteractionService: Post
    alt parentCommentId 존재
        PostInteractionService->>CommentRepository: findById(parentCommentId)
        CommentRepository-->>PostInteractionService: parentComment
        PostInteractionService->>CommentRepository: findByParentComment(parentComment)
        CommentRepository-->>PostInteractionService: List(children)
        alt 부모가 이미 자식이면(손자 시도)
            PostInteractionService-->>BoardController: throw ALREADY_CHILD_COMMENT
            BoardController-->>Client: 4xx 에러
        else 유효
            PostInteractionService->>CommentRepository: save(new Comment)
            CommentRepository-->>PostInteractionService: saved Comment
            PostInteractionService->>PostRepository: save(post with commentCount++)
            PostInteractionService-->>BoardController: 201 Created
            BoardController-->>Client: 201 Created
        end
    else 최상위 댓글
        PostInteractionService->>CommentRepository: save(new Comment)
        CommentRepository-->>PostInteractionService: saved Comment
        PostInteractionService->>PostRepository: save(post with commentCount++)
        BoardController-->>Client: 201 Created
    end
    end

    rect rgb(255,245,220)
    Note over Client,BoardController: 좋아요 토글
    Client->>BoardController: POST /api/board/posts/{postId}/likes
    BoardController->>PostInteractionService: toggleLike(postId, userId)
    PostInteractionService->>PostRepository: findById(postId)
    alt 좋아요 없음
        PostInteractionService->>PostRepository: save(post likeCount++)
    else 이미 좋아요 있음
        PostInteractionService->>PostRepository: delete(PostLike) & save(post likeCount--)
    end
    PostInteractionService-->>BoardController: 200 OK
    BoardController-->>Client: 200 OK
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45분

특히 검토가 권장되는 항목:

  • BoardController의 라우팅/권한/입력 검증 (13개 엔드포인트)
  • PostInteractionService의 낙관적 잠금 재시도(횟수/백오프)와 댓글 계층성 검사(ALREADY_CHILD_COMMENT)
  • 엔티티 관계(부모 board/parentComment)에서의 순환/영속화 문제
  • 기존 PostController 제거로 인한 외부 참조(클라이언트 문서, API 게이트웨이) 잔존 여부
  • 테스트 변경(특히 PostServiceImplTest)의 충분성 및 경계 케이스

Possibly related PRs

Suggested reviewers

  • discipline24

Poem

🐰 보드의 숲에 새로 집을 지었네,
가지를 잇고 댓글이 깡충 뛰며,
옛 컨트롤러는 무대 뒤로 물러나고,
상호작용은 새 둥지로 깔끔히 옮겨,
당근 한입으로 리팩토링을 축하하네! 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.88% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경사항의 주요 내용을 명확하게 반영하고 있습니다. '게시판 생성 및 대댓글'은 이 PR의 핵심 기능(새로운 Board 엔티티 생성, 댓글 기능 확장)을 정확히 요약합니다.
✨ 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 SIsC1-151-BE-게시판-추가

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: 8

Caution

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

⚠️ Outside diff range comments (2)
backend/src/main/java/org/sejongisc/backend/board/entity/PostAttachment.java (1)

24-24: BasePostgresEntity 상속이 누락되었습니다.

다른 엔티티들(Post, Comment, PostBookmark)과 달리 PostAttachmentBasePostgresEntity를 상속하지 않아 createdAt, updatedAt 같은 공통 감사 필드가 없습니다. 이는 일관성 문제를 야기합니다.

다음과 같이 수정하세요:

 @Entity
 @Getter
 @Setter
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
-public class PostAttachment {
+public class PostAttachment extends BasePostgresEntity {
backend/src/main/java/org/sejongisc/backend/board/repository/CommentRepository.java (1)

14-16: 중복된 메서드를 제거하세요.

findByPostPostIdfindAllByPostPostId는 동일한 기능을 수행하는 중복 메서드입니다. Spring Data JPA에서 find...ByfindAll...By는 의미상 차이가 없으며, 둘 다 List를 반환합니다.

하나의 메서드만 유지하세요:

- List<Comment> findByPostPostId(UUID postId);
-
  List<Comment> findAllByPostPostId(UUID postId);
🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/board/repository/BoardRepository.java (1)

1-9: Board 리포지토리가 적절하게 추가되었습니다.

기본적인 CRUD 기능을 제공하는 표준 JPA 리포지토리가 잘 구현되었습니다.

향후 필요에 따라 다음과 같은 커스텀 메서드 추가를 고려하세요:

// 하위 게시판 조회
List<Board> findByParentBoard(Board parentBoard);

// 최상위 게시판 조회 (부모가 없는 게시판)
List<Board> findByParentBoardIsNull();

// 게시글 작성 가능한 게시판인지 확인 (자식 게시판이 없는지)
@Query("SELECT CASE WHEN COUNT(b) > 0 THEN false ELSE true END FROM Board b WHERE b.parentBoard.boardId = :boardId")
boolean canAcceptPosts(@Param("boardId") UUID boardId);
backend/src/main/java/org/sejongisc/backend/board/dto/BoardRequest.java (1)

20-24: boardName 입력값 유효성 보강이 필요합니다.
boardName 필드에 어떤 제약도 없어서 공백/빈 문자열이 그대로 저장될 수 있습니다. 실제 서비스에서 게시판 이름이 비어 있으면 UX가 깨지고, DB 측에서 NOT NULL 제약만으로는 걸러지지 않습니다. 최소한 @NotBlank를 추가해 컨트롤러 단에서 검증해 주세요.

게시판 이름이 비어 있는 요청을 막기 위해 다음과 같이 수정해 주세요:

   @Schema(description = "게시판 이름")
-  private String boardName;
+  @NotBlank(message = "게시판 이름은 필수입니다.")
+  private String boardName;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bb72f6a and 5f03a8e.

📒 Files selected for processing (24)
  • backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/controller/PostController.java (0 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/dto/BoardRequest.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/dto/CommentRequest.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/dto/CommentResponse.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/dto/PostRequest.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/Board.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/BoardType.java (0 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/Comment.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/PostAttachment.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/PostBookmark.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/PostLike.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/entity/PostType.java (0 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/repository/BoardRepository.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/repository/CommentRepository.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/repository/PostRepository.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/service/PostInteractionService.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/service/PostService.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (6 hunks)
  • backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java (1 hunks)
  • backend/src/test/java/org/sejongisc/backend/board/service/PostInteractionServiceTest.java (1 hunks)
  • backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java (1 hunks)
💤 Files with no reviewable changes (3)
  • backend/src/main/java/org/sejongisc/backend/board/controller/PostController.java
  • backend/src/main/java/org/sejongisc/backend/board/entity/BoardType.java
  • backend/src/main/java/org/sejongisc/backend/board/entity/PostType.java
🧰 Additional context used
🧬 Code graph analysis (13)
backend/src/main/java/org/sejongisc/backend/board/entity/Board.java (1)
backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (1)
  • Entity (22-68)
backend/src/main/java/org/sejongisc/backend/board/service/PostInteractionService.java (2)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
  • RequiredArgsConstructor (16-38)
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (1)
  • Service (35-311)
backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (2)
backend/src/main/java/org/sejongisc/backend/board/entity/Board.java (1)
  • Entity (21-43)
backend/src/main/java/org/sejongisc/backend/user/entity/User.java (1)
  • Entity (13-67)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
  • RequiredArgsConstructor (16-38)
backend/src/main/java/org/sejongisc/backend/board/dto/CommentResponse.java (3)
backend/src/main/java/org/sejongisc/backend/board/dto/PostAttachmentResponse.java (1)
  • Getter (10-26)
backend/src/main/java/org/sejongisc/backend/board/dto/CommentRequest.java (1)
  • ToString (14-30)
backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java (1)
  • ToString (16-36)
backend/src/main/java/org/sejongisc/backend/board/dto/BoardRequest.java (2)
backend/src/main/java/org/sejongisc/backend/board/dto/PostRequest.java (1)
  • ToString (15-33)
backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java (1)
  • ToString (16-36)
backend/src/test/java/org/sejongisc/backend/board/service/PostServiceImplTest.java (2)
backend/src/test/java/org/sejongisc/backend/board/service/PostInteractionServiceTest.java (1)
  • ExtendWith (38-341)
backend/src/test/java/org/sejongisc/backend/board/service/FileUploadServiceTest.java (1)
  • ExtendWith (20-98)
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (2)
backend/src/main/java/org/sejongisc/backend/board/service/PostInteractionService.java (1)
  • Service (28-214)
backend/src/main/java/org/sejongisc/backend/board/service/FileUploadService.java (1)
  • Service (16-92)
backend/src/main/java/org/sejongisc/backend/board/entity/Comment.java (4)
backend/src/main/java/org/sejongisc/backend/board/entity/Board.java (1)
  • Entity (21-43)
backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (1)
  • Entity (22-68)
backend/src/main/java/org/sejongisc/backend/board/entity/PostAttachment.java (1)
  • Entity (18-42)
backend/src/main/java/org/sejongisc/backend/user/entity/User.java (1)
  • Entity (13-67)
backend/src/main/java/org/sejongisc/backend/board/entity/PostBookmark.java (3)
backend/src/main/java/org/sejongisc/backend/board/entity/Comment.java (1)
  • Entity (21-48)
backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (1)
  • Entity (22-68)
backend/src/main/java/org/sejongisc/backend/board/entity/PostLike.java (1)
  • Entity (19-38)
backend/src/main/java/org/sejongisc/backend/board/entity/PostAttachment.java (5)
backend/src/main/java/org/sejongisc/backend/board/entity/Comment.java (1)
  • Entity (21-48)
backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (1)
  • Entity (22-68)
backend/src/main/java/org/sejongisc/backend/board/entity/PostBookmark.java (1)
  • Entity (19-38)
backend/src/main/java/org/sejongisc/backend/board/entity/PostLike.java (1)
  • Entity (19-38)
backend/src/main/java/org/sejongisc/backend/board/dto/PostAttachmentResponse.java (1)
  • Getter (10-26)
backend/src/main/java/org/sejongisc/backend/board/entity/PostLike.java (4)
backend/src/main/java/org/sejongisc/backend/board/entity/Comment.java (1)
  • Entity (21-48)
backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (1)
  • Entity (22-68)
backend/src/main/java/org/sejongisc/backend/board/entity/PostBookmark.java (1)
  • Entity (19-38)
backend/src/main/java/org/sejongisc/backend/user/entity/User.java (1)
  • Entity (13-67)
backend/src/main/java/org/sejongisc/backend/board/dto/PostResponse.java (2)
backend/src/main/java/org/sejongisc/backend/board/dto/PostSummaryResponse.java (1)
  • Getter (9-17)
backend/src/main/java/org/sejongisc/backend/board/dto/PostRequest.java (1)
  • ToString (15-33)
🔇 Additional comments (5)
backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java (1)

85-93: 새로운 에러 코드가 적절하게 추가되었습니다.

추가된 에러 코드들이 대댓글 및 게시판 기능에 필요한 검증 케이스를 잘 커버하고 있습니다. HTTP 상태 코드와 메시지도 적절합니다.

backend/src/main/java/org/sejongisc/backend/board/entity/Post.java (2)

38-38: user 관계에 명시적 @joincolumn 추가가 적절합니다.

명시적인 컬럼 이름 지정으로 JPA 매핑이 명확해졌습니다.


66-67: 낙관적 락 버전 필드가 적절하게 추가되었습니다.

bookmarkCount, likeCount, commentCount 같은 동시성 업데이트가 발생할 수 있는 필드들에 대한 낙관적 락 처리가 잘 구현되었습니다.

backend/src/main/java/org/sejongisc/backend/board/repository/CommentRepository.java (1)

23-25: 대댓글 조회를 위한 메서드가 적절하게 추가되었습니다.

  • findByParentComment: 특정 댓글의 대댓글들을 조회
  • findAllByPostPostIdAndParentCommentIsNull: 최상위 댓글만 페이징 처리하여 조회

두 메서드 모두 대댓글 기능 구현에 필요한 쿼리를 잘 정의하고 있습니다.

backend/src/main/java/org/sejongisc/backend/board/entity/Comment.java (1)

45-47: 대댓글 삭제 로직이 올바르게 구현되어 있습니다.

검증 결과, PostInteractionService.deleteComment() 메서드에서 부모 댓글 삭제 시 자식 댓글들을 먼저 일괄 삭제(deleteAll())한 후 부모 댓글을 삭제하는 로직이 명확하게 구현되어 있습니다. 또한 findByParentComment() 메서드를 통해 자식 댓글을 조회하고 있으며, 이는 테스트에서도 검증되어 있습니다.

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: 1

🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (1)

273-294: 게시판 생성 로직의 중복 코드를 제거하세요

두 분기 모두 boardNamecreatedBy를 동일하게 설정하고 있어 코드가 중복됩니다. Builder 패턴의 체이닝을 활용하여 간결하게 리팩토링할 수 있습니다.

다음과 같이 리팩토링하세요:

-    Board board;
-    // 하위 게시판인 경우
-    if (request.getParentBoardId() != null) {
-      Board parentBoard = boardRepository.findById(request.getParentBoardId())
-          .orElseThrow(() -> new CustomException(ErrorCode.BOARD_NOT_FOUND));
-
-      board = Board.builder()
-          .boardName(request.getBoardName())
-          .createdBy(user)
-          .parentBoard(parentBoard)
-          .build();
-    } else {
-      // 상위 게시판인 경우
-      board = Board.builder()
-          .boardName(request.getBoardName())
-          .createdBy(user)
-          .parentBoard(null)
-          .build();
-    }
-
-    boardRepository.save(board);
+    // 하위 게시판인 경우 부모 게시판 조회
+    Board parentBoard = request.getParentBoardId() != null
+        ? boardRepository.findById(request.getParentBoardId())
+            .orElseThrow(() -> new CustomException(ErrorCode.BOARD_NOT_FOUND))
+        : null;
+
+    Board board = Board.builder()
+        .boardName(request.getBoardName())
+        .createdBy(user)
+        .parentBoard(parentBoard)
+        .build();
+
+    boardRepository.save(board);
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)

81-86: 응답 타입 일관성을 개선하세요

일부 메서드는 ResponseEntity<Void>를 반환하지만 (예: createPost, createComment), 다른 메서드들은 void를 직접 반환합니다 (deletePost, updateComment, deleteComment). HTTP 상태 코드를 명시적으로 제어할 수 있도록 모든 엔드포인트에서 ResponseEntity를 사용하는 것을 권장합니다.

다음과 같이 수정하세요:

   @DeleteMapping("/post/{postId}")
-  public void deletePost(
+  public ResponseEntity<Void> deletePost(
       @PathVariable UUID postId,
       @AuthenticationPrincipal CustomUserDetails customUserDetails) {
     UUID userId = customUserDetails.getUserId();
     postService.deletePost(postId, userId);
+    return ResponseEntity.ok().build();
   }

updateCommentdeleteComment 메서드에도 동일하게 적용하세요.

Also applies to: 204-210, 220-225

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5f03a8e and 5ed7c8e.

📒 Files selected for processing (3)
  • backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/repository/PostRepository.java (1 hunks)
  • backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (6 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (2)
backend/src/main/java/org/sejongisc/backend/board/service/PostInteractionService.java (1)
  • Service (28-214)
backend/src/main/java/org/sejongisc/backend/board/service/FileUploadService.java (1)
  • Service (16-92)
backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (1)
backend/src/main/java/org/sejongisc/backend/common/auth/springsecurity/CustomUserDetailsService.java (1)
  • RequiredArgsConstructor (16-38)
🔇 Additional comments (6)
backend/src/main/java/org/sejongisc/backend/board/repository/PostRepository.java (1)

19-25: 이전에 지적된 게시판 필터 누락 문제가 수정되었습니다

명시적인 JPQL @Query를 사용하여 OR 조건을 괄호로 감싸고 board 필터를 전체 검색 조건에 적용했습니다. 이제 제목 또는 내용에 키워드가 포함된 게시물을 해당 게시판 내에서만 올바르게 검색합니다.

backend/src/main/java/org/sejongisc/backend/board/service/PostServiceImpl.java (3)

205-206: 이전에 지적된 검색 필터 문제가 해결되었습니다

searchByBoardAndKeyword 메서드를 사용하여 board 필터가 제목과 내용 검색 조건 모두에 적용됩니다. 다른 게시판의 게시물이 검색 결과에 섞이는 문제가 수정되었습니다.


276-277: 이전에 지적된 부모 게시판 검증 누락 문제가 해결되었습니다

부모 게시판을 boardRepository.findById()로 조회하여 존재하지 않는 경우 BOARD_NOT_FOUND 예외를 반환합니다. 이제 잘못된 parentBoardId로 인한 FK 제약 위반 대신 명확한 에러 응답을 제공합니다.


226-242: 대댓글 구조 조회 로직이 올바르게 구현되었습니다

부모 댓글만 페이징하고, 각 부모 댓글의 자식 댓글을 별도로 조회하여 중첩 구조로 반환합니다. 대댓글 기능을 지원하는 적절한 구현입니다.

backend/src/main/java/org/sejongisc/backend/board/controller/BoardController.java (2)

189-196: 댓글 작성 엔드포인트 구조가 변경되었습니다

이전 리뷰에서 지적된 경로 변수 동기화 문제와 달리, 현재는 /comment 엔드포인트를 사용하며 postId는 요청 본문(CommentRequest)에서 전달됩니다. 서비스 레이어에서 postId 검증이 이루어지므로 기능적으로는 문제없습니다.


37-148: Board 중심 리팩토링이 잘 구현되었습니다

게시판 생성, 게시물 작성/조회/검색 엔드포인트가 boardId 기반으로 일관되게 구현되었습니다. API 설계가 명확하고 Swagger 문서화도 적절합니다.

Copy link
Contributor

@discipline24 discipline24 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants