IT Tech/Java

JPA의 영속성 전파 cascade 옵션에 대해서 알아보기

Developer JS 2024. 1. 17. 15:37
반응형

JPA를 가지고 데이터베이스를 설계할 때, 아무 생각없이 cascade 속성을 사용해왔습니다. cascade란 무엇일까요? 이 옵션을 통해서 어떤 일들이 일어나는 걸까요? 한 번 알아보도록 해봅시다.

 

부안 해변

cascade?

JPA에서 'cascade' 속성은 엔티티 간의 관계에서 한 엔티티에 대한 영속성 관리 작업을 관련 엔티티에도 적용할지 여부를 정의하는 속성입니다. 즉, 한 엔티티의 생명주기 이벤트(예: 저장, 업데이트, 삭제)가 연관된 엔티티에도 전파되도록 할지를 결정하는 설정입니다.

 

728x90

 

말이 되게 어려운데요. 간단하게 삭제로 알아보면, 부모 엔티티를 삭제하면, 해당 부모 엔티티와 연관되어 있는 엔티티들도 삭제가 됩니다. 

 

@Entity
@Table
public class CouponBookmark {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "coupon_id")
    private Coupon coupon;
}

 

이렇게 CouponBookmark라는 엔티티가 있고, Coupon 엔티티와 MaynToOne 관계로 엮여 있다고 했을 때, cascade 속성이 CascadeType.ALL로 되어있으면, 쿠폰을 삭제하면, 해당 쿠폰을 북마크해서 생성된 쿠폰 북마크 테이블의 요소들도 다 삭제가 됩니다. 데이터베이스의 데이터 무결성을 지켜줄 수 있는 속성인 것입니다.

 

원래라면 쿠폰을 삭제할 때 해당 자식 테이블들의 요소들도 다 찾아서 삭제를 해야하지만 이 속성을 사용하면, 부모요소의 엔티티 객체를 삭제하면 관계되어있는 요소들까지 같이 삭제를 시키는 것입니다.

 

Cascade 속성의 종류

 

'cascade'속성은 총 6가지의 종류가 있습니다.

 

  1. 'CascadeType.ALL': 모든 종류의 영속성 관리 작업을 전파하는 속성입니다. (생성, 병합, 삭제, 갱신, 분리)
  2. 'CascadeType.PERSIST': 엔티티를 저장할 때 연관된 엔티티도 저장합니다.
  3. 'CascadeType.MERGE': 엔티티 상태를 병합할 때 연관된 엔티티의 상태도 병합합니다.
  4. 'CascadeType.REMOVE': 엔티티를 삭제할 때 연관된 엔티티도 삭제합니다.
  5. 'CascadeType.REFRESH': 엔티티를 새로 고칠 때(Refresh) 연관된 엔티티도 새로고칩니다.
  6. 'CascadeType.DETACH': 엔티티가 영속성 컨텍스트에서 분리될 때 연관된 엔티티도 분리합니다.
반응형

결론

'cascade'속성은 관계된 엔티티들 간의 생명주기를 쉽게 관리할 수 있게 해주지만, 사용 시 주의가 필요합니다. 예를 들어, 'CascadeType.REMOVE'설정은 한 엔티티를 삭제 할 때 연관된 엔티티까지 삭제되어 부작용이 발생할 수 있기 때문입니다. 따라서 실제 어플리케이션에서 'cascade' 옵션을 사용할 때는 해당 옵션이 어플리케이션의 비지니스 로직과 어떻게 상호작용하는지 충분히 고려해서 사용해야합니다.

반응형