본문 바로가기
프로젝트/개인 프로젝트 V2

2) 도메인 모델과 테이블 설계

by Thumper 2023. 6. 13.

작은 쇼핑몰을 만들어가면서

JPA로 실제 도메인 모델을 어떻게 구성하고 객체와 테이블을 어떻게 매핑해야 하는지 알아보자.

먼저 요구사항을 분석하고 도메인 모델과 테이블을 설계하자.

요구사항

핵심 요구사항은 다음과 같다.

  • 회원은 구매와 판매 모두 가능하다.
  • 구매 시 여러 종류의 상품을 선택할 수 있다.
  • 상품을 카테고리(음반,도서,문구류)로 구분할 수 있고, 이후 더 확장될 수 있다.
  • 회원은 상품을 (카테고리별/가격순/이름검색) 조회할 수 있다.

요구사항을 분석해봤을 때 기능은 다음과 같다.

회원 기능

  • 회원가입시 아이디, 비밀번호, 배송지 주소 입력을 받는다.
  • 웹 서비스 이용을 하기 위해서 로그인을 해야 한다.
  • 회원가입/로그아웃/정보보기 기능을 제공한다.
  • (회원 정보 수정/탈퇴 기능을 추가할 예정)

상품 기능

  • 상품 조회/등록/수정/삭제/상세정보 조회 기능이 필요하다.
  • 상품은 상품을 조회할 수 있는 기능이 필요하다.
  • 상품 가격순 조회
  • 상품 카테고리로 조회
  • 상품 이름으로 검색

장바구니 기능

  • 상품을 구매하면, 장바구니에 담긴다.
  • 구매처리가 완료되면, 해당 주문정보(상품 정보와 구매 수량)가 기록된다.
  • 장바구니에서 상품을 제거하면 해당 주문이 취소된다.
  • 동일한 상품을 장바구니에 중복으로 담을 수 없으며, 각 상품은 한 번만 담을 수 있다.

기타 요구사항

  • 회원은 로그인을 해야 웹서비스 이용이 가능하다.
  • 회원이 잘못된 요청을 했을 때, 서버 오류발생 시 간단한 오류 페이지를 반환한다.
  • 로그인과 권한 관리
  • 파라미터 검증과 예외 처리

도메인 모델 분석

요구사항을 분석해보니 회원,주문, 상품 그리고 주문상품이라는 엔티티가 도출되었다.
UML를 분석해보자.

UML

회원과 장바구니

회원당 장바구니를 가질 수 있으므로 회원과 장바구니는 일대일 관계다.

장바구니와 상품의 관계

  • 회원(User)은 구매한 상품을 장바구니에 담는데, 주문정보를 주문상품(OrderItem) 엔티티로 장바구니(Cart)에 담는다.
  • 그리고 주문상품(OrderItem)에는 해당 상품(Item)을 구매한 금액과 수량 정보가 포함되어 있다.

배송지 주소

  • Address라는 값 타입을 만들어서 나열된 주소 대신에 사용하도록 한다.
  • User 엔티티에 적용했다. 주소 정보에 필드나 로직이 추가되면 Address 값 타입만 변경하면 된다.

테이블 설계

요구사항을 분석해서 데이터베이스 테이블을 만들자. 아래 그림은 요구사항을 기반으로 설계한 테이블 ERD다.

ERD를 분석해보자.


1. 회원 (users)

  • 회원정보로 name, loginId, password, email, 배송지정보가 있다.
  • 배송지정보(city 도시, street 도로명주소, zipcode 우편번호)는 Address 임베디드 타입 정보로 들어갔다.

2. 장바구니 (cart)

회원(USER)당 장바구니를 소유한다.

 

3. 주문상품

  • 장바구니(CART_ID)와 주문한 상품(ITEM_ID)을 외래 키로 가진다.
  • 주문 금액(ORDERPRICE), 주문 수량(COUNT) 정보를 가진다.

4. 상품 (item)

상품은 도서, 음반, 문구류로 구분되는데 상품 카테고리 타입이라는 공통 속성을 enum 타입으로 설계했다.

  • 상품정보로 itemName(상품명), price(상품가격), stockQuantity(재고량),
    itemType(상품 상태등급), categoryType(상품 카테고리타입), status(판매상태), imgList(상품 이미지)가 있다.
  • 상품 (상태등급, 카테고리타입, 판매상태)는 임베디드 타입 정보로 들어갔고 enum 타입으로 설계했다.
  • itemType(상품 등급)은 "최상" "상" "중" 으로 상품 품질 상태 정보가 포함되어 있다.
  • categoryType(상품 카테고리타입)은 "책" "음반" "문구류" 정보가 포함되어 있다.
  • status(판매상태) "판매중" "품절" 정보가 포함되어 있다.
  • 상품을 주문하면 재고수량이 줄어든다.
  • 상품이 품절된 경우, status를 품절 상태로 바뀐다.

5. 상품 이미지 (ItemImg)

imgName(저장된 이미지 파일명), savePath(파일경로), originImgName(이미지 이름),

reImgYn(해당 이미지가 대표 이미지인지?) 정보가 있다.

 

6. 판매(Sales)

회원당 판매권한을 가지며,  총 판매액 정보가 있다.

 

주요 연관관계

1) 회원과 장바구니 (USER - CART)

  • User는 하나의 Cart만 가질 수 있고, Cart는 여러 명의 사용자가 공유할 수 없다.
  • 따라서 1:1 연관관계다.
  • USER가 주 테이블이고 CART는 대상 테이블이다.
  • 일대일 관계이므로 객체 매핑에 @OneToOne을 사용했고 DB에는 CART_ID 외래키에 유니크 제약조건(UNI)를 추가했다.

2) 상품과 상품 이미지 (ITEM - ITEMIMG)

한 상품에 여러 이미지 정보를 가질 수 있으므로 일대다 관계다.

 

3) 판매와 상품 (SALES - ITEM) 

  • 여러 상품을 등록하여 판매할 수 있으므로 상품과 판매는 다대일 관계다.
  • 판매 정보를 조회할 때 상품 정보가 필요하고, 상품에 판매자 정보가 필요하므로 다대일 양방향 관계로 설계했다

4) 판매와 주문상품 (SALES - ORDERITEM) 

  • 여러 상품이 판매될 수 있으므로 판매와 주문상품은 다대일 관계다.
  • 판매관리에는 판매상품 관리와 주문정보도 관리해야 하기 때문에, 주문상품과의 연관관계도 추가했다.
  • 어떤 판매자의 상품인지 구분하기 위해서 다대일 양방향 관계로 설계했다.

댓글