[프로그래밍] JPA

[JPA] JPA와 cascade, orphanRemoval

JHVan 2024. 5. 5. 19:42

엔티티 간 관계에서 부모 엔티티에 대한 변경이 자식 엔티티에 어떻게 전파되는지, 그리고 연관관계가 끊긴 객체(Orphan)를 어떻게 처리할 것인지를 정의함.

public class Parent {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
    여러 cascade 를 동시에 적용하려면
    @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();

}

public class Child {
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

Cascade

cascade 속성은 특정 엔티티의 상태 변경을 관계가 있는 다른 엔티티에 전파할지 여부를 결정.

부모 엔티티를 관리할 때 자동으로 연관된 자식 엔티티도 관리하고 싶을 때 cascade 속성을 사용.

cascade의 타입:

  • PERSIST: 부모 엔티티가 영속화될 때 연관된 자식 엔티티도 영속화.
  • REMOVE: 부모 엔티티가 제거될 때 연관된 자식 엔티티도 제거.
  • MERGE: 부모 엔티티가 병합될 때 연관된 자식 엔티티도 병합.
  • REFRESH: 부모 엔티티가 새로고침될 때 연관된 자식 엔티티도 새로고침.
  • DETACH: 부모 엔티티가 분리될 때 연관된 자식 엔티티도 분리.
  • ALL: 위 모든 작업을 적용.

예를 들어, 한 부모 엔티티에 여러 자식 엔티티가 연관되어 있을 때, 부모 엔티티를 저장하면 연관된 모든 자식 엔티티도 함께 저장되길 원한다면 PERSIST와 MERGE를 사용할 수 있음.

orphanRemoval

orphanRemoval은 부모 엔티티와의 관계가 끊어진 자식 엔티티를 자동으로 삭제할지 여부를 결정.

자식 엔티티가 더 이상 참조되지 않을 때 이를 데이터베이스에서 제거함으로써 데이터 일관성을 유지할 수 있음.

한 부모 엔티티에 연관된 자식 엔티티 중 일부를 컬렉션에서 제거하고 그 상태를 데이터베이스에 반영하고자 할 때, orphanRemoval=true 설정을 사용할 수 있음.

설정하면 컬렉션에서 제거된 자식 엔티티는 고아 객체(orphan)가 되며, JPA는 이러한 고아 객체를 데이터베이스에서 자동으로 삭제.

 

주의사항

Cascade와 orphanRemoval은 관련된 엔티티의 상태 변경을 자동으로 전파하므로 의도치 않은 데이터 손실이나 성능 문제를 초래할 수 있음.

따라서 각 cascade 유형의 의미를 정확히 이해하고 필요한 곳에만 적용해야 하고, 특히 관계의 방향에 주의해야 함.

Cascade 옵션과 orphanRemoval은 관계의 “주인” 측에서 사용해야 함을 명심.

관계가 양방향일 경우, cascade 설정이나 orphanRemoval이 적용되는 측을 정확히 사용해야 의도치 않은 데이터 손실을 막을 수 있음.

'[프로그래밍] JPA' 카테고리의 다른 글

[JPA] JPA 와 연관관계  (0) 2024.05.05
[JPA] JPA와 Column  (0) 2024.05.05
[JPA] JPA의 기본 키 생성 전략  (0) 2024.05.04
[JPA] Entity Mapping  (0) 2024.05.04
[JPA] JPA의 영속성 컨텍스트  (0) 2024.05.03