본문 바로가기
Spring/JPA

[JPA] 아주 간단한 쇼핑몰 만들기

by 김긍수 2021. 3. 6.

요구사항 분석


  • 회원은 상품을 주문할 수 있다.

  • 주문 시 여러 종류의 상품을 선택할 수 있다.


기능 목록


  • 회원기능
    • 회원등록
    • 회원조회 
  • 상품기능
    • 상품등록
    • 상품수정
    • 상품조회
  • 주문기능
    • 상품주문
    • 주문내역조회
    • 주문취소

도메인 모델 분석


  • 회원과 주문의 관계 (일대다) : 회원은 여러번 주문할 수 있다.
  • 주문과 상품의 관계 : 주문할 때 여러 상품을 선택할 수 있다. 반대로 같은 상품도 여러 번 주문될 수 있다. 주문 상품이라는 모델을 만들어 다대다 관계를 일다대, 다대일 관계로 풀어낸다.


테이블설계



엔티티 설계와 매핑




데이터 중심 설계의 문제점

위 엔티티 설계대로 Domain class를 작성하면 Order클래스에 private Long memberId; 로 작성하게 된다.

 

  • 현재 방식은 객체 설계를 테이블 설계에 맞춘 방식이다.
  • 테이블의 외래키를 객체에 그대로 가져왔다.
  • 객체 그래프 탐색이 불가능하다
  • 참조가 없으므로 UML도 잘못되었다.

 

위에 쓴대로 사용한다면 주문한 회원정보를 찾아야할때 아래 코드로 찾아야한다.

Order order = em.find(Order.class, 101L);
Long memberId = order.getMemberId();
Member member = em.find(Member.class, memberId);

 이건 조금 객체지향적이지 않은 방법이고 객체를 관계형DB에 맞춘거라고 할 수 있다.

우리는 Order.class를 작성할 때 private Member member; 로 작성하여 객체로 참조될때 참조된 걸 찾을 수 있게 해야한다. 주문한 회원정보를 찾아야할 때, 아래처럼 사용하는 것이 좋다. 

Order order = em.find(Order.class, 101L);
Member member = order.getMember();
member.getId(); //

2. 연관 관계 매핑

객체 구조


4. 상속 관계 매핑

1. 상품은 상속관계매핑을 사용하고, 2번째는 @MappedSuperclass를 사용하면 된다.

 

ITEM을 싱글테이블로 설계할 것이다.

 

 

댓글