Cascade

1 분 소요

Cascade란 ?


  • Entity 간 연관 관계에서 발생하는 작업을 관리하는 JPA의 option
  • Cascade option에 따라서 부모 Entity에 대한 특정 작업이 자동으로 연관된 자식 Entity에 영향을 줌
  • 데이터의 일관성을 유지하고 연관된 Entity간의 작업을 간편하게 처리하기 위해 사용함



Cascade의 종류


ALL(모든 작업 전파)

  • cascade = CascadeType.ALL
  • 부모 Entity에 대한 저장, 업데이트, 삭제 작업이 자식 Entity에 동일하게 전파됨

PERSIST(저장 작업 전파)

  • cascade = CascadeType.PERSIST
  • 부모 Entity가 저장 시 자식 Entity도 자동으로 저장됨

REMOVE(삭제 작업 전파)

  • cascade = CascadeType.REMOVE
  • 부모 Entity 삭제 시 자식 Entity도 자동으로 삭제됨

MERGE(병합 작업 전파)

  • cascade = CascadeType.MERGE
  • 부모 Entity 병합 시 자식 Entity도 자동으로 병합됨

REFRESH(새로고침 작업 전파)

  • cascade = CascadeType.REFRESH
  • 부모 Entity 새로 고침시 자식 Entity도 자동으로 새로 고침됨

DETACH(분리 작업 전파)

  • cascade = CascadeType.DETACH
  • 부모 Entity 분리 시 자식 Entity도 자동으로 분리됨

LOCK(잠금 작업 전파)

  • cascade = CascadeType.LOCK
  • 부모 Entity 잠금 시 자식 Entity도 자동으로 잠금됨

REPLICATE(복제 작업 전파)

  • cascade = CascadeType.REPLICATE
  • 부모 Entity 복제 시 자식 Entity도 자동으로 복제됨


Example Code ( Cascade )

부모 Entity인 Test의 저장, 삭제 작업이 이루어지면 자식 Entity인 Example도 작업을 전파 받음

@Entity
public class Test{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @OneToMany(mappedBy = "post", casacade = {CascadeType.PERSIST, CascadeTpe.REMOVE})
    private List<Example> example = new ArrayList<>();
}



Cascade 사용 시 주의할 점


  • 무한 루프, 스택 오버플로우와 같은 문제가 발생하지 않도록 해야 함
  • 필요하지 않은 작업에 Cascade 사용 시 성능 저하가 발생할 수 있음
  • Cascade 사용 시 자식 Entity에 의도하지 않은 결과가 발생하지 않도록 해야 함

  • Cascade되는 Entity와 Cascade를 설정하는 Entity의 LifeCycle이 동일하거나 비슷해야 함
  • Cascade되는 Entity가 Cascade를 설정하는 Entity에서만 사용되어야 함



One-to-Many & Many-to-One


One-to-Many

  • One쪽의 Entity에서 Cascade를 설정함
  • One쪽의 Entity가 저장, 업데이트, 삭제되면 연관된 Many쪽의 Entity에도 동일한 작업이 전파됨


Many-to-One

  • Many쪽의 Entity에서 Cascade를 설정함
  • Many쪽의 entit가 저장, 업데이트, 삭제될 때 One쪽의 Entity에 어떤 작업을 전파할지 결정할 수 있음



OrphanRemoval(고아 엔티티 제거)


  • 부모 Entity에 @OneToMany 또는 @OneToOne을 사용하여 관계가 설정되있음
  • 자식 Entity에 @ManyToOne 또는 @OneToOne을 사용하여 부모 Entity와의 관계가 설정되있음
  • 부모 Entity에서 관계 필드에 orphanRemoval = true 옵션 추가

  • 부모 Entity와의 관계가 끊어진 자식 Entity는 자동으로 제거하는 옵션
  • 부모-자식 관계의 일관성을 유지하고 불필요한 data를 삭제함


Example Code ( Cascade & OrphanRemoval )

자식 Entity가 부모와의 관계가 끊어지면 자동으로 삭제됨

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

    @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;

    @ManyToOne
    private Parent parent;

}