Skip to content

우테캠프로 - 레거시 코드 리팩터링 (Step4 Branch)

Notifications You must be signed in to change notification settings

ssamzag/jwp-refactoring

 
 

Repository files navigation

키친포스

요구 사항

상품 (Product)

  • 상품을 등록할 수 있다.
    • 상품의 가격이 올바르지 않으면 등록할 수 없다.
      • 상품의 가격은 0 원 이상이어야 한다.
    • 상품의 목록을 조회할 수 있다.

메뉴 그룹 (Menu Group)

  • 메뉴 그룹을 등록할 수 있다.
  • 전체 메뉴 그룹을 조회할 수 있다.

메뉴 (Menu)

  • 메뉴를 등록할 수 있다.
    • 메뉴 가격은 0원 이상이어야 한다.
    • 메뉴 그룹이 지정 되어야 한다.
    • 메뉴의 가격은 메뉴상품 총합보다 낮아야 한다.
    • 메뉴에 추가할 상품이 등록되어 있어야한다.
  • 전체 메뉴를 조회할 수 있다.

주문 (Order)

  • 주문을 등록할 수 있다.
    • 주문 항목이 비어있으면 등록할 수 없다.
    • 주문 항목의 메뉴가 존재해야 한다.
    • 주문 항목의 주문테이블이 존재해야 한다.
    • 주문 테이블은 빈 테이블이 아니어야 한다.
    • 주문테이블, 주문시간, 주문항목을 등록하고 주문상태는 COOKING으로 변경한다.
  • 전체 주문을 조회할 수 있다.
  • 주문 상태를 변경할 수 있다.
    • 유효한 주문인지 체크한다.
      • 주문이 등록되어 있어야 한다.
    • 주문상태가 COMPLETION 이면 변경할 수 없다.

주문 테이블 (Order Table)

  • 주문테이블을 등록할 수 있다.
    • 테이블 그룹은 null 로 초기화 한다.
  • 전체 테이블 목록를 조회할 수 있다.
  • 테이블을 비울 수 있다.
    • 주문테이블이 존재해야 한다.
    • 단체 테이블이면 초기화할 수 없다.
    • 주문테이블의 주문상태가 COOKING, MEAL이면 초기화할 수 없다.
  • 테이블의 손님 수를 변경할 수 있다.
    • 변경할 손님 수는 0명 이상이어야 한다.
    • 주문 테이블이 유효해야 한다.
    • 주문 테이블이 비어 있으면 안 된다.

테이블 그룹 (Table Group)

  • 단체 테이블을 등록한다.
    • 주문 테이블이 비어 있으면 안 된다.
    • 주문 테이블이 두 개 이상이어야 한다.
    • 단체 테이블로 지정할 주문 테이블들은 미리 등록되어 있어야 한다.
    • 주문 테이블은 빈 테이블이 아니어야 한다.
    • 단체로 지정된 테이블이 아니어야 한다.
  • 단체 테이블을 해제한다.
    • 주문 테이블 중 하나라도 주문상태가 COOKING, MEAL 이면 해제할 수 없다.

용어 사전

한글명 영문명 설명
상품 product 메뉴를 관리하는 기준이 되는 데이터
메뉴 그룹 menu group 메뉴 묶음, 분류
메뉴 menu 메뉴 그룹에 속하는 실제 주문 가능 단위
메뉴 상품 menu product 메뉴에 속하는 수량이 있는 상품
금액 amount 가격 * 수량
주문 테이블 order table 매장에서 주문이 발생하는 영역
빈 테이블 empty table 주문을 등록할 수 없는 주문 테이블
주문 order 매장에서 발생하는 주문
주문 상태 order status 주문은 조리 ➜ 식사 ➜ 계산 완료 순서로 진행된다.
방문한 손님 수 number of guests 필수 사항은 아니며 주문은 0명으로 등록할 수 있다.
단체 지정 table group 통합 계산을 위해 개별 주문 테이블을 그룹화하는 기능
주문 항목 order line item 주문에 속하는 수량이 있는 메뉴
매장 식사 eat in 포장하지 않고 매장에서 식사하는 것

1단계 - 테스트를 통한 코드보호

  • kitchenpos 패키지 코드를 분석하여 요구사항을 README.md에 작성한다.
  • 모든 Business Object에 대한 테스크 코드를 @SpringBootTest 를 이용한 통합 테스트 코드 또는 @ExtendWith(MockitoExcention.class)를 이용한 단위 테스트 코드를 작성한다.
  • Lombok 없이 미션을 진행한다.

구현

  • 요구사항 작성
  • 테스트 코드 구현

2단계 - 서비스 리팩터링

  • 단위 테스트하기 어려운 코드와 단위 테스트 가능한 코드를 분리해 단위 테스트 가능한 코드에 대해 단위 테스트를 구현한다.

3단계 - 의존성 리팩터링

  • 메뉴의 이름과 가격이 변경되면 주문 항목도 함께 변경된다. 메뉴 정보가 변경되더라도 주문 항목이 변경되지 않게 구현한다.
  • 클래스 간의 방향도 중요하고 패키지 간의 방향도 중요하다. 클래스 사이, 패키지 사이의 의존 관계는 단방향이 되도록 해야 한다.

- 구현

  • 다른 패키지의 엔티티 직접참조 -> 간접참조
  • 도메인 이벤트 활용
  • Validator 주입

- 리팩터링 후 엔티티 연관관계 다이어그램

img_1.png

4단계 - 멀티 모듈 적용

요구 사항

  • Gradle의 멀티 모듈 개념을 적용해 자유롭게 서로 다른 프로젝트로 분리해 본다.
    • 컨텍스트 간의 독립된 모듈로 만들 수 있다.
    • 계층 간의 독립된 모듈로 만들 수 있다.
  • 의존성 주입, HTTP 요청/응답, 이벤트 발행/구독 등 다양한 방식으로 모듈 간 데이터를 주고받을 수 있다.

구현

도메인 단위로 구성

  • module-main
    • Application.run
  • module-common
    • Name
    • Price
    • Quantity
  • module-product
    • Product
  • module-menu
    • Menu
    • MenuGroup
  • module-order
    • Order
    • Table
    • TableGroup

About

우테캠프로 - 레거시 코드 리팩터링 (Step4 Branch)

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%