영속성 전이, 고아 객체
영속성 전이, 고아 객체
영속성 전이(Cascade)
만약에 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 같이 영속 상태로 만들고 싶다면 영속성 전이라는 옵션을통해서 사용할 수 있다.
기본적으로 JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 저장할 수 있다.
연관된게 많으면 그 많은걸 다 영속 시키고 저장할 수는 없기 때문에 CASCADE옵션을 사용해서 연관된 모든 엔티티를 한꺼번에 영속, 비영속 시킨다.
영속성 전이 - 저장
단순하게 연관관계를 가지고 있는 키에 (cascade = CascadeType.PERSIST)을 붙혀주면 된다
해당 속성은 연관관계를 매핑하는 것과는 다르게 정말 단순하게 영속화할 때 연관관계의 엔티티도 함께 영속화해주는 편리함을 제공해주는 것 뿐이다.
영속성 전이 - 삭제
저장을 한꺼번에 했으면, 삭제도 한꺼번에 되야겠죠?
그럼 반대로 (cascade = CascadeType.REMOVE)을 붙혀주면된다
만약에 이거 없으면 무결성 예외가 뜨게 되는거지요..
-옛날?에 성능 테스트를 위해서 만들었던 Random Generator에서 삭제시, 그렇게 무결성 예외가 나왔던 이유는 PERSIST속성은 붙어있었지만 REMOVE속성이 없어서였구나.... 이 무결성 예외를 제거하기 위해서 하나하나 엔티티를 찾아가며 삭제했던 기억이 어렴풋이ㅣ....
CascadeType의 종류
이쯤되면 다른것들도 있나 싶었는데 진짜 여러가지 있음
ALL - 다적용
PERSIST - 영속
MERGE - 병합
REMOVE - 삭제
REFRESH - REFRESH
DETACH - DETACH
이렇게 다양하게 있는데, 여러가지 사용하고 싶다면
cascade = {CascadeType.PERSIST, CascadeType.REMOVE} 이렇게 중괄호를 통해서 여러가지를 넣을 수 있다
PERSIST, REMOVE같은 경우는 em.flush()를 호출하는 시점에 영속성 전이가 발생한다.
고아 객체
고아 객체란 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미하고, JPA에서는 이러한 고아 객체를 자동으로 삭제하는 기능을 제공해주고 있다.
이 기능 또한 단순하게 orphanRemoval = true 이렇게 속성만 추가해주면 어렵지 않게 사용할 수 있다.
원리를 보면 “참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능” 이다
따라서 이 기능은 참조하는 곳이 하나일 때만 사용해야 한다. 만약 참조하는 곳이 다양한 곳이면 문제가 발생
그래서 orphanRemoval 속성은 오직 @OneToMany, @OneToOne에서만 사용할 수 있다.
참고로 지금 이 기능은 뭔가 CascadeType.REMOVE와 유사한데, 똑같은 기능을 하는 것이라고 봐도 무방
영속성 전이 + 고아 객체, 생명주기
그럼 만약 CascadeType.ALL, orphanRemoval = true 이렇게 동시에 함께 적용하면 어떻게 될까..?
일단 엔티티는 EntityManager.persist()을 통해서 등록, EntityManager.remove()을 통해서 삭제된다.
엔티티를 등록, 삭제한다는 것은 생명주기를 관리한다는 의미인데, 이렇게 두 옵션을 모두 적용하면
부모 엔티티를 통해서 자식 엔티티의 생명주기를 관리할 수 있게 된다
자식을 저장하기 위해서는 단순하게 부모에 등록해두면 저장되고 - CascadeType.PERSIST
자식을 삭제하기 위해서는 단순하게 부모에서 삭제하면 삭제된다 - orphanRemoval = true
뭐 배웠냐
JPA 구현체들은 객체 그래프를 마음껏 탐색할 수 있도록 지원하는데 이때 프록시 기술 사용
객체를 조회할 때 연관된 객체를 바로 조회 = 즉시 로딩
객체를 조회할 때 연관된 객체를 사용할 때 그때 가서 조회 = 지연 로딩
객체를 저장, 삭제 시 연관된 객체도 함께 저장, 삭제할 수 있는 기능 = 영속성 전이
부모 엔티티와 연관관계를 끊어진 자식 엔티티를 자동으로 삭제하려면 고아 객체 제거 기능을 사용
Last updated
Was this helpful?