JPA CascadeType 종류
1. 배경
- JPA 개인 프로젝트를 진행하던 중, 게시판과 파일, 댓글에서 @OneToMany - @ManyToOne의 관계에서 영속성 관리에서 문제가 발생되었으며, 영속성에서 참조된 객체를 지워주지 않았기 때문에 발생하였다. 더 정확한 내용은 알아볼 예정이다.
Entity의 상태
- Transient : JPA가 모르는 상태 (단순 객체 생성)
- Persistent : JPA가 관리중인 상태 (1차 캐시, Dirty Checking, Write Behind, ...)
- Detached : JPA가 더이상 관리하지 않는 상태
- Removed : JPA가 관리하긴 하지만 삭제하기로 한 상태
2. 내용
- CascadeType.PERSIST
엔티티를 영속화 할 때이 필드에 보유 된 엔티티도 유지합니다. EntityManager가 flush 중에 새로운 엔티티를 참조하는 필드를 찾고이 필드가 CascadeType.PERSIST를 사용하지 않으면 오류이므로이 Cascade 규칙의 자유로운 적용을 제안합니다. - CascadeType.MERGE
엔티티 상태를 병합 할 때, 이 필드에 보유 된 엔티티도 병합하십시오. - CascadeType.REFRESH
엔티티를 새로 고칠 때, 이 필드에 보유 된 엔티티도 새로 고칩니다. - CascadeType.REMOVE
엔티티를 삭제할 때, 이 필드에 보유 된 엔티티도 삭제하십시오. - CascadeType.DETACH
부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다. - CascadeType.ALL
모든 Cascade 적용
즉시 로딩 지연로딩
JPA에서는 데이터를 조회할 때 즉시 로딩(EAGER)과 지연 로딩(LAZY) 두 가지 방식이 있다. 이 두 가지 방식을 간단하게 설명하면 즉시 로딩은 데이터를 조회할 때 연관된 데이터까지 한 번에 불러오는 것이고, 지연 로딩은 필요한 시점에 연관된 데이터를 불러오는 것이라고 할 수 있다.
즉시 로딩(EAGER)
- @xxToxx(fetch = fetchType.EAGER)
다음과 같이 Member 엔티티와 Team 엔티티가 N:1 매핑으로 관계를 맺고 있다.
지연 로딩(LAZY)
- @xxToxx(fetch = fetchType.LAZY)
아래와 같이 지연 로딩으로 설정하고 Member를 조회해보면 즉시 로딩 방식과 달리 Team을 조회하는 쿼리가 생성되지 않고 Member를 조회하는 쿼리만 나가고, 실제로 팀을 사용하는 시점에 Team을 조회하는 쿼리가 나간다.
'항해 99(9기) > 항해 일일' 카테고리의 다른 글
항해 99 31일차 (0) | 2022.10.19 |
---|---|
항해 99 30일차 (0) | 2022.10.18 |
항해 99 25일차 (0) | 2022.10.13 |
항해 99 23일차 (0) | 2022.10.11 |
항해 99 20일차 (0) | 2022.10.08 |