우아한테크코스 6기 백엔드 프리코스 - 로또

테스트 목록

앞으로 통과해야 할 테스트 목록

m3t01 - 발행한 로또의 번호와 당첨번호 비교해서 일치하는 숫자의 개수를 반환할 수 있어야 한다
m3t02 - 보너스 숫자가 반영된 당첨된 금액 계산
m3t03 - 구입 금액에 맞는 개수의 로또를 발행할 수 있어야 한다
m3t04 - 일치한 개수에 대한 수익률을 계산할 수 있어야 한다
m3t05 - 1000으로 나누어 떨어지지 않는 입력값에 대해 예외 발생
m3t06 - 당첨번호는 1부터 45까지의 중복을 허용하지 않는 6개의 숫자로만 구성된다
m3t07 - 보너스 번호는 1부터 45까지의 숫자 중 당첨번호에 없는 숫자여야 한다

구현

m3t05

로또 구입 금액이 1000의 배수가 아닌 경우 예외를 던져야 한다. 로또 구입 금액을 감싸는 PurchaseAmount 객체가 필요하다. 로또 구입 금액을 단순히 int가 아니라 PurchaseAmount 클래스로 감쌌을 때 얻는 이득은 다음과 같다.

  • 값과 연산을 한 군데로 모은다. int로 구현하면 입력을 받는 모든 부분에 검증 로직이 들어가야 한다.
  • 불변성을 보장한다.
  • 변수의 타입을 통해 의미를 표현할 수 있다.

m3t06

PurchaseAmount 클래스

PurchaseAmount

m3t03

PurchaseAmount 클래스는 구입금액에 맞는 로또의 수량을 반환할 수 있어야 한다. 너무 단순하기 때문에 빼야 할까 고민했지만 할인, 포인트 사용과 같은 로직이 추가될 경우에 대비해서 구현했다.

m3t03

m3t04

수익률을 계산하려면 구입한 모든 로또에 대한 정보를 리스트와 같은 컬렉션에 담아야 한다. 그래서 구입한 모든 로또를 표현하는 일급 컬렉션 LotteryPortfolio를 도입했다.

m3t04

LotteryPortfolio

오직 하나의 필드 final List<Lotto> holdings 만을 가지며 비즈니스 종속적인 기능을 제공한다.

LotteryPortfolio-1

LotteryPortfolio-2

마무리

elapsed-time

reference

Comments