Cascade (영속성전이)는 특정 엔티티의 상태변화 (예: 저장, 삭제)가 연관된 엔티티에도 전이되도록 설정하는 기능
연관관계가 있는 엔티티들 간에 일일이 상태를 동기화하지 않아도, 부모 엔티티의 상태변화를 통해 자식 엔티티의 상태도 자동 변경된다
종류
1. CascadeType.PERSIST
- 부모 엔티티를 저장할때, 연관된 자식 엔티티도 함께 저장된다
- 자식 엔티티를 따로 persist() 하지 않아도 된다
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<>();
}
// 사용 예시
Parent parent = new Parent();
Child child1 = new Child();
Child child2 = new Child();
parent.getChildren().add(child1);
parent.getChildren().add(child2);
// parent만 persist() 호출
em.persist(parent); // child1, child2도 함께 저장
2. CascadeType.MERGE
- 부모 엔티티를 병합(merge()) 할때, 연관된 자식 엔티티도 함께 병합된다
- 이미 존재하는 엔티티를 수정하거나 병합할때 유용함
Parent parent = em.find(Parent.class, 1L);
Child child = new Child();
parent.getChildren().add(child);
// 병합 실행
em.merge(parent); // parent와 child가 모두 병합됨
3. CascadeType.REMOVE
- 부모 엔티티를 삭제할때, 연관된 자식 엔티티도 함께 삭제된다
- 부모와 자식 엔티티간의 생명 주기가 일치해야 할때 사용된다
em.remove(parent); // parent와 연관된 children도 모두 삭제
4. CascadeType.REFRESH
- 부모 엔티티를 삭제할때, 연관된 자식 엔티티도 함께 삭제된다
- 부모와 자식 엔티티간의 생명 주기가 일치해야 할때 사용된다
em.refresh(parent); // parent와 연관된 children도 새로 고침
5. CascadeType.DETACH
- 부모 엔티티를 준영속 상태로 전환할때, 연관된 자식 엔티티도 함께 준영속 상태가 된다
- 영속성 컨텍스트에서 관리되지 않도록 설정함
em.detach(parent); // parent와 연관된 children 모두 준영속 상태
6. CascadeType.All
- 위의 모든 Cascade를 적용한다
@OneToMany(cascade = CascadeType.ALL)
private List<Child> children = new ArrayList<>();
Cascade를 설정하는 위치
연관관계매핑(ManyToOne, OneToMany, ... ) 에서 설정할 수 있다
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<Child> children = new ArrayList<>();
}
Cascade 적용 시 주의 사항
1. 부모-자식 관계가 명확한 경우에만 사용
- Cascade는 부모와 자식의 생명 주기가 일치할 때 사용하는 것이 적합
- 예를 들어, 부모 엔티티가 삭제되면 자식 엔티티도 삭제되어야 할 때
2. 큰 데이터 트리에서 성능 주의
- 많은 연관 엔티티가 있는 경우, Cascade를 사용하면 대량의 쿼리가 실행될 수 있으므로 성능에 영향을 미칠 수 있다
3. CascadeType.REMOVE는 연관 데이터 삭제 주의
- 잘못 설정하면 삭제되지 말아야 할 데이터도 삭제될 수 있다
정리
1. Cascade란?
- 부모 엔티티의 상태 변화(저장, 삭제 등)를 연관된 자식 엔티티로 전파하는 기능
2. Cascade의 종류
- PERSIST: 저장 시 자식 엔티티도 저장
- MERGE: 병합 시 자식 엔티티도 병합
- REMOVE: 삭제 시 자식 엔티티도 삭제
- REFRESH: 새로 고침 시 자식 엔티티도 새로 고침
- DETACH: 준영속 상태로 전환 시 자식 엔티티도 준영속 상태
- ALL: 위 모든 기능 포함
3. 사용 예시
- 생명 주기가 일치하는 관계에서 유용
- 예를 들어, 부모-자식 관계, 주문-상품 관계 등
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] Thymeleaf 타임리프 (0) | 2024.12.29 |
---|---|
[Spring Boot] Page (0) | 2024.12.27 |
[Spring Boot, JPA] 스냅샷 (1) | 2024.12.25 |
[Spring Boot, JPA] 영속성 컨텍스트 (0) | 2024.12.24 |
[Spring Boot] @ManyToOne, @OneToMany (1) | 2024.12.22 |