ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 영속성 전이와 고아 객체
    개발/JPA 2023. 7. 13. 13:43

    사용법은 쉬우니까 개념만 짧게 정리하자.

    영속성 전이(CascadeType)

    • 특정 엔티티를 영속 상태로 만들 때 연관 엔티티도 함께 영속 상태로 만들어준다
      • 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장
    • 연관관계 매핑과는 관련이 없다
    • 연관 엔티티를 함께 영속화하는 편리함을 제공하는 것뿐
    • ALL, PERSIST, REMOVE 옵션을 많이 쓴다
    • 단 하나의 부모가 자식들을 관리할 때는 유의미하게 사용할 수 있다
      • 둘의 라이프사이클이 같거나 거의 유사할 때
      • 연관 관계가 딱 하나의 관계에서만 나올 때(단일 소유자) - Parent만 Child를 소유
        • ex. 게시물의 첨부파일(파일을 여러 곳에서 관리하는 거라면 안 되겠지)
    Child child1 = new Child();
    Child child2 = new Child();
    
    Parent parent = new Parent();
    parent.addChild(child1);
    parent.addChild(child2);
    
    manager.persist(parent); // child가 자동으로 들어갔으면 좋겠다 -> cascade

    고아 객체(orphanRemoval = true)

    • 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미
    • 고아 객체 제거는 무조건 하는 것이 아니다
    • 참조 제거된 엔티티가 다른 곳에서 전혀 참조 하지 않는 고아 객체로 판단될 때 삭제
    • 참조하는 곳이 하나일 때 사용해야함!
    • 특정 엔티티가 개인 소유할 때만!
    • @OneToOne, @OneToMany
    • 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능을 활성화하면 부모를 제거할 때 자식도 함께 제거되며 이는 CascadeType.REMOVE처럼 동작한다
    Child child1 = new Child();
    Child child2 = new Child();
    
    // orphanRemoval: O or cascade = CascadeType.ALL, 
    Parent parent = new Parent();
    parent.addChild(child1);
    parent.addChild(child2);
    
    manager.persist(parent);
    manager.persist(child1);
    manager.persist(child2);
    
    manager.flush();
    manager.clear();
    
    Parent findParent = manager.find(Parent.class, parent.getId());
    findParent.getChildList().remove(0); // CasCadeType.ALL에서는 delete query 미발생
    manager.remove(findParent); // child도 지워지는 delete query 발생

    CascadeType.ALL + orphanRemoval = true

    • 스스로 생명주기를 관리하는 엔티티는 manager.persist(), manger.remove()
    • 두 옵션을 모두 활성화하면 부모 엔티티를 통해 자식의 생명 주기를 관리할 수 있다

    이 옵션들은 엔티티의 생명주기들이 같거나 거의 비슷할 때 쓸 수 있는 것이고, 그렇지 않을 때는 따로 관리해야 한다.

    비즈니스 상황에 따라 적용이 다를 것이므로 고민이 필요하다.

    '개발 > JPA' 카테고리의 다른 글

    페치 조인의 한계과 극복(요약 ver.)  (0) 2023.07.25
    MVCC=TRUE  (0) 2023.07.18
    일대다 연관관계를 지양하자  (0) 2023.07.18
    양방향 관계 시 주의사항  (0) 2023.07.11
    시퀀스 최적화  (0) 2023.07.10

    댓글

Designed by Tistory.