Open
Description
프론트엔드 요구사항
상품 조회 페이지에서 상품을 클릭해 해당 상품 및 상품에 대한 옵션과 수량을 장바구니에 담을 수 있다.
예상되는 백엔드 API 요구사항 (이 Issue는 API까지 구현하지 않습니다.)
(임시 규칙)
- 사용자 당 장바구니는 하나만 존재한다.
- 장바구니는 익명 사용자의 경우 프론트엔드에서 임시 저장한다(보유기간 무제한).
- 익명 사용자가 로그인 시 장바구니가 해당 사용자의 장바구니로 복제된다.
- 로그인 된 사용자의 경우 해당 사용자의 장바구니에 곧장 담긴다.
장바구니 아이템 목록 조회: GET (사용자_ID) => [ { 상품_ID, 옵션, 수량 }, ... ]
장바구니 아이템 생성/수정: POST/PUT (사용자_ID, 장바구니_아이템_ID, 새_장바구니_아이템_필드) => [ ...새로운_목록 ]
장바구니 아이템 삭제: DELETE (사용자_ID, 장바구니_아이템_ID) => [ ...새로운_목록 ]
유비쿼터스 언어 추출
상품(Product
) (외부 애그리거트 루트)
장바구니(Cart
)
- 장바구니는 사용자마다 하나만 존재하므로 사용자 ID(
UserId
)로 식별할 수 있다. - 장바구니에 상품(
CartItem
) <상품, 옵션[], 수량>을 담을 수 있다. - 장바구니 상품의 옵션은
CartItemOption
으로 부르며, 문자열 필드Name
과 가격 필드Price
를 갖는다. - 장바구니 상품의 옵션은 여러 개가 존재할 수 있다.
- 장바구니 상품의 수량(
quantity
)은 1을 초과하는 정수이다.
도메인 모델
장바구니(Cart
) (루트 엔터티)
- owns 장바구니 상품(
CartItem
) (내부 엔터티) [1:N]CartItem
은 mutable이므로 엔터티로 정의한다.
테스트 케이스
CartItemOption
객체의 수량은 최소 1 이상의 정수이어야 한다.- [edited]
Cart
객체는UserId
로 식별할 수 있으며이 필드를 노출한다. Cart
객체는CartItem
을 추가할 수 있다.Cart
객체는CartItem
을 제거할 수 있다.Cart
객체는CartItem
을 변경할 수 있다.Cart
객체가 노출하는List<CartItem>
은 외부에서 그 내용을 수정할 수 없어야 한다.Cart
객체는CartItem
을 변경할 때 해당 Item이 이미 List에 없다면 예외를 발생시킨다.
리뷰 과정에서 제거된 테스트 케이스
CartItem의 내부 구현은 지금 단계에서 구현할 필요가 없어 테스트 케이스를 제거했습니다.
CartItem
객체가 가질 것으로 예상되는 상태인List<CartItemOption>
과Quantity
필드는 API 컨트롤러 혹은 애플리케이션 서비스 를 구현할 때 필요할 것으로 보여 해당 시점으로 미루기로 하였습니다.
- [removed]
CartItemOption
객체는Name
과Price
필드를 노출한다. - [removed]
CartItem
객체는Id
,List<CarItemOption>
,Quantity
필드를 노출한다.
추가된 테스트 케이스
CartItem
객체는Id
로 식별할 수 있다.
Activity