TIL

2024.05.29.수 영속성 전이

Nellucia 2024. 5. 30. 15:08
영속성 전이

 

자바 스프링에서 영속성 전이(Persistence Cascade)는 엔티티(Entity) 간의 관계에서 한 엔티티에 대한 작업이 다른 관련된 엔티티에 자동으로 전파되는 것을 의미한다. 

 

JPA에서는 여러 가지 영속성 전이 유형을 제공하며, 각 유형은 엔티티 상태 변경 시 해당 상태가 다른 엔티티에 어떻게 전파되는지를 정의한다.

  1. CascadeType.PERSIST
    • 엔티티가 영속화(Persist)될 때 연관된 엔티티도 영속화된다.
  2. CascadeType.MERGE
    • 엔티티가 병합(Merge)될 때 연관된 엔티티도 병합된다.
  3. CascadeType.REMOVE
    • 엔티티가 제거(Remove)될 때 연관된 엔티티도 함께 제거된다.
  4. CascadeType.REFRESH
    • 엔티티가 새로 고침(Refresh)될 때 연관된 엔티티도 함께 새로 고침된다.
  5. CascadeType.DETACH
    • 엔티티가 분리(Detach)될 때 연관된 엔티티도 함께 분리된다.
  6. 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 작업이 자식 엔티티에 전파)

 

  1. 부모 엔티티가 삭제될 때만 자식 엔티티가 삭제
  2. 부모-자식 관계를 맺고 있는 엔티티들에 대해 작동
@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은 부모 엔티티에서 자식 엔티티가 제거될 때, 데이터베이스에서 해당 자식 엔티티도 자동으로 삭제된다. 즉, 부모 엔티티가 자식 엔티티와의 관계를 끊을 때 자식 엔티티가 고아가 되어 데이터베이스에서 삭제되는 것이다.

  1. 부모 엔티티가 삭제되지 않아도 자식 엔티티를 부모 엔티티의 컬렉션에서 제거할 때 자식 엔티티가 삭제된다.
  2. 부모-자식 관계에서 자식 엔티티가 컬렉션에서 제거될 때 작동
@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 작업이 자식 엔티티에 전파됨 부모 엔티티의 컬렉션에서 자식 엔티티를 제거하면 자식 엔티티가 데이터베이스에서 삭제됨