기능 예시

기능 목록

  • 회원 기능
    • 회원 등록
    • 회원 조회
  • 상품 기능
    • 상품 등록
    • 상품 수정
    • 상품 조회
  • 주문 기능
    • 상품 주문
    • 주문 내역 조회
    • 주문 취소
  • 기타 요구사항
    • 상품은 재고 관리가 필요하다.
    • 상품의 종류는 도서, 음반, 영화가 있다.
    • 상품을 카테고리로 구분할 수 있다.
    • 상품 주문시 배송 정보를 입력할 수 있다.

다대다

  • 관계형 데이터베이스는 정규화된 테이블 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. 회원 <-> 주문 : 회원은 주문을 여러 건 할 수 있기 때문에 1:n의 관계이다.
  2. 주문<-> 배송 : 주문과 배송은 1:1 의 관계이다.
  3. 주문<->상품 : 주문과 상품은 n:n의 관계이다. 왜냐하면 한 번 고객이 한 번 주문 할때 여러 상품을 선택할 수 있기 때문이다.  이런 다대다 관계는 관계형 데이터베이스는 물론이고 엔티티에서도 거의 사용하지 않는다. 따라서 주문상품을 추가하여 주문 <-> 주문상품 <->상품(물품)으로 1:n, n:1로 풀어냈다.

엔티티 설계

  1. 회원(Member) : 이름과 임베디드 타입인 주소(Address), 그리고 주문(orders)리스트를 가진다.
  2. 주문(Order) : 한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문상품(OrderItem)을 일대다 관계다.
  3. 주문상품(OrderItem) : 주문한 상품정보와 주문 금액(OrderPrice), 주문수량(count) 정보를 가지고 있다.
  4. 상품(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

+ Recent posts