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

bk님의 프로필 이미지

작성한 질문수

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

상품 주문

연관관계 편의 메서드에 관련 문의

작성

·

1.9K

21

연관관계 편의 메서드에 이점을 느끼고 있습니다만...
이를 이해하는데 있어서 상당히 어려움을 느끼고 있습니다.

상품 주문 시

1. 주문한 member 를 조회
2. 주문한 item을 조회
3. 주문한 member address를 통해 delivery 생성
4. 주문한 item, 가격, 상품수를 인자로 주문상품 생성
5. 주문한 member,delivery,orderitem을 인자로 주문생성

주문상품 orderitem은 FK로 item, order를 가지나
주문생성에는 orderItem이 필요하기 때문에
주문상품 생성 시 order를 인자로 전해주지못하고

주문 생성 시 생성된 order를 연관관계 편의메서드를 통해
주문상품 order의 빈자리를 채워주고 있습니다.

주문생성 연관관계 편의 메서드를 보면
양방향 관계인 member, delivery, orderitem을 모두
함께 셋팅해주는데요.

1.member 생성 시 order와는 관계를 맺을 수 없으니
연관관계 메서드 필요없음

2. delivery는 주문 생성 시 함꼐 생성되므로
 order 또는 delivery에 연관관계 메서드 생성

3. orderitem은 order가 생성되어야 이후에 fk로 셋팅이
가능하기 떄문에 order에 연관관계 메서드 생성

일단 이렇게  이해를 하고있는데요.

좀더 명확하게 연관관계 메서드가 위치해야하는곳이
어디인가? 라는 물음에 케바케인가 싶기도 하구요.

어느부분을 중점으로 봐야할까요?
김영한님 책도 있긴한데 참고할 부분이 있을까요?

진짜 양방향은 왠만하면 안쓰는게 맞다는 말이 조금은 이해가 됩니다.

1부 빨리 끝내고 2부 들으러 가야겠습니다 ㅋㅋ

추가로
JPA 이후에 계획하고 계신 강의가 있을까요?

답변 1

38

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

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

먼저 연관관계 편의 메서드를 정의하면 다음과 같습니다.

(사실 이 연관관계 편의 메서드라는 이름은 제가 만들었습니다. ㅎㅎ)

연관관계 편의 메서드: 양방향 연관관계를 한번에 설정하는 편리한 메서드

질문이 엔티티 A와 B가 서로 양방향 연관관계인데, 어디에 연관관계 편의 메서드를 두는게 좋은가?로 이해했습니다.

우선 3가지 선택지가 있습니다.

- 엔티티 A에 둔다.

- 엔티티 B에 둔다.

- 엔티티 A,B에 둘다 둔다.

둘다 두는 것은 혼란을 가중하기 때문에 제외하고, A, B중 하나를 선택해서 사용하는 것이 좋다 생각합니다. 그러면 여기서 A,B 중에 하나를 선택해야 하는데 사실 이 부분이 고민하셨던 것 처럼 정답이 없습니다. 이 부분은 JPA의 영역이라기 보다는 오히려 객체지향 설계의 영역이기 때문입니다.

예를 들어서 Order와 Delivery 중에서 우리팀의 핵심 비즈니스가 주문이라면 Order에 연관관계 편의 메서드를 두는 것이 더 나은 선택일 확율이 높습니다. 그런데 만약 우리팀이 배달을 책임지는 팀이고 Order엔티티는 있지만, 관련된 정보는 크게 의미가 없다면 Delivery를 중심으로 비즈니스 로직이 진행되므로, Delivery가 중심 엔티티가 되기 때문에 Delivery에 연관관계 편의 메서드를 두는 것이 나은 선택이 됩니다.

도메인 주도 설계(DDD)에 나오는 Aggregate Root라는 개념을 사용한다면, Aggregate Root에 연관관계 편의 메서드를 두는 것이 좋은 선택일 확율이 높습니다.

조언들 드리자면, 실제 엔티티를 사용하는 비즈니스 로직을 구현을 하실 때, A에 연관관계 편의 메서드를 두고 개발을 해보고, 바꾸어서 B에 연관관계 편의 메서드를 두어 보면, 어디에 두는 것이 더 유지보수 하기 쉬운지 바로 보이실 꺼에요. 이게 뭔가 엔티티 만으로는 잘 안보이고, 실제 비즈니스 로직과 함께 있을 때는 어디에 두는 것이 좋은지 바로 보이더라구요. (서비스 계층에서 코드가 몇줄 줄어들고, 쉽게 이해되고 등등) 생각해보니 저도 엔티티를 설계할 때는 A라고 했다고, 중간에 실제 비즈니스 로직을 보고 B로 리펙토링 한 경우도 있었습니다^^

참고로 연관관계 편의 메서드에 대해서는 책 190p 5.6.2 연관관계 편의 메소드 부분에 짧게 설명이 되어 있습니다.

추가로 올해 안으로 준비중인 강의는 두가지 입니다^^

두 강의로 처음 목표했던 JPA 관련 강의는 마무리가 됩니다^^

- 실전 스프링 데이터 JPA

- 실전 QueryDSL

감사합니다.

bk님의 프로필 이미지

작성한 질문수

질문하기