Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Order Domain Objects - Cart, CartItem, CartItemOption #1

Open
seongbin9786 opened this issue Jan 29, 2022 · 0 comments · May be fixed by #2
Open

Implement Order Domain Objects - Cart, CartItem, CartItemOption #1

seongbin9786 opened this issue Jan 29, 2022 · 0 comments · May be fixed by #2
Assignees
Labels
feature New feature or request good first issue Good for newcomers

Comments

@seongbin9786
Copy link
Member

seongbin9786 commented Jan 29, 2022

프론트엔드 요구사항

상품 조회 페이지에서 상품을 클릭해 해당 상품 및 상품에 대한 옵션과 수량을 장바구니에 담을 수 있다.

예상되는 백엔드 API 요구사항 (이 Issue는 API까지 구현하지 않습니다.)

(임시 규칙)

  1. 사용자 당 장바구니는 하나만 존재한다.
  2. 장바구니는 익명 사용자의 경우 프론트엔드에서 임시 저장한다(보유기간 무제한).
  3. 익명 사용자가 로그인 시 장바구니가 해당 사용자의 장바구니로 복제된다.
  4. 로그인 된 사용자의 경우 해당 사용자의 장바구니에 곧장 담긴다.

장바구니 아이템 목록 조회: 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이므로 엔터티로 정의한다.

테스트 케이스

  1. CartItemOption 객체의 수량은 최소 1 이상의 정수이어야 한다.
  2. [edited] Cart 객체는 UserId로 식별할 수 있으며 이 필드를 노출한다.
  3. Cart 객체는 CartItem을 추가할 수 있다.
  4. Cart 객체는 CartItem을 제거할 수 있다.
  5. Cart 객체는 CartItem을 변경할 수 있다.
  6. Cart 객체가 노출하는 List<CartItem>은 외부에서 그 내용을 수정할 수 없어야 한다.
  7. Cart 객체는 CartItem을 변경할 때 해당 Item이 이미 List에 없다면 예외를 발생시킨다.

리뷰 과정에서 제거된 테스트 케이스

CartItem의 내부 구현은 지금 단계에서 구현할 필요가 없어 테스트 케이스를 제거했습니다.

  • CartItem 객체가 가질 것으로 예상되는 상태인 List<CartItemOption>Quantity 필드는 API 컨트롤러 혹은 애플리케이션 서비스 를 구현할 때 필요할 것으로 보여 해당 시점으로 미루기로 하였습니다.
  1. [removed] CartItemOption 객체는 NamePrice 필드를 노출한다.
  2. [removed] CartItem 객체는 Id, List<CarItemOption>, Quantity 필드를 노출한다.

추가된 테스트 케이스

  1. CartItem 객체는 Id로 식별할 수 있다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New feature or request good first issue Good for newcomers
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants