기능 예시
기능 목록
- 회원 기능
- 회원 등록
- 회원 조회
- 상품 기능
- 상품 등록
- 상품 수정
- 상품 조회
- 주문 기능
- 상품 주문
- 주문 내역 조회
- 주문 취소
- 기타 요구사항
- 상품은 재고 관리가 필요하다.
- 상품의 종류는 도서, 음반, 영화가 있다.
- 상품을 카테고리로 구분할 수 있다.
- 상품 주문시 배송 정보를 입력할 수 있다.
다대다
- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음
- 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함
자체적으로 다대다를 할 수는 있지만 @ManyToMany 하지만 실무에서는 권장하지 않음
회원 한명이 여러 개의 상품을 구매했다고 가정하자. 그렇다면
- 회원 입장
- 한 명의 회원이 다양한 상품을 구매할 수있다. 1:n 관계
- 상품 입장
- 하나의 상품이 다양한 회원에게 판매 되어 질 수있다.
결론 관계형 데이터 베이스에선 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 그렇지만 객체에서는 가능하다.
- Member 쪽에서 products쪽과 ManyToMany로 연결해준다.
- Product 쪽에서 JoinTable(Member_product)을 선언하여 링크테이블을 생성해주는 어노테이션을 단다.
- 자동으로 1:n, n:1 관계를 만드는 것과 같은 원리이다.
오! 편리하다. 생각하고 사용하면 안된다.
- 연결 테이블이 단순히 연결만 하고 끝나지 않는다. (무슨말이지? 단순히 연결만 하고 끝나지 않고 추가 데이터가 들어간다. 별에별게 들어간다. 또한 중간 테이블이 예상할 수가 없다.)
- 주문시간, 수량 같은 데이터가 추가로 들어올 수 있다. (Member_Product에 들어감)
리팩토링
연결 테이블용 엔티티 추가 (연결 테이블을 엔티티로 승격!)
- Member : 링크 테이블과 연결
- Product : 링크 테이블과 연결
- MemberProduct : 링크 테이블 추가
- count, price, OrderDateTime을 넣을 수 있음
결론
양방향으로 여러개를 가질 수 있을 때 고민해야된다. 주인 한명에 강아지 2개 반대로 강아지 한마리에 주인이 여러명일 경우 우리가 그렇네! 그럴 경우 링크테이블을 걸어야한다.
도메인 모델과 테이블 설계
- 회원 <-> 주문 : 회원은 주문을 여러 건 할 수 있기 때문에 1:n의 관계이다.
- 주문<-> 배송 : 주문과 배송은 1:1 의 관계이다.
- 주문<->상품 : 주문과 상품은 n:n의 관계이다. 왜냐하면 한 번 고객이 한 번 주문 할때 여러 상품을 선택할 수 있기 때문이다. 이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 주문상품을 추가하여 주문 <-> 주문상품 <->상품(물품)으로 1:n, n:1로 풀어냈다.
엔티티 설계
- 회원(Member) : 이름과 임베디드 타입인 주소(Address), 그리고 주문(orders)리스트를 가진다.
- 주문(Order) : 한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문상품(OrderItem)을 일대다 관계다.
- 주문상품(OrderItem) : 주문한 상품정보와 주문 금액(OrderPrice), 주문수량(count) 정보를 가지고 있다.
- 상품(Item) :이름, 가격, 재고수량(stockQuantity)을 가지고 있다. 상품을 주문하면 재고수량이 줄어든다.
테이블 설계
'Back-end > JPA' 카테고리의 다른 글
객체지향 쿼리 언어1 - 기본 문법 (0) | 2022.09.24 |
---|---|
연관관계 매핑 기초 (0) | 2022.08.22 |
엔티티 매핑 (0) | 2022.08.06 |
[JPA] JPA 영속성 컨텍스트 (0) | 2022.05.05 |
[JPA] Batch Insert (0) | 2022.05.05 |