ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] orphanRemoval
    JPA 2024. 9. 10. 22:28

    부모 엔티티가 자식 엔티티의 생명주기를 관리하고

     

    1) 부모가 삭제되거나

    2) 자식 엔티티가 부모와의 연관관계에서 제거될때

     

    해당 자식 엔티티를 자동으로 삭제해주는 기능이다

     

     

    예를 들어 특정 Product에 해당하는 Product Image들이 있다면

    해당 Product가 삭제되었을때 해당 Product에 대한 정보를 알려주는 Image들도 같이 삭제해주는게 맞다

     

    이럴때 직접 ImageRepository에서 해당 Product를 외래키로 갖는 Image들을 찾아서 삭제하는 쿼리를 직접 작성하지 않고 orphanRemoval=TRUE를 써주면 알아서 관련된 Image들을 삭제해주는 기능이 orphanRemoval인 것이다

     


    [orphanRemoval은 특정 자식에 대한 부모가 한 명일때만 사용해야한다!!]

     

    특정 엔티티가 단일 소유할 때, 참조하는 곳이 하나일 때 사용

     

    부모가 특정 자식을 혼자만 소유할때자식을 참조하는 부모가 한 명일때만 사용하자

     

    이를 어노테이션으로 말하면 @OneToOne, @OneToMany 쪽에서만 사용 하자!

    이는 부모 쪽이라는 얘기다

    부모-자식 관계가 1-1이거나 부모-자식 관계가 1-N일때

     

    추가적으로 부모를 제거할 때 자식도 같이 제거된다.(CascadeType.REMOVE와 유사)

     

    cf) 어떤 이유인지는 모르겠지만 orphanRemoval = true 단독으로는 동작하지 않고

    cascade = CascadeType.PERSIST 또는 ALL 옵션과 같이 사용해야 동작한다


     

    orphanRemoval은 만약 자식이 부모와 연관관계를 안맺은 고아이면

    자동으로 삭제되는옵션인데

     

    여기서 고아가 될 수 있는 방법은 두 가지가 있다

     

    1. 부모가 뒤졌거나

    2. 부모가 없거나

     

    이걸 그대로 적용해보면

     

    1. 연관된 부모 엔티티가 삭제됨

    2. 연관된 부모 엔티티와 연관관계가 끊어짐 (그리고 다른 부모 엔티티와 연관관계가 안맺어짐)

     


    [cascadeType.REMOVE vs orphanRemoval = true]

     

    cascadeType.REMOVE가 달렸을때 부모를 삭제하면 자식과의 연관관계가 끊어지는데

    CasacdeType.REMOVE는 논리적으로 참조를 변경시켜서 무결성 오류만 안나게 할뿐, 실제로 자식 데이터는 남게 된다!

     

    이때 orphanRemoval = true 옵션이 등장한다

     

    teamRepository.remove(team) 을 하면 member는 부모 객체인 team과의 연관관계가 끊어지고 고아객체가 된다

     

    이렇게 고아 객체가 되었을 경우, 해당 고아 객체를 자동으로 삭제해주는 옵션이 orphanRemoval = true 옵션이다

     


    영속성 전이 + 고아 객체

    cascade = ALL과 orphanRemoval = true 옵션을 같이 사용하면 부모 엔티티를 통해서 자식 엔티티의 생명 주기를 관리할 수 있다.

    'JPA' 카테고리의 다른 글

    [JPA] 1+N 문제  (0) 2025.04.26
    [JPA] 즉시로딩 지연로딩 (FetchType)  (0) 2025.04.26
    [JPA] cascadeType  (0) 2024.09.05
    [JPA] @JoinColumn의 이해  (0) 2024.09.01
    [JPA] JPA의 이해  (0) 2024.07.28