Skip to content

우아한 테크캠프 Pro 레거시 리팩터링 과정 저장소

Notifications You must be signed in to change notification settings

jaenyeong/jwp-refactoring

 
 

Repository files navigation

우아한 테크캠프 Pro 1기

교육과정 보기

  • NextStep & 우아한 형제들 주관
  • 일반 사용자용 서비스를 개발할 때 필요한 역량 습득
  • 리뷰어의 코드 리뷰를 통해 책임 주도 설계를 기반으로 유연한 구조의 클린 코드를 작성

배운 점

미션 주요 내용

테스트 코드를 기반으로 레거시 코드를 안전하게 리팩터링, 멀티 모듈 구성

  • 안전하게 리팩터링할 수 있도록 각 기능에 테스트 코드를 작성
    • 이를 통해 리팩터링 중 기능의 버그 발생 확률을 낮춤
  • DDD를 기반으로 기존에 서비스 레이어의 쌓여 있는 비즈니스 로직을 도메인 레이어으로 추출
    • 이를 통해 기존의 DB 위주의 설계(데이터 주도 설계, 절차 지향적)와 도메인 주도 설계의 패러다임 불일치 해결
  • 모듈 간 또는 객체 간 양방향 의존성을 단방향으로 변경
    • 양방향 의존은 성능, 유연성, 가독성 등 여러 부분에서 비효율적
  • 유연한 구조를 위해 도메인을 기준으로 독립적인 모듈로 만들어 멀티 모듈 형태로 관리

Step 1

Step1 피드백 보기

주요 피드백 내용

  • Mocking 테스트와 실제 인스턴스를 사용 테스트는 생각보다 큰 차이가 있기 때문에 잘 판단할 것
    • Mocking 테스트는 간결하고 빠른 테스트가 가능하지만 정확한 테스트가 어려움
    • 실제 인스턴스를 사용하는 방법은 프로덕션 코드를 그대로 테스트 할 수 있지만 픽스처 생성 등 부가 작업이 생길 수 있음
    • 또한 어떤 테스트든 완전히 버그가 없는 무결한 상태를 의미하지 않음

Step 2

Step2 피드백 보기

주요 피드백 내용

  • 테스트에 필요한 데이터는 상황에 따라 SQL 파일보다 픽스처를 생성하여 사용하는 것이 효율적일 수 있음
  • if문 조건 등을 메서드로 추출(추상화)하여 간결한 코드로 만들어 가독성을 높일 수 있음
  • 도메인으로 들어갈 수 있는 책임(기능)을 잘 판단할 것

Step 3

Step3 피드백 보기

주요 피드백 내용

  • MenuProduct 객체와 이를 감싸고 있는 @Embeddable MenuProducts 객체는 연관관계가 아님
    • 단순히 감싸고 있는 일급 컬렉션
    • Menu 객체와 MenuProduct이 양방향 연관관계

Step 4

Step4 피드백 보기

주요 피드백 내용

  • 피드백 내용 없음

키친포스

요구 사항 (엔드 포인트 별)

MenuGroupRestController

  • 메뉴 그룹 생성 기능
  • 메뉴 그룹 조회 기능

MenuRestController

  • 메뉴 생성 기능
    • 가격은 0원 이하일 수 없음
    • 메뉴 그룹이 존재하지 않으면 등록할 수 없음 (특정 메뉴 그룹에 속해 있어야 함)
    • 메뉴 내의 각 제품 가격 * 수량을 모두 합산한 것 보다 메뉴의 가격이 크다면 등록할 수 없음
  • 메뉴 조회 기능
  • 제품들을 저장, 해당 메뉴와 매핑

OrderRestController

  • 주문 생성 기능
    • 생성 요청시 상품을 같이 주문하지 않는다면 생성 불가
    • 요청한 모든 주문 상품들이 메뉴에 모두 등록되어 있지 않다면 생성 불가
    • 존재하지 않는(비어있는) 주문 테이블이라면 생성 불가
  • 주문 조회 기능
  • 주문 상태 변경 기능
    • 해당 주문이 존재하지 않는 경우 변경 불가
    • 이미 완료된 상태라면 변경 불가

ProductRestController

  • 상품 생성 기능
    • 상품의 가격이 0원 이하라면 제품 생성 불가
  • 상품 조회 기능

TableGroupRestController

  • 테이블 그룹 생성(단체 지정) 기능
    • 생성 요청시 주문 테이블 크기가 2이하라면 생성 불가
    • 생성 요청한 주문 테이블이 다른 그룹 테이블에 존재한다면(중복으로 단체 지정) 생성 불가
  • 테이블 그룹 해제(단체 지정 해지) 기능
    • 해당 주문 테이블의 주문 상태가 조리중, 식사중인 경우 해지 불가

TableRestController

  • 주문 테이블 생성 기능
  • 주문 테이블 조회 기능
  • 비어있는 테이블 설정 기능
    • 유효하지 않은 주문 테이블이라면 설정 불가
    • 해당 주문 테이블이 테이블 그룹에 속해있다면 설정 불가
    • 주문 테이블이 조리, 식사중인 경우 해지 불가
  • 게스트의 수 변경(또는 등록) 기능
    • 요청한 게스트의 수가 0 이하라면 변경 불가
    • 요청한 주문 테이블이 존재하지 않는(빈 테이블) 경우 변경 불가

용어 사전

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

About

우아한 테크캠프 Pro 레거시 리팩터링 과정 저장소

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%