작은 쇼핑몰을 만들어가면서
JPA로 실제 도메인 모델을 어떻게 구성하고 객체와 테이블을 어떻게 매핑해야 하는지 알아보자.
먼저 요구사항을 분석하고 도메인 모델과 테이블을 설계하자.
요구사항
핵심 요구사항은 다음과 같다.
- 회원은 구매와 판매 모두 가능하다.
- 구매 시 여러 종류의 상품을 선택할 수 있다.
- 상품을 카테고리(음반,도서,문구류)로 구분할 수 있고, 이후 더 확장될 수 있다.
- 회원은 상품을 (카테고리별/가격순/이름검색) 조회할 수 있다.
요구사항을 분석해봤을 때 기능은 다음과 같다.
회원 기능
- 회원가입시 아이디, 비밀번호, 배송지 주소 입력을 받는다.
- 웹 서비스 이용을 하기 위해서 로그인을 해야 한다.
- 회원가입/로그아웃/정보보기 기능을 제공한다.
- (회원 정보 수정/탈퇴 기능을 추가할 예정)
상품 기능
- 상품 조회/등록/수정/삭제/상세정보 조회 기능이 필요하다.
- 상품은 상품을 조회할 수 있는 기능이 필요하다.
- 상품 가격순 조회
- 상품 카테고리로 조회
- 상품 이름으로 검색
장바구니 기능
- 상품을 구매하면, 장바구니에 담긴다.
- 구매처리가 완료되면, 해당 주문정보(상품 정보와 구매 수량)가 기록된다.
- 장바구니에서 상품을 제거하면 해당 주문이 취소된다.
- 동일한 상품을 장바구니에 중복으로 담을 수 없으며, 각 상품은 한 번만 담을 수 있다.
기타 요구사항
- 회원은 로그인을 해야 웹서비스 이용이 가능하다.
- 회원이 잘못된 요청을 했을 때, 서버 오류발생 시 간단한 오류 페이지를 반환한다.
- 로그인과 권한 관리
- 파라미터 검증과 예외 처리
도메인 모델 분석
요구사항을 분석해보니 회원,주문, 상품 그리고 주문상품이라는 엔티티가 도출되었다.
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)
- 여러 상품이 판매될 수 있으므로 판매와 주문상품은 다대일 관계다.
- 판매관리에는 판매상품 관리와 주문정보도 관리해야 하기 때문에, 주문상품과의 연관관계도 추가했다.
- 어떤 판매자의 상품인지 구분하기 위해서 다대일 양방향 관계로 설계했다.
'프로젝트 > 개인 프로젝트 V2' 카테고리의 다른 글
6) 예외처리와 오류 페이지 만들기 (0) | 2023.06.14 |
---|---|
5) /category/MUSIC와 /category/BOOK 방식의 요청 매핑 개선하기 (1) | 2023.06.13 |
4) Enum 활용 (0) | 2023.06.13 |
3) 프로젝트 구조 (0) | 2023.06.13 |
1) 프로젝트 목적과 주요 구현 기능 (0) | 2023.06.13 |
댓글