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

세명님의 프로필 이미지

작성한 질문수

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

엔티티 설계시 주의점

cascade 옵션 질문

해결된 질문

작성

·

4.3K

14

안녕하세요.
강의 잘 듣고 있던 도중 궁금한 점이 생겨서 질문드립니다.
엔티티 설계시 주의점 21분쯤에 cascade옵션에 대해서 설명해 주셨는데, 왜 Order 엔티티에 있는 필드값에만 이를 적용하고 다른 곳에는 적용하지 않으셨는지 궁금합니다. 또한, 어떤 기준을 통해 cascade 옵션을 적용시켜야 하는지 궁금해서 여쭤봅니다.

답변 3

43

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. saemyung2000님 좋은 질문입니다.

cascade 옵션은 단순히 생각하면, 그냥 persist() 호출을 줄여줄 수 있기 때문에, 유용해 보이지만, 반대로 생각하면, Order 엔티티를 저장할 때, 연관된 어떤 엔티티들이 함께 저장될까? 를 계속 코드를 보며 추적해야 합니다.

따라서 질문하신 것 처럼 어디까지는 cascade로 함께 저장하고, 어디까지는 함께 저장하면 안될까? 하는 명확한 기준이 필요합니다.

그래서 이런 기준을 잡기 애매한 경우에는 사실 사용하지 않는 것이 좋습니다.

통상적으로 권장하는 cascade 범위는, 완전히 개인 소유하는 엔티티일 때, 예를 들어서 게시판과 첨부파일이 있을 때 첨부파일은 게시판 엔티티만 참조하므로, 개인 소유 입니다. 이런 경우에는 사용해도 됩니다. 그럼 반대로 개인 소유하지 않는 엔티티는 무엇일까요? 예를 들어서, 회원, 상품 등등이 있습니다.

이 예제에서 Order -> OrderItem을 개인소유 하기 때문에 cascade를 사용했습니다. 그런데 Order 입장에서 Delivery는 좀 애매합니다. 여기서는 프로젝트 규모가 작기 때문에 매우 단순하게 표현했지만, 실무에서 프로젝트 규모가 커지면, Delivery로 여러곳에서 참조될 수 있습니다. 그러면 사용하면 안됩니다.

추가로 도메인 주도 설계(DDD)의 Aggregate Root 개념을 이해하고, 프로젝트 적용하면 여기에 맞추어 cascade 옵션을 더 잘 활용할 수 있습니다.

정리하면

1. 완전 개인 소유인 경우에 사용할 수 있다.

2. DDD의 Aggregate Root와 어울린다.

3. 애매하면 사용하지 않는다.

더 자세한 내용은 JPA 기본편 섹션 8에 있는 영속성 전이(CASCADE)와 고아 객체를 참고해주세요.

감사합니다.

6

저도 글쓴이분과 같은 궁금증이 있어서

질문을 올리려다 먼저 찾아봤는데 

영한님의 친절하고 디테일한 설명을 보고 

명쾌하게 해결되었습니다.

너무 감사드립니다.

앞으로도 좋은 강의 많이 만들어주세요 !

1

저도 testcode 작성중에 cascade 관련 에러가 발생해서 글을 읽어보고 해결중입니다.. 좋은 내용 감사합니다

세명님의 프로필 이미지

작성한 질문수

질문하기