객체지향의 사실과 오해 1장에서 예시로 제시된 커피 주문 시나리오를 간단하게 구현해보는 프로젝트
협력, 역할, 책임을 고려하여 설계해보자.
주문의 id, Bucket의 내용물, 각 Product 종류마다 수량에 대한 가격, 총 가격, 주문 날짜에 대한 정보를 가지고 있는 객체
상품의 id, 이름, 가격과 같은 정보를 가지고 있는 객체
Customer가 선택한 Product과 그 Product의 수량 정보 리스트
- Menu를 참조해 Product를 선택하고
- Bucket을 생성
- OrderService에게 Bucket을 보내 Order 생성을 요청
- Order를 Casher에게 보내 Bill 생성 요청
- Order를 가지고 구매자와 판매자 정보가 포함된 Bill 생성
구매자와 판매자, Order 정보, 결제 방식, 청구 날짜가 포함된 객체
- 결제 히스토리 관리
- 결제 정보 생성
- 환불
구매자와 판매자, Order 정보, 결제 방식, 결제 날짜가 포함된 객체
-
소비자가 메뉴에게 아메리카노 정보를 요청
-
소비자가 지갑에게 돈을 요청
-
소비자가 판매자에게 아메리카노를 요청
- 판매자가 계산기(?)에 요금 계산을 요청
-
구매 기록 저장
-
영수증 반환
-
Order 객체 추가
- 소비자 정보(card_info, phone_number)
- 책임
- Order 생성하기
- Menu에서 Coffee 선택
- product 선택
- 수량 선택
- 가격 계산
- Bucket에 담기
- Order 생성
- Bucket 등록
- 시간 기록
- Menu에서 Coffee 선택
- Order 생성하기
- 책임
- Coffee 이름으로 커피 검색 후 정보 반환
- 책임
- Order를 ReceiptMachine에 입력
- Receipt 반환
- 책임
- 입력 받은 Order를 Receipt으로 생성 후 반환
대략적인 커피 주문 시스템을 구현하자
- 각 객체를 엔티티와 값 객체로 분류하자
- 각 값 객체의 동등성 테스트
- 각 엔티티의 동일성 테스트
- 쿼리와 명령을 분리하자
- 쿼리: 조회된 내용 검증 테스트
- 명령: 변경된 상태 확인 테스트
- 메인 시나리오를 구현하자
- 커피 하나만 주문하는 게 아닌 다수의 상품 주문 구현
- Order에 커피를 리스트로 받도록 추가 후 검증
- Receipt을 만들때 금액 총합 및 커피 리스트 나열
-
객체들의 행동을 기반으로 분류(추상화)해보자
-
협력에 기반해 요청을 생각하고 각 객체에 요청에 맞는 책임과 행동을 부여하자
- 제품 선택
- 주문 생성
- 청구서 생성
- 결제(여기선 상태를 바꾸는 등의 한 단계로 퉁쳐보자)
- 결제 수단 선택
- 결제 정보 인증
- 결제 체결
- 영수증 생성
- 결제 사항 확인
- 제품 구매라는 협력에 대한 책임을 정의
- 책임을 수행할 행동을 정의
- 정의된 행동을 세분화
- 세분화한 행동을 테스트로 구현
- 구현된 테스트를 기반으로 협력을 다시 구현
- 도메인 모델, 유스케이스, 협력을 생각하고 코드로 구현하기
- 유스케이스 명: 커피를 구매한다.
- 일차 액터: 소비자
- 주요 성공 시나리오:
- 소비자가 상품 리스트를 확인한다.
- 소비자가 커피를 선택해 주문리스트(장바구니)에 담는다.
- 장바구니를 전달받은 점원이 주문을 생성한다.
- 주문을 확인한 소비자는 점원으로부터 청구서를 받는다.
- 청구서를 받은 소비자는 결제방식을 선택해 결제를 진행한다.
- 소비자가 결제 내역을 확인하고 점원으로부터 상품과 영수증을 받는다.
- 확장:
- 커피말고 다른거
-
제품 선택
- 선택한 상품들이 제대로 선택되어 반환되는지
- 제대로 된 값이 들어갔을 때 제대로 반환하는지
- 잘못된 값이 들어갔을 때 에러를 발생시키는지
- 장바구니 생성(장바구니는 고객과 1:1 관계)
- 선택된 물품들 리스트로 장바구니를 생성할 수 있는지
- 물품들이 생성된 장바구니에 제대로 들어가 있는지
- 잘못됫 물품들을 집어넣으면 에러를 발생시키는지
- 선택한 상품들이 제대로 선택되어 반환되는지
-
주문 생성
- 장바구니가 입력되었을 때 제대로된 값이 주문에 들어가 있는지
- 주문 시간
- id
- 구매자
- 장바구니
- 가격 총합
- 품목별 가격
- 잘못된 값을 넣었을 때 에러를 발생시키는지
- 장바구니가 입력되었을 때 제대로된 값이 주문에 들어가 있는지
-
청구서 생성
- 받은 주문으로 청구서를 제대로 생성하는지
- id
- 청구 시간
- 구매자
- 판매자
- 결제 수단
- 결제 금액
- 구매 품목
- 잘못된 값에 대한 에러
- 받은 주문으로 청구서를 제대로 생성하는지
-
결제(여기선 상태를 바꾸는 등의 한 단계로 퉁쳐보자)
- 결제 수단 선택
- 결제 정보 인증
- 결제 체결
-
영수증 생성
- 청구서에 결제에 대한 영수증을 제대로 발급하는지
- id
- 결제 시간
- 구매자
- 판매자
- 결제 수단
- 결제 금액
- 구매 품목
- 잘못된 값에 대한 에러
- 청구서에 결제에 대한 영수증을 제대로 발급하는지
-
결제 사항 확인