38. 오류 해결 - 댓글이 있는 게시글 삭제하기

송민경's avatar
Mar 19, 2024
38. 오류 해결 - 댓글이 있는 게시글 삭제하기

1. 원인

  • FK 제약 조건 때문에 게시글을 삭제하면 댓글이 참조하는 게시글이 사라지기 때문에 삭제가 되지 않는 오류 발생
 

2. 해결 방법

  • 댓글을 삭제하고 게시글 삭제하기
  • 댓글(자식)의 FK에 값을 NULL로 update하고 게시글 삭제하기
  • 어노테이션을 이용해서 (cascade remove) 도움 받기 - 우리가 쓸 것!
 

3. Cascade

  • JPA(Java Persistence API)에서 엔티티 간의 연관 관계를 관리하는 데 사용되는 기능 중 하나
  • 한 엔티티의 상태 변화가 다른 연관된 엔티티에도 전파되는 방식을 정의
 
  • CASCADE : 부모 엔티티의 상태 변화가 자식 엔티티에 전파
부모 엔티티가 삭제될 때 연관된 모든 자식 엔티티도 함께 삭제
  • ALL : 모든 상태 변화를 포함
부모 엔티티의 모든 상태 변화가 자식 엔티티에 전파됩니다.
  • REMOVE : 부모 엔티티가 삭제될 때 해당 부모와 연관된 자식 엔티티도 함께 삭제
  • PERSIST : 부모 엔티티가 저장될 때 해당 부모와 연관된 자식 엔티티도 함께 저장
  • MERGE : 부모 엔티티가 병합될 때 해당 부모와 연관된 자식 엔티티도 함께 병합
  • REFRESH : 부모 엔티티가 새로 고침될 때 해당 부모와 연관된 자식 엔티티도 함께 새로 고침
  • DETACH : 부모 엔티티가 분리될 때 해당 부모와 연관된 자식 엔티티도 함께 분리
  • ALL-DELETE-ORPHAN : 부모 엔티티의 모든 연관된 자식 엔티티를 삭제하거나 분리
연관된 자식 엔티티가 부모와의 관계를 끊는 경우에 유용
cascade = CascadeType.REMOVE // 게시글이 삭제되면 자식들도 다 삭제
 

4. 고아 객체(Orphan Removal)

  • JPA에서 관계를 맺고 있는 엔티티 중 한 쪽의 엔티티가 다른 한 쪽과의 관계를 끊을 때
해당 엔티티를 삭제할지 여부를 설정하는 기능
  • 자식 엔티티가 부모 엔티티와의 관계를 끊을 때 자동으로 삭제되어야 하는지 여부를 결정
  • 디폴트가 false
orphanRemoval : 기본이 false
자식 엔티티를 부모 엔티티의 컬렉션에서 제거해도 해당 자식 엔티티는 삭제되지 않음
해당 자식 엔티티는 "고아"가 되어 영속성 컨텍스트 밖에서 사용 가능
orphanRemoval : true
자식 엔티티를 부모 엔티티의 컬렉션에서 제거할 때 자동으로 삭제
영속성 컨텍스트에서 삭제되고 다음 트랜잭션에서 해당 엔티티가 실제로 삭제
 

5. 게시글 삭제 방법

  • 자식 PK를 null 처리한다. -> null 처리하는 방법 : update
  • 실무에서 하는 방법 -> FK 걸지 않음
  • CASECADE REMOVE 옵션 // 우리가 사용할 것

    6. insert 하기

    • 게시글에 댓글 컬렉션을 PERSIST를 걸어서 CASECADE 옵션으로 거는 것
     
    Share article
    RSSPowered by inblog