본문 바로가기

카테고리 없음

📝 TIL - 주문(Order), 메뉴(Menu), 장바구니(Cart)의 관계와 구조 설계

오늘 학습한 내용 요약

1. 주문과 메뉴는 직접 연결되지 않는다

  • 메뉴는 독립적인 정적 데이터로, 주문에 직접 종속되면 안 된다.
  • 메뉴는 여러 주문에 사용될 수 있으며, orderId를 갖지 않음이 바람직하다.

2. 중간 테이블 OrderItem의 도입

  • OrderItem은 Order와 Menu를 연결하며, 수량, 옵션 등의 추가 정보를 가진다.
  • 이로 인해 하나의 주문에 여러 메뉴를 담을 수 있고, N:M 관계를 1:N:N:1로 풀 수 있다.

3. 장바구니는 임시 저장소이며 세션 기반

  • CartItem을 통해 메뉴를 장바구니에 담지만, 이는 주문과 무관한 독립 구조이다.
  • 결제 시점에 CartItem을 OrderItem으로 복사해서 주문 생성.
  • 장바구니 데이터는 세션 또는 Redis에 저장되며, 12시간 이후 자동 삭제되는 정책을 적용함.

4. 장바구니와 주문의 차이점

항목장바구니(Cart)주문(Order)
생성 시점 사용자가 메뉴를 담을 때 결제 버튼을 누를 때
데이터 임시 데이터 (세션 기반) 영속성 데이터 (DB 저장)
목적 선택 저장 구매 확정
만료 12시간 이후 자동 삭제 삭제되지 않음 (주문 기록 보존 필요)

 

📊 Controller → Service → Repository 흐름도

[사용자 요청: 장바구니 담기 / 주문 생성]
        │
        ▼
──────────────────────────────────
📌 CartController
 - POST /cart/add (세션에 담기)
 - POST /order/checkout (주문 생성)
──────────────────────────────────
        │
        ▼
──────────────────────────────────
📦 CartService
 - 메뉴 유효성 검증
 - 세션에 CartItem 저장
 - 장바구니 → 주문 데이터 복사
──────────────────────────────────
        │
        ▼
──────────────────────────────────
🗃️ MenuRepository
 - 메뉴 정보 조회 (DB)

🗃️ OrderRepository
 - Order 및 OrderItem 저장

🗃️ RedisSession (or 세션 저장소)
 - Cart 정보 임시 저장 (12시간 TTL 설정)
──────────────────────────────────