강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 서비스 개발

CASCADE 질문드립니다.

작성

·

15

0

안녕하세요. Order와 OrderItem엔티티에 있는 CASCADE에 대해 기본편을 복습해도 헷갈린 부분이 있어서 질문드립니다.

 

em.persist(order)를 하면 CascadeType.ALL때문에 Delivery랑 OrderItem도 insert가 되는거 같은데,

@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "order_id") private Order order; OrderItem에 있는 이 부분에 CASCADE를 적어준게 아니라

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); 왜 Order에 있는 여기에다가 CASCADE를 적어준것일까요? 어디에다 두어도 상관없을거 같은데, 특별한 규칙이 있는것인지 질문드립니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.

질문해주신 @OneToMany@ManyToOne 관계에서 CascadeType의 사용에 대한 혼동이 이해됩니다.

CascadeType 사용 위치

CascadeType은 주로 부모-자식 관계에서 부모 엔티티에 설정됩니다. 여기서 “부모”는 외래 키 관계에서 연관 관계의 주인이 아닌, 이 연관 관계를 소유하고 있는 쪽입니다.

@OneToMany에 CascadeType을 설정할까요?

  1. 부모 엔티티 중심: @OneToMany 관계에서는 부모 엔티티(이 경우 Order)가 자식 엔티티(여러 OrderItem)를 가지고 있는 구조입니다. 부모의 생명주기와 자식의 생명주기를 동일하게 관리하고 싶다면 부모 엔티티의 @OneToMany 연관 관계에 CascadeType을 설정합니다.

  2. 관리 편리성: Order를 저장할 때 연관된 OrderItem도 함께 저장하려면 OrderCascadeType.ALL을 설정하는 것이 더 자연스러운 방법입니다. 이는 종속된 엔티티의 저장, 삭제 등을 하나의 트랜잭션에서 관리할 수 있게 합니다.

@ManyToOne에서 CascadeType 설정하지 않는 이유

@ManyToOne 관계에서는 일반적으로 자식 엔티티(여러 OrderItem)가 부모 엔티티(Order)를 참조하는 상황입니다. 변동 사항이 있을 때마다 자식 엔티티에서 참조하는 부모 엔티티의 데이터를 함께 변경할 이유는 크게 없기 때문이죠. 그래서 CascadeType은 주로 자식의 생명주기를 관리할 필요가 있을 때 사용합니다.

결론

결국, CascadeType을 어디에 설정하느냐는 엔티티 사이의 연관관계와 해당 어플리케이션에서의 사용 사례에 따라 다릅니다. 보통 부모-자식 관계에서 부모에 설정을 하고, 부모를 통해 자식들을 관리하는 방식이 일반적입니다.

보다 구체적인 예시와 설명이 필요하면, 아래 비슷한 질문의 URL을 참고하시면 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오리쉐리님의 프로필 이미지
오리쉐리

작성한 질문수

질문하기