JPA

SpringBoot JPA 쇼핑몰 도메인&테이블 설계

빈코 2022. 9. 7. 15:37

SpringBootJPA, Thymeleaf를 사용하여 간단한 쇼핑몰을 구현하려 합니다. 프로젝트 생성이나 Gradle 빌드는 깃허브 BincoShop을 참고해주세요! 포스팅은 도메인&테이블 설계 -> 엔티티 개발 -> 회원 서비스 -> 상품 서비스 -> 주문 서비스 순으로 진행됩니다. 포스팅의 잘못된 부분은 언제든 댓글로 남겨주시면 수정하겠습니다😀

 

로고
도메인&테이블 설계

도메인 모델🔆

관계
관계

회원, 주문, 상품의 관계 : 회원을 여러 상품을 주문할 수 있고 한번 주문할 때 여러 상품을 선택할 수 있으므로 주문과 상품은 다대다 관계이다. 하지만 다대다 관계는 잘 사용하지 않아서 위 그림처럼 주문 상품이라는 엔티티를 추가해서 일대다, 다대일 관계로 풀어냈다.

 

상품 분류 : 상품은 도서, 음반, 영화로 구분되는데 상품이라는 공통 속성을 사용하므로 상속 구조로 표현했다.

 

Entity✨

entity
Entity

  • 회원(Member) : 이름과 임베디드 타입인 주소(Address), 주문(orders) 리스트를 가진다.
  • 주문(Order) : 한 번 주문시 여러 상품을 주문할 수 있으므로 주문과 주문 상품(OrderItem)은 일대다 관계다. 주문은 상품을 주문한 회원과 배송 정보, 주문 날짜, 주문 상태(status)를 가지고 있다. 주문 상태는 Enum을 이용하여 주문(ORDER), 취소(CANCEL)로 표현하였다.
  • 주문 상품(OrderItem) : 주문한 상품 정보와 주문 금액(orderPrice), 주문 수량(count) 정보를 가지고 있다.
  • 상품(Item) : 이름, 가격, 재고 수량(stockQuantity)을 가지고 있고, 상품을 주문하면 재고 수량이 줄어든다. 상품의 종류는 도서, 음반, 영화가 있다.
  • 배송(Delivery) : 주문 시 하나의 배송 정보를 생성한다. 주문과 배송은 일대일 관계다.
  • 카테고리(Category) : 상품과 다대다 관계를 맺는다. parent, child로 부모 자식 카테고리를 연결한다.
  • 주소(Address) : 값 타입(임베디드 타입)이다. 회원과 배송에서 사용한다.

 

테이블 분석👀

table
Table

MEMBER : 회원 엔티티의 Address 임베디드 타입 정보가 회원 테이블에 그대로 들어갔다.

ITEM : 앨범, 도서, 영화 타입을 통합해서 하나의 테이블로 만들었다(싱글 패턴). Dtype 칼럼으로 타입을 구분한다.

참고 : 테이블명이 ORDER가 아니라 ORDERS인 것은 데이터베이스가 order by를 예약어로 잡고 있어서 관례상 ORDERS를 많이 사용한다

 

연관관계 매핑 분석🌞

  • 회원과 주문 : 일대다, 다대일의 양방향 관계다. 따라서 연관관계의 주인을 정해야 하는데, 외래 키가 있는 주문을 연관관계의 주인으로 정하였다. 그러므로 Order.member를 ORDERS.MEMBER_ID 외래 키와 매핑하였다.
  • 주문 상품과 주문 : 다대일 양방향 관계다. 외래 키가 주문 상품에 있으므로 주문 상품이 연관관계의 주인이다. 그러므로 OrderItem.order를 ORDER_ITEM.ORDER_ID 외래 키와 매핑한다.
  • 주문 상품과 상품 : 다대일 단방향 관계다. OrderItem.item을 ORDER_ITEM.ITEM_ID 외래 키와 매핑한다.
  • 주문과 배송 : 일대일 양방향 관계다. Order.delivery를 ORDERS.DELIVERY_ID 외래 키와 매핑한다
  • 카테고리와 상품 : @ManyToMany를 사용해서 매핑한다. (실무에서는 가급적 사용 금지)

 

📌참고 : 외래 키가 있는 곳을 연관관계의 주인으로 정해라

연관관계의 주인은 단순히 외래 키를 누가 관리하냐의 문제이지 비즈니스상 우위에 있다고 주인으로 정하면 안 된다. 예를 들어서 자동차와 바퀴가 있으면, 일대다 관계에서 항상 다쪽에 외래 키가 있으므로 바퀴를 연관관계의 주인으로 정하면 된다.

 

물론 자동차를 연관관계의 주인으로 정하는 것이 불가능한 것은 아니지만, 자동차를 연관관계의 주인으로 정하면 자동차가 관리하지 않는 바퀴 테이블의 외래 키 값이 업데이트되므로 관리와 유지보수가 어렵고, 추가적으로 별도의 업데이트 쿼리가 발생하는 성능 문제도 야기시킨다.

 


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

 

관련 포스팅

SpringBoot JPA 쇼핑몰 엔티티 개발 I

SpringBoot JPA 쇼핑몰 엔티티 개발 II

SpringBoot JPA 쇼핑몰 회원 서비스 개발

SpringBoot JPA 쇼핑몰 상품 서비스 개발

SpringBoot JPA 쇼핑몰 주문 서비스 I

SpringBoot JPA 쇼핑몰 주문 서비스 II

SpringBoot JPA 쇼핑몰 주문 검색 개발

 

Reference

스프링 부트와 JPA 활용 - 김영한

반응형