BE/Spring & Spring Boot

[Spring Boot, Java] Cascade

baek-dev 2024. 12. 26. 14:57

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