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

테스트 목록

이번 미션을 완성하기 위해 통과해야 할 테스트 목록을 다음과 같이 작성했다.

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

구현

새로 추가된 요구사항을 준수하며 개발을 시작해보자.

추가된 요구사항

m3t01

이 테스트를 통과하기 위해서는 Lotto 클래스가 필요하다.

Lotto

Lotto - 6개의 번호를 포장하는 일급 컬렉션이다.

m3t01

winningLotto는 당첨번호를 가지는 Lotto 인스턴스이다.

m3t01-impl

m3t02

발급된 로또와 당첨 로또를 비교하여 몇 등인지 계산하는 테스트이다.

  • LottoService - 로또와 관련된 비즈니스 로직을 처리한다.
    • 당첨 로또와 보너스 번호를 생성한다. (상태)
    • 사용자가 구매한 로또의 당첨 결과를 반환한다. (행위)
  • DrawResult - 추첨 결과를 표현하는 enum 클래스.
    • 1 ~ 5등까지의 조건(일치해야할 숫자 개수와 보너스 일치 여부)과 보상 정보 저장.
    • 일치하는 숫자와 보너스 일치 여부를 입력받아 적절한 결과 반환.
    • 각 등수의 상금 반환.

m3t02

테스트를 수정했다.
보너스 숫자 정보를 LottoService 클래스가 관리하도록 수정했다. 그리고 4, 5등에 대해 보너스 숫자가 맞은 경우도 추가했다. 4, 5등의 경우 보너스 숫자가 맞든 안 맞든 결과는 동일해야 한다.

m3t02-without-bonus

m3t02-with-bonus

LottoService 클래스

로또에 관련된 비즈니스 로직을 처리한다. 당첨 로또와 보너스 번호를 사용자의 로또와 비교하여 결과를 반환한다.

LottoService

DrawResult enum

각 등수에 대한 값들과 해당 값에 접근하는 연산을 한 군데로 모았다.

DrawResult-1

DrawResult-2

m3t07

당첨번호는 1부터 45까지의 중복이 없는 6개의 숫자만 가능하다. 이외의 값에 대해서는 예외를 던진다. 미션에서 제공한 테스트를 그대로 사용했다.

m3t07

범위를 벗어난 숫자로 Lotto를 생성하는 경우에 대한 테스트는 직접 추가했다.

m3t07-1

m3t08

보너스 번호는 1부터 45까지의 당첨번호와 중복되지 않는 숫자이다. 이외의 값에 대해서는 예외를 던진다.
보너스 번호의 유효성을 검사하려면 당첨번호를 알아야 한다.

m3t08

BonusNumber

보너스 번호를 표현하는 도메인 종속적인 클래스이다. 검증을 통과하여 생성된 보너스 번호는 값을 수정할 수 없다.

BonusNumber-1

BonusNumber-2

마무리

elapsed-time

reference

Comments