2024.05.29.수 영속성 전이
영속성 전이
자바 스프링에서 영속성 전이(Persistence Cascade)는 엔티티(Entity) 간의 관계에서 한 엔티티에 대한 작업이 다른 관련된 엔티티에 자동으로 전파되는 것을 의미한다.
JPA에서는 여러 가지 영속성 전이 유형을 제공하며, 각 유형은 엔티티 상태 변경 시 해당 상태가 다른 엔티티에 어떻게 전파되는지를 정의한다.
- CascadeType.PERSIST
- 엔티티가 영속화(Persist)될 때 연관된 엔티티도 영속화된다.
- CascadeType.MERGE
- 엔티티가 병합(Merge)될 때 연관된 엔티티도 병합된다.
- CascadeType.REMOVE
- 엔티티가 제거(Remove)될 때 연관된 엔티티도 함께 제거된다.
- CascadeType.REFRESH
- 엔티티가 새로 고침(Refresh)될 때 연관된 엔티티도 함께 새로 고침된다.
- CascadeType.DETACH
- 엔티티가 분리(Detach)될 때 연관된 엔티티도 함께 분리된다.
- CascadeType.ALL
- 모든 영속성 전이 작업(Persist, Merge, Remove, Refresh, Detach)이 연관된 엔티티에도 전파된다.
영속성 전이를 사용하지 않으면, 직접 save()를 호출해가며 영속화를 해야하는데 cascade를 활용한 영속성 전이는 연관된 Entity에 자동으로 전파가 되기 때문에 Entity관리가 더 간편해진다. 이를 통해 코드의 복잡성을 줄이고 데이터베이스의 일관성을 유지할 수 있다.
orphanRemoval
JPA에서 orphanRemoval 속성은 부모-자식 관계에서 부모 엔티티가 자식 엔티티를 제거할 때, 고아(Orphan) 상태가 된 자식 엔티티를 자동으로 삭제하는 기능을 제공한다. orphanRemoval은 주로 @OneToMany와 @OneToOne 관계에서 사용된다.
CascadeType.REMOVE와 orphanRemoval는 둘 다 엔티티를 삭제하는 데 사용되지만, 동작 방식과 사용하는 방식이 다르다.
1.CascadeType.REMOVE
CascadeType.REMOVE는 부모 엔티티가 삭제될 때 연관된 자식 엔티티도 함께 삭제되도록 한다.
(부모 엔티티에 대한 remove 작업이 자식 엔티티에 전파)
- 부모 엔티티가 삭제될 때만 자식 엔티티가 삭제
- 부모-자식 관계를 맺고 있는 엔티티들에 대해 작동
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade = CascadeType.REMOVE)
private List<Child> children = new ArrayList<>();
// Getters and Setters
}
@Entity
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
위 코드에서 Parent 엔티티가 삭제될 때 Child엔티티도 자동으로 삭제된다.
2.orphanRemoval
orphanRemoval은 부모 엔티티에서 자식 엔티티가 제거될 때, 데이터베이스에서 해당 자식 엔티티도 자동으로 삭제된다. 즉, 부모 엔티티가 자식 엔티티와의 관계를 끊을 때 자식 엔티티가 고아가 되어 데이터베이스에서 삭제되는 것이다.
- 부모 엔티티가 삭제되지 않아도 자식 엔티티를 부모 엔티티의 컬렉션에서 제거할 때 자식 엔티티가 삭제된다.
- 부모-자식 관계에서 자식 엔티티가 컬렉션에서 제거될 때 작동
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(orphanRemoval = true)
private List<Child> children = new ArrayList<>();
// Getters and Setters
public void removeChild(Child child) {
children.remove(child);
}
}
@Entity
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
위 예제에서, Parent 엔티티의 children 리스트에서 자식 엔티티를 제거하면 해당 자식 엔티티는 데이터베이스에서 삭제된다.
특징 | CascadeType.REMOVE | orphanRemoval |
삭제 시점 | 부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제됨 | 부모 엔티티의 컬렉션에서 자식 엔티티가 제거될 때 자식 엔티티가 삭제됨 |
적용 대상 | 부모 엔티티와 자식 엔티티의 관계가 있을 때 | 부모 엔티티와 자식 엔티티의 관계가 있을 때 |
사용하는 경우 | 부모 엔티티가 삭제될 때 관련된 모든 자식 엔티티를 함께 삭제하고 싶을 때 | 부모-자식 관계에서 자식 엔티티가 고아 상태가 될 때 자동으로 삭제하고 싶을 때 |
설정 위치 | @OneToMany, @ManyToOne, @OneToOne, @ManyToMany | 주로 @OneToMany, @OneToOne |
주요 동작 방식 | 부모 엔티티에 대한 remove 작업이 자식 엔티티에 전파됨 | 부모 엔티티의 컬렉션에서 자식 엔티티를 제거하면 자식 엔티티가 데이터베이스에서 삭제됨 |