본문 바로가기

TIL

[TIL] 영속성 전이 CASCADE

인프런 JPA 강의를 들은지 오래된 상태에서 개인 플젝에서 활용하려고 하다보니 까먹어서 해매는 상황이 많이 생겼다. 그렇게 해맸던 부분들이 나올 때마다 다시 공부하고 정리해보려고 한다. 

 

CASECADE 

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티 또한 영속상태로 만들고 싶다면 영속성 전이를 사용하면 된다. 쉽게 말해 부모 엔티티를 저장, 삭제할 때 자식 엔티티 또한 함께 적용시킬 수 있다. CASCADE 옵션이 없으면 연관관계를 맺고 있는 모든 Entity를 하나씩 영속화하거나 제거해야 할 것이다.

 

아래는 Recruitment 엔티티는 Question의 자식 엔티티이다. 두 엔티티는 1:N 의 양방향 연관관계를 맺고있다.

Ricrument Entity / Question Entity에서 1:N 연관관계를 맺고있다.

 

이와 같은 상태에서 Recruitment에 Questioin 객체를 추가하고 영속화, 그리고 조회하는 테스트를 실행해 보았다.

 

마지막 questions.get(0) 부분에서 Index 예외가 발생했다. em.persist(recruitment); 에서 Question객체가 영속화 되지 못했기 때문에 생긴 문제였다.

 

 

이를 해결하기 위해 Recruitment 엔티이에서 Question과 연관관계를 맺고있는 @OneToMany 에 cascade = CascadeType.PERSIST 옵션을 추가하므로써 영속성 전이 기능을 사용할 수 있다.

cascade = CascadeType.PERSIST 옵션 추가

 

이 옵션을 하나 추가하는 것만으로 위의 테스트를 통과할 수 있었다.

 

CASCADE 옵션은 저장, 삭제 등의 연산에 따라 총 6가지가 존재한다.

각각에 대해서 간단하게 정리하면 다음과 같다.

  • PERSIST - em.persist() 을 실행할 때(영속화 할 때) 매개변수로 들어가는 엔티티의 자식 엔티티도 영속화
  • REMOVE - em.remove() 로 엔티티를 제거할 때 자식 엔티티 또한 삭제
  • MERGE - em.merge()로 비/준영속 엔티티에서 영속화 된 엔티티의 자식 엔티티에도 적용(새로운 영속 상태의 엔티티 반환)
  • DETATCH - em.detech()로 준영속화 된 엔티티의 자식 엔티티에도 적용
  • REFRESH - em.refresh()에서 자식 엔티티에도 적용 ※refresh는 데이터베이스로부터 조회하여 엔티티를 덮어쓴다고 함
  • ALL - 위의 모든 옵션을 포함해 적용

 

 

일단 필요한 옵션은 PERSIST 뿐이므로 ALL 이아닌 PERSIST만 적용해보았다. cacade ={CascadeType.PERSIST, CascadeType.REMOVE} 처럼 여러 옵션을 적용해줄 수 있기 때문에 차후에 개발하다 다른 옵션들이 필요할 경우 적용시켜봐야겠다.

'TIL' 카테고리의 다른 글

[TIL] @Secured, @PreAuthorize 비교  (0) 2022.05.08
[TIL] @DataJpaTest  (0) 2022.05.04
TDD의 장점  (0) 2022.04.08
[TIL 2022-3-7] JPQL, BOJ10830 행렬 제곱  (0) 2022.03.08
[TIL 2022-3-6] 평범한 배낭  (0) 2022.03.07