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

cascade?
JPA에서 'cascade' 속성은 엔티티 간의 관계에서 한 엔티티에 대한 영속성 관리 작업을 관련 엔티티에도 적용할지 여부를 정의하는 속성입니다. 즉, 한 엔티티의 생명주기 이벤트(예: 저장, 업데이트, 삭제)가 연관된 엔티티에도 전파되도록 할지를 결정하는 설정입니다.
말이 되게 어려운데요. 간단하게 삭제로 알아보면, 부모 엔티티를 삭제하면, 해당 부모 엔티티와 연관되어 있는 엔티티들도 삭제가 됩니다.
@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가지의 종류가 있습니다.
- 'CascadeType.ALL': 모든 종류의 영속성 관리 작업을 전파하는 속성입니다. (생성, 병합, 삭제, 갱신, 분리)
- 'CascadeType.PERSIST': 엔티티를 저장할 때 연관된 엔티티도 저장합니다.
- 'CascadeType.MERGE': 엔티티 상태를 병합할 때 연관된 엔티티의 상태도 병합합니다.
- 'CascadeType.REMOVE': 엔티티를 삭제할 때 연관된 엔티티도 삭제합니다.
- 'CascadeType.REFRESH': 엔티티를 새로 고칠 때(Refresh) 연관된 엔티티도 새로고칩니다.
- 'CascadeType.DETACH': 엔티티가 영속성 컨텍스트에서 분리될 때 연관된 엔티티도 분리합니다.
결론
'cascade'속성은 관계된 엔티티들 간의 생명주기를 쉽게 관리할 수 있게 해주지만, 사용 시 주의가 필요합니다. 예를 들어, 'CascadeType.REMOVE'설정은 한 엔티티를 삭제 할 때 연관된 엔티티까지 삭제되어 부작용이 발생할 수 있기 때문입니다. 따라서 실제 어플리케이션에서 'cascade' 옵션을 사용할 때는 해당 옵션이 어플리케이션의 비지니스 로직과 어떻게 상호작용하는지 충분히 고려해서 사용해야합니다.
'IT Tech > Java' 카테고리의 다른 글
SpringBoot 프로젝트에 SPA 프로젝트 연결하기 (0) | 2024.07.29 |
---|---|
Spring Data JPA - Specification이란? (0) | 2024.03.25 |
자바 - 최대공약수를 가장 빠르게 찾는 방법: 유클리드 호제법 알고리즘 (0) | 2024.01.24 |
자바(JAVA)의 Map에서 키와 값으로 요소 찾기 - containsKey와 containsValue 활용하기 (0) | 2024.01.09 |
QuickSort에 대해서 알아봅시다~ Java Array, List 정렬 구현하기 (1) | 2024.01.02 |