인프런 JPA 강의를 들은지 오래된 상태에서 개인 플젝에서 활용하려고 하다보니 까먹어서 해매는 상황이 많이 생겼다. 그렇게 해맸던 부분들이 나올 때마다 다시 공부하고 정리해보려고 한다.
CASECADE
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티 또한 영속상태로 만들고 싶다면 영속성 전이를 사용하면 된다. 쉽게 말해 부모 엔티티를 저장, 삭제할 때 자식 엔티티 또한 함께 적용시킬 수 있다. CASCADE 옵션이 없으면 연관관계를 맺고 있는 모든 Entity를 하나씩 영속화하거나 제거해야 할 것이다.
아래는 Recruitment 엔티티는 Question의 자식 엔티티이다. 두 엔티티는 1:N 의 양방향 연관관계를 맺고있다.


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

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

이를 해결하기 위해 Recruitment 엔티이에서 Question과 연관관계를 맺고있는 @OneToMany 에 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 |