오늘 학습한 내용 요약
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 설정)
──────────────────────────────────
│
▼
──────────────────────────────────
📌 CartController
- POST /cart/add (세션에 담기)
- POST /order/checkout (주문 생성)
──────────────────────────────────
│
▼
──────────────────────────────────
📦 CartService
- 메뉴 유효성 검증
- 세션에 CartItem 저장
- 장바구니 → 주문 데이터 복사
──────────────────────────────────
│
▼
──────────────────────────────────
🗃️ MenuRepository
- 메뉴 정보 조회 (DB)
🗃️ OrderRepository
- Order 및 OrderItem 저장
🗃️ RedisSession (or 세션 저장소)
- Cart 정보 임시 저장 (12시간 TTL 설정)
──────────────────────────────────