0. 개요
- 웹 개발 공부를 했다면 Cascade라는 단어가 익숙할 수 있다.
- CSS(Cascade Style Sheet)에서 사용되는 단어이기 때문이다.
- Cascade라는 단어는 폭포처럼 흐른다는 의미를 갖는다.
- 이를 의역해보면 연쇄적인, 종속적인, 상속적인, 전이되는 등으로 해석할 수 있다.
- 이처럼 어떤 속성을 전수하는 것을 Cascade라고 표현한다.
- 이번 포스팅에서는 JPA에서 사용하는 Cascade에 대해서 알아보자.
1. 영속성 전이(Cascade)
a) 영속성 전이란?
- 어떤 Entity를 영속성 Context에 등록할 때, 연관 객체도 함께 등록하는 기능이다.
- 즉, 어떤 Entity를 영속 상태로 만들 때, 연관 객체 또한 함께 영속 상태가 되도록 하는 것이다.
- 예를 들어, 부모 Entity를 영속성 Context에 저장할 때, 자식 Entity도 함께 저장되도록 하는 상황이 여기에 해당된다.
* 오해하지 말자!!!
- 영속성 전이(= Cascade)는 연관 관계 매핑 또는 상속과는 아무 상관없는 독립적인 기능이다.
b) 예시 코드
- 다음 예시 코드를 보면서 Cascade 기능에 대해서 알아보자.
@Entity
public class Parent {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "parent") // 양방향 매핑
private List<Child> childList = new ArrayList<>();
public void addChild(Child child) { // 연관 관계 편의 메서드
childList.add(child);
child.setParent(this);
}
// Getter & Setter 생략
}
@Entity
public class Child {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
// Getter & Setter 생략
}
- 위와 같은 관계의 객체가 있는 경우, 각 객체를 생성하여 저장하려면 다음과 같은 코드를 작성해야 한다.
- 위의 코드처럼, 총 3번의 persist() 메서드를 호출해야 영속성 Context에 객체들을 등록할 수 있다.
- 만약 개발자가 Parent 중심적으로 코드를 작성하고 싶고, 중복되는 코드를 최소화하고 싶다면 어떻게 해야 할까?
- 이 경우, Cascade 옵션을 통해 해결할 수 있다.
c) cascade 옵션 사용
- 위에서 언급한 문제를 해결하기 위해서 cascade를 사용한다.
- cascade 기능은 다음과 같이 옵션으로 설정할 수 있다.
- 이처럼 cascade 옵션을 설정하면, Parent 객체를 persist()할 때 연관 객체 모두를 함께 등록한다.
- cascade 옵션을 사용하면 다음과 같이 실행 코드를 변경할 수 있다.
- cascade 옵션을 사용했기 때문에 Parent 객체를 persist()할 때 Child 객체를 함께 등록하게 된다.
- 위의 코드를 실행하면 다음과 같은 쿼리문이 발생하는 것을 확인할 수 있다.
- 이처럼 Parent 객체를 persist()할 때, JPA가 알아서 연관 객체(= Child)를 함께 등록하는 것을 확인할 수 있다.
2. Cascade 옵션의 종류
a) CascadeType.ALL
- Cascade 옵션을 사용할 때, 가장 많이 사용하는 옵션
- 모든 연관 객체를 영속화하는 기능이다.
b) CascadeType.PERSIST
- 연관 객체를 등록할 때만 Cascade 옵션을 적용하는 기능이다.
- 즉, 영속화된 객체를 삭제시킬 때에는 Cascade 옵션이 작동하지 않도록 하는 기능이다.
c) CascadeType.REMOVE
- 어떤 객체를 삭제(= 비영속화)할 때, 모든 연관 객체를 함께 삭제하는 기능이다.
d) 기타
- 이 외에도 MERGE, REFRESH, DETACH 옵션이 존재하는데, 이들은 잘 사용하지 않는다.
- Cascade 사용 시 위의 3가지 옵션을 가장 많이 사용한다.
- 궁금하다면 따로 찾아보자.
3. Cascade 적용 시점
a) 언제 사용할까?
- Cascade 옵션은 어떤 부모 객체 혼자서 모든 자식 객체를 관리하는 경우 사용하는 것을 권장한다.
- 즉, 자식 객체를 관리하는 부모가 단일 객체(= 단일 소유)인 경우에만 사용하는 것을 권장한다.
- 더불어, 부모 객체와 자식 객체의 라이프 사이클이 동일할 때 사용하는 것을 권장한다.
b) 사용 시 주의사항
- 자식 객체를 다수의 부모 객체가 관리되는 경우
- 하위 객체 중 일부가 다른 상위 객체에 의해 관리되는 경우
- 즉, 단일 부모가 아닌 다수의 상위 객체에 의해 자식 객체가 관리되는 경우는 사용하면 안된다.
'Back-end > JPA 개념' 카테고리의 다른 글
18. 값 타입(1) - 개념 (0) | 2022.04.14 |
---|---|
17. 고아 객체(Orphan) (0) | 2022.04.13 |
15. 지연 로딩 & 즉시 로딩(N + 1 문제) (0) | 2022.04.11 |
14. 프록시(Proxy) (0) | 2022.04.08 |
13. @MappedSuperClass (0) | 2022.04.07 |
댓글