---
description: admin, api, batch, common
---

# Copy of ERD - 1

## Tables & Relations

(j=i+1; j\<n; j++)

* User - 유저정보
  * Role - User가 어떤 권한을 가질지 Role 테이블로 관리 (N:1)
  * ShippingAddress - User는 여러 배송지를 가질 수 있음 (1:N)
  * Cart - 한 사용자는 하나의 장바구니를 가짐 (1:N)
  * Order - 한 사용자는 여러 주문을 생성 (1:N)
  * Review - 유저는 여러개의 리뷰를 작성할 수 있음 (1:N)
  * EventLog - 유저의 비즈니스 로그(서버 로그X) 저장 (1:N)
  * WishList - 유저는 여러개의 제품을 찜 목록에 둘 수 있음 (1:N)
  * Notification - 특정 사용자에게 여러 알림이 발송될 수 있음 (1:N)
  * Coupon - 유저가 해당 제품 또는 어떠한 제품에 대해 사용할 수 있는 쿠폰 (1:N)
* Role - 권한
* ShippingAddress - 배송지
  * Order - 주문시 어떤 배송지를 사용할지 저장 (1:1)
* Cart - 장바구니
  * CartItem - 장바구니 안에 여러 상품이 포함됨 (1:N)
* CartItem - 장바구니에 담긴 제품
  * Product - 어떤 상품은 여러 장바구니에 담길 수 있음 (N:1)
* Order - 주문
  * OrderItem - 한 주문에는 여러 제품이 포함 될 수 있음 (1:N)
  * Payment - 한 주문에 대한 하나의 결제 정보가 연결되어야 함(1:1)
  * Shipping - 한 주문당 하나의 배송 정보가 연결되어야 함(1:1)
* OrderItem - 주문과 제품 N:N&#x20;
* Product - 제품
  * Category - 한 제품은 하나의 카테고리를 가질 수 있음(1:1)
  * Promotion - 한 제품은 여러개의 프로모션에 해당 될 수 있음(1:N)
  * Review - 한 제품은 여러개의 리뷰를 가질 수 있음 (1:N)
  * WishList - 여러 제품은 여러 유저의 찜목록에 포함될 수 있음 (N:N)
  * Coupon - 한 제품은 여러개의 쿠폰을 가질 수 있음 (1:N)
* Category - 제품 카테고리
* Payment - 주문 결제 정보를 저장
* Shipping - 배송 상태 및 송장 번호를 관리하는 테이블
* Promotion - 할인 쿠폰 및 이벤트 적용 정보를 저장하는 테이블
* Review - 리뷰
* Admin - 관리자 계정
* Statistics - 통계
* EventLog - 로그
* WishList - 찜 목록
* Notification - 알림
* Coupon - 사용자 쿠폰





## 1. User

사용자는 이커머스 플랫폼에서 상품을 구매하거나 판매하는 역할

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FFLYMutQrjTVmSZpUm47v%2Fimage.png?alt=media&#x26;token=999ad05e-a5e2-4610-9746-3b71eb7e8742" alt=""><figcaption></figcaption></figure>

* **User : Role = N:1** (각 사용자는 하나의 역할을 가짐)
* **User : Order = 1:N** (각 사용자는 여러 개의 주문을 가질 수 있음)
* **User : Cart = 1:1** (각 사용자는 하나의 장바구니만 보유 가능)
* **User : ShippingAddress = 1:N** (각 사용자는 여러 개의 배송지를 가질 수 있음)
* User: WishList = 1 : N (각 사용자는 하나의 찜 목록을 가질 수 있음)

## 2. Role

일반 사용자, 판매자, 관리자로 구분

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FcG0abiOXChZSCz8KIzeU%2Fimage.png?alt=media&#x26;token=535d2e82-8ebf-4122-9072-aea8b6d4fc24" alt=""><figcaption></figcaption></figure>

## 3. ShippingAddress

사용자는 여러 개의 배송지를 저장할 수 있으며, 주문 시 특정 배송지를 선택

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FLBJkeWBWItKiCdR3pPp5%2Fimage.png?alt=media&#x26;token=6e5b6af0-b242-4a72-a8d5-c04118a7cadf" alt=""><figcaption></figcaption></figure>

* **User : ShippingAddress = 1:N** (각 사용자는 여러 개의 배송지를 가질 수 있음)
* **ShippingAddress : Order = 1:N** (각 배송지는 여러 개의 주문과 연결될 수 있음)

## 4. Cart

사용자는 하나의 장바구니를 가지며, 장바구니에는 여러 개의 상품이 포함

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2F0ERPPlBZt2UORp5CKp2M%2Fimage.png?alt=media&#x26;token=f17e70b0-02a3-4a16-b1c0-ec294d7915e5" alt=""><figcaption></figcaption></figure>

* **User : Cart = 1:1** (각 사용자는 하나의 장바구니만 가질 수 있음)
* **Cart : CartItem = 1:N** (각 장바구니는 여러 개의 상품을 포함 가능)

## 5. CartItem (Cart : Product. M:M)

장바구니에 담긴 개별 상품 정보를 저장

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2Fr95MoULcOat8pBMxJ7YN%2Fimage.png?alt=media&#x26;token=8babda51-2c2d-45e8-808f-9d1762205006" alt=""><figcaption></figcaption></figure>

* **Cart : CartItem = 1:N** (각 장바구니는 여러 개의 상품을 포함 가능)
* **Product : CartItem = 1:N** (각 상품은 여러 개의 장바구니에 포함될 수 있음)

## 6. Order

사용자가 결제를 완료하면 생성되는 주문 정보를 저장하는 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FywYYbBQHJexL166itWvO%2Fimage.png?alt=media&#x26;token=29dab11c-86b3-48bf-9116-69827aecb5da" alt=""><figcaption></figcaption></figure>

* **User : Order = 1:N** (각 사용자는 여러 개의 주문을 할 수 있음)
* **ShippingAddress : Order = 1:N** (각 배송지는 여러 개의 주문에 사용될 수 있음)
* **Order : OrderItem = 1:N** (각 주문에는 여러 개의 상품이 포함될 수 있음)
* **Order : Payment = 1:1** (각 주문에는 하나의 결제 정보가 연결됨)
* **Order : Shipping = 1:1** (각 주문에는 하나의 배송 정보가 연결됨)

## 7. OrderItem (Order : Product. M:M)

주문 내 개별 상품 정보를 저장하는 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FP8p1vPqIFVrmYLN1sOs1%2Fimage.png?alt=media&#x26;token=d17f48e0-62ea-419a-a05e-56abeb134b4b" alt=""><figcaption></figcaption></figure>

* **Order : OrderItem = 1:N** (각 주문에는 여러 개의 상품이 포함될 수 있음)
* **Product : OrderItem = 1:N** (각 상품은 여러 개의 주문에서 참조될 수 있음)

## 8. Product

판매자가 등록한 상품 정보를 저장

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FF39Ekhq7kZRbrQSVZRyI%2Fimage.png?alt=media&#x26;token=ff1a5b19-62f5-413a-9632-61b83593918f" alt=""><figcaption></figcaption></figure>

* **User : Product = 1:N** (각 판매자는 여러 개의 상품을 등록할 수 있음)
* **Category : Product = 1:N** (각 카테고리에는 여러 개의 상품이 포함될 수 있음)
* **Product : OrderItem = 1:N** (각 상품은 여러 개의 주문에서 참조될 수 있음)
* **Product : CartItem = 1:N** (각 상품은 여러 개의 장바구니에 포함될 수 있음)
* **Product : Review = 1:N** (각 상품은 여러 개의 리뷰를 가질 수 있음)

## 9. Category

상품을 분류하는 카테고리 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FZ490yUPlc2dxvqAXrSyO%2Fimage.png?alt=media&#x26;token=5a123a78-90d7-4fa1-aef8-977ee3da929f" alt=""><figcaption></figcaption></figure>

**Category : Product = 1:N** (각 카테고리에는 여러 개의 상품이 포함될 수 있음)

## 10. Payment

주문 결제 정보를 저장하는 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FN4ZxwNF1lXobN8cAmjg3%2Fimage.png?alt=media&#x26;token=5172a415-384c-4eb1-ac37-aa9690c768ab" alt=""><figcaption></figcaption></figure>

* **Order : Payment = 1:1** (각 주문은 하나의 결제와 연결됨)

## 11. Shipping

주문별 배송 상태 및 송장 번호를 관리하는 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FUzrpEUhSH8dmjyXCgWva%2Fimage.png?alt=media&#x26;token=84683bc7-1b59-49de-bbc6-a6ddcfff6209" alt=""><figcaption></figcaption></figure>

* **Order : Shipping = 1:1** (각 주문은 하나의 배송과 연결됨)

## 12. Promotion

할인 쿠폰 및 이벤트 적용 정보를 저장하는 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FDkMDQG4SVnF47DMNtBV6%2Fimage.png?alt=media&#x26;token=97b81462-886d-4196-ae18-40f87f6834d5" alt=""><figcaption></figcaption></figure>

* **Order : Promotion = N:M** (하나의 주문에는 여러 개의 프로모션이 적용될 수 있음)

## 13. Review

사용자가 구매한 상품에 대한 리뷰 및 평점을 기록하는 테이블\
리뷰는 **배송 완료 후** 작성할 수 있으며, **상품별 평균 평점**을 계산

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FYp2ZpgSdamB0Z4SZ78Xi%2Fimage.png?alt=media&#x26;token=a42c530d-548d-4e73-9320-24bccc57065e" alt=""><figcaption></figcaption></figure>

* **User : Review = 1:N** (각 사용자는 여러 개의 리뷰를 작성 가능)
* **Product : Review = 1:N** (각 상품은 여러 개의 리뷰를 가질 수 있음)
* **OrderItem : Review = 1:1** (각 주문된 상품은 하나의 리뷰와 연결 가능)

## 14. Admin

관리자(운영자) 계정 정보를 저장하는 테이블 (일반 사용자와 분리)

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FaJ9Mo5an6qsAnZnidrGz%2Fimage.png?alt=media&#x26;token=ded3f0e3-c43e-43c7-af04-b7ff41c0bf1f" alt=""><figcaption></figcaption></figure>

* **Admin 계정은 독립적으로 관리되며 User 테이블과 연결되지 않음**
* **관리자 역할(role)에 따라 권한을 부여할 수 있도록 구현 가능**

## 15. Statistics

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FeDsCccut0HzInmAAWVvK%2Fimage.png?alt=media&#x26;token=4c0703bb-38b6-40af-81b9-5b9c3d84cc1b" alt=""><figcaption></figcaption></figure>

* **Product : Statistics = 1:N** (가장 많이 판매된 상품 ID와 연결 가능)
* **자동화 배치 작업을 통해 주기적으로 데이터가 업데이트됨**

## 16. EventLog

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FIg7TbLlYiO3h7yKBeFyq%2Fimage.png?alt=media&#x26;token=18b1f7f7-50cd-4f81-be46-663edccd3cf0" alt=""><figcaption></figcaption></figure>

* **User : EventLog = 1:N** (사용자와 연결된 이벤트 기록 가능.

## 17. WishList

사용자가 관심 있는 상품을 저장 (장바구니와 별도)

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FXaNz5VQqDghzU7GK5P9F%2Fimage.png?alt=media&#x26;token=8a64f6aa-e8de-4d1d-b597-0efbd32d5460" alt=""><figcaption></figcaption></figure>

* **User : Wishlist = 1:N** (사용자는 여러 개의 상품을 찜할 수 있음)
* **Product : Wishlist = 1:N** (하나의 상품이 여러 사용자의 찜 목록에 포함될 수 있음)

## 18. Notification

사용자에게 주문 상태 변경, 배송 정보 업데이트, 프로모션 등을 알리는 시스템

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FFzcXt538M4fl0ObEJVXd%2Fimage.png?alt=media&#x26;token=9ff355bd-8048-46fe-943c-7e2b01e2a63b" alt=""><figcaption></figcaption></figure>

* **User : Notification = 1:N** (각 사용자는 여러 개의 알림을 받을 수 있음)

## 19. Coupon

사용자가 사용할 수 있는 할인 쿠폰 정보 테이블

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2Fow5VFrMS5IghKuQymDjn%2Fimage.png?alt=media&#x26;token=e09ef3ff-7ca1-4aa0-b552-7fb4989f1083" alt=""><figcaption></figcaption></figure>

* **Order : Coupon = N:M** (하나의 주문에는 여러 개의 쿠폰이 적용될 수 있음)







피드백 :&#x20;

1. Role은 있지만 권한이 없음. 권한 관리 체계 공부. (Enum을 HardCoding하지 않도록)
2. User : Cart는 1:N로 여러 level 별로 만들 수 있지만, MVP에서는 1:1로만.
3. 유저 테이블 Password 직접 관리? Password 관리 방식 Salt 공부.
4. CreatedAt, ModifiedAt
5. EventLog - EventType:종류(Label), Payload
6. Admin, UserTable 분리가  맞다. Salt 추가. Admin을 따로 관리하게 되면 인증을 분리하고 다르게. 실제 기획에서는 admin 인증은 다르게 되어 있다.
7. 3P를 하려면, User - Product 사이 Merchant-Vendor-Product(계층) 등의 계층 추가.
8. Category: 실제로는 세금, 면세 품목 같은걸로 분류된다. 하지만 여기서는 Product기준으로
9. Product, Review에 이미지 Url이 들어가야한다.
10. User-Coupon연결이 안되어있다. Order랑 연결되어야한다. 만료, 중복할인 규칙 정해야한다.
11. Promotion 제거하는게 좋을거 같음.
12. Order - Shipping 좀 이상함. OrderItem마다 운송장이 있어야하지 않나?
13. Seller를 없앤다. 3PL로 하지말고, Retail로 한다.
14. 로그인 테이블 JWT
15. JWT Payload - LifeCycle. JWT공부
