프로젝트/프로젝트 회고

[팀 프로젝트-JPA 활용 게시판] 댓글 기능 + orphanRemoval로 깔끔한 삭제 처리

코딩로봇 2025. 4. 21. 16:57

https://github.com/jihwanprogramer/NewSfeed

 

GitHub - jihwanprogramer/NewSfeed

Contribute to jihwanprogramer/NewSfeed development by creating an account on GitHub.

github.com

 

나는 많은 기능 중에 댓글 기능을 맡아 구현을 진행하였다.

 

📌 주요 기능

  • 댓글 생성
  • 댓글 조회
  • 댓글 수정
  • 댓글 삭제
  • 페이징 처리된 댓글 목록 조회
  • orphanRemoval을 활용한 자동 삭제 처리

 

✅ DTO 

 

  • CommentSaveRequestDto: 저장 요청
  • CommentUpdateRequestDto: 수정 요청
  • CommentResponseDto: 단일 댓글 응답
  • CommentPageResponseDto: 페이지네이션용 응답

 

기본적인 CRUD와 페이징 기능구현은 다른 글에서 많이 다루고 기초적인것이므로 이번에는 Cascade 와 orphanRemoval 을 활용한 자동 삭제 처리 기능을 집중적으로 적어볼려고한다.

 

 

🧱 Entity 설계

Board 엔티티 일부

@OneToMany(mappedBy = "board", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Comment> comments = new ArrayList<>();

 

 

  • cascade = REMOVE: 게시글 삭제 시 댓글도 함께 삭제됨
  • orphanRemoval = true: 댓글 리스트에서 제거되면 DB에서도 삭제됨 → 별도 CommentRepository.delete() 호출 없이도 자동 삭제 가능

 

✅ Comment 엔티티

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id")
private Board board;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@OneToMany(mappedBy = "comment", cascade = CascadeType.REMOVE)
    private final List<CommentLike> commentLike = new ArrayList<>();
  • cascade = CascadeType.REMOVE : 댓글 삭제시 댓글 좋아요도 함께 삭제됨

 

📎 마무리

  • orphanRemoval = true의 진짜 활용법: 연관 엔티티 자동 삭제로 리포지토리 호출 최소화
  • 게시판 삭제만으로 댓글까지 자동 삭제되는 구조 설계
  • 정리된 책임 분리와 클린 코드 설계