• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Cascade 질문 드립니다.

19.11.03 22:43 작성 조회수 362

1

영한님 안녕하세요.

영한님 책과 강좌를 통해서 JPA 학습에 몰입 중인데 DDD, Spring Data JPA 개념과 함께 학습을 하려고 하니

생각보다 배워야 할 내용들이 너무 많네요.. 질문 드릴 분이 영한님 밖에 없어서 한번 더 문의를 드립니다.

DDD 책을 보면 Aggregate 의 리파지토리를 만들 때, Aggregate root 에 대해서만 제공하라고 하고 있습니다.

영한님 책의 예제에서 보면 Order, OrderItem, Delivery 같은 Entity 를 하나의 Aggregate 으로 묶을 수가 있고

Order 를 Aggregate Root 를 볼 수 있을 거 같은데요.

이 경우 Order 에 대해서만 Repository 를 제공할 경우, Cascade 를 사용하지 않고서는

Order, OrderItem, Delivery 를 한번에 저장할 수 있는 방법이 없을 거 같은데요..

(OrderItem 이니 Delivery 는 Repository 가 없으므로)

이렇게 Aggregate Root 에 대해서만 Repository 를 제공할 때, 혹시 Cascade 를 활용하지 않고

저장할 수 있는 방법이 있나요?

만약 Cascade 가 유일하다면 이러한 구조로 개발을 하는 것이 가장 보편적이 방법인지도 알고 싶습니다.

답변 1

답변을 작성해보세요.

4

안녕하세요. 아리마님^^ 좋은 질문입니다.

우선 답변부터 드리면

이렇게 Aggregate Root 에 대해서만 Repository 를 제공할 때, 혹시 Cascade 를 활용하지 않고 저장할 수 있는 방법이 있나요?

-> 하나의 Repository 안에서 Aggregate Root 엔티티와 거기에 딸려있는 엔티티들을 한번에 저장하도록 구현하면 됩니다. em.persist()를 여러 엔티티에 걸쳐서 하는 것이지요. Cascade는 그러한 방법중 조금 편리한 방법일 뿐입니다.

자 그럼 답변을 떠나서, 지금 정말 중요한 것이 무엇인지 말씀드리겠습니다.

DDD라는 것은 결국 좋은 설계를 위해 지향해야할 방향인 것이지, 현실과 이상 사이에는 균형이 필요하다 생각해요. 그리고 DDD라는 것이 보편적이냐? 라고 질문하시면 저는 아니라고 답을 드리겠습니다.

저는 사실 처음 실무에 JPA를 사용하신다면 DDD의 Aggregate Root 개념을 가지고 오기 보다는, 그냥 엔티티 하나에 리포지토리를 하나씩 달아서 사용하는 것을 권장합니다. 이렇게하면 Cascade가 없어도 아무런 문제가 없습니다.

이렇게 가볍에 JPA로 프로젝트를 진행해보고, 도메인 주도 설계 등을 공부하다보면, 자연스럽게 Cascade, Aggregate Root 등을 어떻게 적용해야할지 조금씩 보입니다.

참고로 저도 실무에서 JPA로 프로젝트를 진행하고, Aggregate Root 개념을 기본으로 설계를 가져가고, Cascade도 사용하지만, 리포지토리를 항상 AggregateRoot에 맞추어서 하나씩 만들지는 않습니다. 필요하면 Aggregate Root가 아니어도 엔티티에 리포지토리를 만듭니다.

그리고 모든 프로젝트에 DDD 개념을 녹일 필요도 없습니다. 저는 보편적인 구조는 DDD의 개념을 도입한 프로젝트 보다는 그냥 단순하게 엔티티당 하나의 리포지토리를 가져가는 것이 더 보편적인 구조라 생각합니다. (물론 이것은 정답이 있는 것은 아닙니다.)

저희 생각을 쭉 나열했는데, 확실히 단순한 것이 가장 좋습니다^^!

도움이 되셨길 바랍니다. 감사합니다^^