Cascade Type이란?
JPA에서의 Cascade Type은 엔티티 간의 연관 관계에서 특정 작업(저장, 삭제 등)이 연관된 엔티티에도 전파되도록 설정하는 옵션
Cascade Type을 통해 부모 엔티티에 대한 작업이 자식 엔티티에도 자동으로 적용되도록 할 수 있다.
주요 Cascade Type:
- CascadeType.PERSIST
- 부모 엔티티를 저장할 때, 연관된 자식 엔티티도 함께 저장됨.
- 예: cascade = CascadeType.PERSIST
- CascadeType.REMOVE
- 부모 엔티티를 삭제할 때, 연관된 자식 엔티티도 함께 삭제됨.
- 주의점: 연관관계가 끊어진다고 자식객체가 삭제된는것은 아니다.(연관관계가 사라지면 삭제되는건 orphanRemoval)
- 예: cascade = CascadeType.REMOVE
- CascadeType.MERGE
- 부모 엔티티를 병합(merge)할 때, 연관된 자식 엔티티도 함께 병합됨.
- 예: cascade = CascadeType.MERGE
- CascadeType.DETACH
- 부모 엔티티를 분리(detach)할 때, 연관된 자식 엔티티도 함께 분리됨.
- 예: cascade = CascadeType.DETACH
- CascadeType.REFRESH
- 부모 엔티티를 새로 고침(refresh)할 때, 연관된 자식 엔티티도 함께 새로 고침됨.
- 예: cascade = CascadeType.REFRESH
- CascadeType.ALL
- 모든 CascadeType(PERSIST, REMOVE, MERGE, DETACH, REFRESH)을 적용함.
- 예: cascade = CascadeType.ALL
이러한 Cascade Type을 적절히 설정함으로써 엔티티 간의 연관 관계를 보다 쉽게 관리할 수 있다. 특히, 복잡한 연관 관계가 있는 엔티티의 경우, Cascade Type을 통해 코드의 복잡성을 줄이고 데이터 일관성을 유지할 수 있다.
JPA에서 Cascade Type을 지정하지 않으면 생기는 문제?
- 연관된 엔티티 관리 문제: 연관된 엔티티를 명시적으로 저장, 삭제 등의 작업을 해줘야 함. 예를 들어, 부모 엔티티를 저장할 때 자식 엔티티를 따로 저장해줘야 함. 이를 자동으로 처리하지 않으면 데이터 일관성이 깨질 수 있다.
- 복잡한 코드: 매번 연관된 엔티티를 처리해야 하므로 코드가 복잡해지고 실수할 가능성이 높아짐. 이를 일일이 관리하는 건 비효율적
- 트랜잭션 관리 문제: 연관된 엔티티를 각각의 트랜잭션으로 관리하면, 트랜잭션 경계를 넘나들며 일관성이 깨질 위험이 있음. 부모와 자식 엔티티가 서로 다른 트랜잭션으로 처리되면 데이터 무결성에 문제가 생길 수 있다.
따라서, JPA에서 Cascade Type을 적절히 지정해줘야 이러한 문제를 예방할 수 있다. Cascade Type을 사용하면 부모 엔티티를 통해 자식 엔티티의 상태를 자동으로 관리할 수 있어 코드의 복잡성을 줄이고, 데이터의 일관성과 무결성을 유지할 수 있다.