이번 포스팅은 김영한 이사님의 스프링 부트 JPA 활용 1편을 듣고 제작되었습니다.
이번 포스팅에서는 우리가 실습할 예제의 도메인 모델에 대한 엔티티를 분석해보려고 한다.
사실 강의에서 요구사항 분석과 그에 따른 테이블 설계에 대해 명확한 근거를 들어 말씀해주셨지만 강의만 듣고 바로 넘어가는 것과 따로 정리하는 것과는 느낌이 다를 것 같아 따로 정리해보고자 한다.
이번 예제의 기능적 요구사항은 다음과 같다.
회원 기능
- 회원 등록
- 회원 조회
상품 기능
- 상품 등록
- 상품 수정
상품 조회주문 기능
- 상품 주문
- 주문 내역 조회
- 주문 취소
기타 요구사항
- 상품은 재고 관리가 필요하다.
- 상품의 종류는 도서, 음반, 영화가 있다.
- 상품을 카테고리로 구분할 수 있다.
- 상품 주문시 배송 정보를 입력할 수 있다.
요구사항만 놓고 봤을 떄 회원 기능과 상품 기능의 경우 간단한 CRUD operation만 들어있지만 주문 기능의 경우 어떤 식으로 풀어나가야 될지 감이 잘 안잡힌다.
도메인 모델과 그들의 연관 관계를 분석하면 다음과 같다.
- 한 명의
회원은 여러 건의주문을 생성할 수 있다.- 한 건의
주문에 대해서는 한 건의배송이 가능하다.- 한 번의
주문엔 여러 개의상품이 포함될 수 있다.- 한 개의
상품도 여러 건의주문에 포함될 수 있다.도서,음반,영화는상품이라는 도메인 모델을 상속받는다.
주문과 상품의 경우 다대다 관계이지만 이들 사이에 주문 상품이라는 도메인을 끼워 넣어 일대다와 다대일 관계로 풀어내었다.
위의 도메인 모델을 바탕으로 엔티티를 구성하면 다음과 같다.
- 주소에 대해선 Address라는 값 타입을 사용하였다.
Order와Item을 연결해주는OrderItem에는 주문 가격과 수량이 나타나 있다.Category는 부모 - 자식의 계층관계를 가지고 있다.
강의에서는 예제에 대해서 유의할 점 몇개를 설명하였는데 이것에 대해선 기본편을 듣기 전에 미리 알아두면 좋을 것 같아 짚고 넘어가겠다.
유의 사항
Category와Item의 다대다 관계는 실무에선 사용하면 안되고 일대다, 다대일 관계로 풀어야 한다.Member와Order의 경우Member도Order를 가지고 있고Order도Member를 가지고 있는 양방향 연관관계를 가지고 있는데 설계 단계에서는 되도록 피하는 것이 좋다.
시스템적인 관점에서 봤을 때는 "회원이 주문을 생성한다" 가 아닌 "주문을 만들 떄 회원이 필요하다" 라고 생각하는 것이 맞다고 한다. 이렇게 생각하는 것이 굉장히 중요하게 다가왔다.
우선 값 타입인 Adress가 MEMBER와 DELIVERY가 그대로 들어간 것을 확인할 수 있으며 ORDER_ITEM과 CATEGORY_ITEM은 다대다 관계를 위한 중간 테이블로 사용된다. ORDER_ITEM의 경우 주문가격과 수량이 포함되어 있다.
또한, ITEM은 싱글 테이블 전략을 사용햐여 DTYPE으로 물품을 구매하도록 구성하였다.
회원과 주문
- 일대다, 다대일의 양방향 관계
- 연관관계 주인은
Order이다.Order.member가 외래키ORDERS.MEMBER_ID와 매핑주문 상품과 주문
- 다대일 양방향 관계
- 연관관계 주인은 주문 상품
OderItem.order가 외래키ORDER_ITEM.ORDER_ID와 매핑주문 상품과 상품
- 다대일 단방향 관계
- 연관관계 주인은 주문 상품
OrderItem.item가 외래키ORDER_ITEM.ITEM_ID와 매핑주문과 배송
- 일대일 양방향 관계
Order가 연관관계의 주인Order.delivery가 외래키ORDERS.DELIVERY_ID와 매핑카테고리와 상품
- @ManytoMany를 사용해서 매핑
- 실무에선 사용 X
핵심 원리
연관관계 주인은외래키를 관리하는 쪽으로 정하는 것이 좋다.외래키는 다쪽에서 관리를 해야한다.
이렇게 해서 요구사항 분석부터 연관관계 매핑까지 설계를 진행해보았다. 같이 공부하는 친구한테 건너건너 들은 몇 개의 개념이 생각보다 이해하는데 도움이 많이 됐던 것 같다.
자세한 내용은 기본편에서 자세히 다룬다고 하기 때문에 그에 대해서는 기본편에서 다루고 이 포스팅에서는 이번 예제에서 어떤걸 구현하기 위해 설계를 어떻게 하는지 정도만 알고가자는 취지에서 글을 작성하였다. 아무래도 기본편을 안듣고 바로 실습을 하기 때문에 오히려 이번 시간이 중요하다고 생각했던 것 같다.
다음 강의부터는 쭉 실습이 진행될텐데 그 부분은 최대한 빨리 따라해보며 핵심적인 설명만 덧붙이며 포스팅할 예정이다.