본문 바로가기

Spring/Spring JPA

Cascade(영속성 전이)

Cascade는 JPA(Entity Framework)에서 엔티티와 관련된 연관 관계를 관리할 때 사용하는 중요한 개념 중 하나입니다. 주로 부모 엔티티와 자식 엔티티 간의 연관 관계에서 동작을 정의합니다. Cascade를 통해 부모 엔티티에 대해 수행된 작업이 자식 엔티티에도 영향을 미치도록 설정할 수 있습니다.

 

영속성 전이의 필요성

  • 엔티티 간에 연관 관계가 있을 때, 한쪽 엔티티에서 연관된 엔티티의 상태를 자동으로 관리해야 할 때 사용합니다.
  • 부모-자식 관계가 있는 엔티티에서 주로 활용됩니다.
  • 전이를 설정하면 명시적으로 연관된 엔티티를 persist, remove 등의 메서드로 조작할 필요 없이, 부모 엔티티의 상태 변경 시 자식 엔티티의 상태도 같이 변경됩니다.

Cascade의 주요 옵션

CascadeType은 여러 가지 옵션을 제공하며, 각 옵션은 특정 작업에 대해 부모 엔티티와 자식 엔티티 간 동작을 정의합니다.

  1. CascadeType.PERSIST
    • 부모 엔티티가 저장될 때, 연관된 자식 엔티티도 함께 저장됩니다.
  2. CascadeType.MERGE
    • 부모 엔티티가 병합(업데이트)될 때, 연관된 자식 엔티티도 병합됩니다.
  3. CascadeType.REMOVE
    • 부모 엔티티가 삭제되면 연관된 자식 엔티티도 삭제됩니다.
  4. CascadeType.REFRESH
    • 부모 엔티티를 새로 고침할 때, 자식 엔티티도 새로 고침됩니다.
  5. CascadeType.DETACH
    • 부모 엔티티가 영속성 컨텍스트에서 분리되면, 연관된 자식 엔티티도 분리됩니다.
  6. CascadeType.ALL
    • 위의 모든 옵션을 포함합니다. 즉, PERSIST, MERGE, REMOVE, REFRESH, DETACH가 모두 적용됩니다.

 

사용 예시

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

위 코드는 부모(Parent) 엔티티가 자식(Child) 엔티티와 연관 관계를 맺고 있으며, CascadeType.ALL을 설정하여 부모 엔티티에서 발생한 모든 작업이 자식 엔티티에도 적용되도록 합니다.

 

실제 동작 예제

1. 부모와 자식 저장

Parent parent = new Parent();
parent.setName("Parent1");

Child child1 = new Child();
child1.setName("Child1");
child1.setParent(parent);

Child child2 = new Child();
child2.setName("Child2");
child2.setParent(parent);

parent.getChildren().add(child1);
parent.getChildren().add(child2);

entityManager.persist(parent); // parent와 child들이 모두 저장됨

 

2. 부모 삭제

entityManager.remove(parent); // parent와 연관된 child들도 모두 삭제됨

 

주의 사항

  1. 불필요한 연산 방지: 모든 연관 관계에 CascadeType.ALL을 사용하면 성능 문제가 발생할 수 있습니다. 필요에 따라 적절한 옵션을 선택하세요.
  2. orphanRemoval: 자식 엔티티가 부모와의 관계에서 제외되었을 때 자동으로 삭제되도록 설정하려면 orphanRemoval = true를 사용합니다.
  3. 트랜잭션 관리: 연관된 작업이 많아질수록 트랜잭션 관리가 중요해집니다. 데이터베이스 상태를 항상 주의 깊게 살펴야 합니다.

'Spring > Spring JPA' 카테고리의 다른 글