Skip to content

[행성 로또] 박건규 미션 제출합니다.#39

Open
geongyu09 wants to merge 30 commits intowoowacourse-precourse:mainfrom
geongyu09:geongyu09
Open

[행성 로또] 박건규 미션 제출합니다.#39
geongyu09 wants to merge 30 commits intowoowacourse-precourse:mainfrom
geongyu09:geongyu09

Conversation

@geongyu09
Copy link

@geongyu09 geongyu09 commented Jan 10, 2026

javascript-planetlotto-precourse

요구사항 분석

1. 구입 금액 입력

  • "구입금액을 입력해 주세요." 라는 문구와 함께 입력받는다.

입력 요구사항

  • 구입 금액은 500원 단위의 정수만 가능하다.
  • 올바르지 않은 입력을 한 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 다시 입력 받는다.

2. 구매 내역 출력

  • "${개수}개를 구매했습니다." 라는 문구와 함께 구입한 로또의 개수와 번호를 출력한다.
  • 로또의 가격은 1개당 500원이며, 구매한 로또 개수는 구입금액 / 500 이다.
  • 로또 번호는 1~30까지의 중복되지 않은 정수이다.
  • 로또 번호는 오름차순으로 정렬해 보여준다.

3. 당첨 번호 입력

  • "당첨 번호를 입력해 주세요."라는 문구와 함께 당첨 번호를 입력받는다.

입력 요구사항

  • 번호는 쉽표를 기준으로 구분한다.
  • 번호는 1~30까지의 중복되지 않은 정수이다.
  • 올바르지 않은 입력을 한 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 다시 입력 받는다.

e.g.

[ERROR] 로또 번호는 1부터 30 사이의 숫자여야 합니다.

4. 보너스 번호 입력

  • "보너스 번호 번호를 입력해 주세요." 문구와 함께 보너스 번호를 입력받는다.

입력 요구사항

  • 번호는 1~30까지의 중복되지 않은 정수이다.
  • 이전에 입력한 당첨 번호와 중복될 수 없다.
  • 올바르지 않은 입력을 한 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 다시 입력 받는다.

5. 당첨 통계 출력

  • "당첨 통계\n---\n" 문구와 함께 당첨 통계를 출력한다.
  • 당첨은 1등부터 5등까지 있으며, 당첨 기준과 금액은 아래와 같다.
    • 1등: 5개 번호 일치 / 100,000,000원
    • 2등: 4개 번호 + 보너스 번호 일치 / 10,000,000원
    • 3등: 4개 번호 일치 / 1,500,000원
    • 4등: 3개 번호 일치 + 보너스 번호 일치 / 500,000원
    • 5등: 2개 번호 일치 + 보너스 번호 일치 / 5,000원

구현 사항

  • 1. 구입 금액 입력

    • "구입금액을 입력해 주세요." 라는 문구와 함께 입력 받음
      • 구입 금액은 500원 단위의 정수만 가능
      • 올바르지 않은 입력을 한 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 다시 입력 받음
  • 2. 구매 내역 출력

    • "${개수}개를 구매했습니다." 라는 문구와 함께 구입한 로또의 개수와 번호를 출력
      • 로또의 가격은 1개당 500원이며, 구매한 로또 개수는 구입금액 / 500
      • 로또 번호는 1~30까지의 중복되지 않은 정수
      • 로또 번호는 오름차순으로 정렬
  • 3. 당첨 번호 입력

    • "당첨 번호를 입력해 주세요."라는 문구와 함께 당첨 번호를 입력받는다.
      • 번호는 쉽표를 기준으로 구분
      • 번호는 1~30까지의 중복되지 않은 정수
      • 올바르지 않은 입력을 한 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 다시 입력 받음
  • 4. 보너스 번호 입력

    • "보너스 번호 번호를 입력해 주세요." 문구와 함께 보너스 번호를 입력받음
      • 번호는 1~30까지의 중복되지 않은 정수
      • 입력했던 당첨 번호와 중복되지 않음
      • 올바르지 않은 입력을 한 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 다시 입력 받음
  • 5. 당첨 통계 출력

    • "당첨 통계\n---\n" 문구와 함께 당첨 통계를 출력
    • 당첨 통계 게산
      • 1등: 5개 번호 일치
      • 2등: 4개 번호 + 보너스 번호 일치
      • 3등: 4개 번호 일치
      • 4등: 3개 번호 일치 + 보너스 번호 일치
      • 5등: 2개 번호 일치 + 보너스 번호 일치

리팩토링 구현 사항

최소 조건

  • 모든 함수는 15줄을 넘지 않는다.
  • 모든 함수는 index level 2를 넘지 않는다. 단, class, try...cach 문의 들여쓰기는 제외한다.
  • 사용하지 않는 코드는 지운다.

추가 조건

  • (테스트 코드를 포함하여) 코드의 반복을 최대한 줄인다.
  • 객체의 상태 접근과 관련한 리팩터링을 한다.
    • 클래스는 단순히 값을 반환하는 메서드를 가지는 것 보다는 그 기능을 하도록 구현한다.
    • 어떤 값을 감춰야 할지 고민한다.
image

문제를 바탕으로 요구사항을 분석하고, 분석한 요구사항을 바탕으로 TODO를 작성하였습니다.
요구사항에 맞추어
Validator 객체의 checkIsValidAmount 테스트 코드를 작성하였습니다.
- 구매 금액은 500원 단위의 양의정수여야한다.
OutputView의 printErrorMessage 메서드에서 접두사를 붙이고 있습니다.
이에 따라서 중복으로 메시지에 접두사를 붙이지 않도록 수정하였습니다.
변경된 코드에 맞추어 테스트 코드도 수정하였습니다.
입력을 받는 모든 곳에서 에러 메시지 출력 및 다시 입력을 받는 기능이 수반됩니다.
이에 따라서 해당 기능을 추상화한 handleInputError를 구현하였습니다.

handleInputError는 아래와 같이 구성되어있습니다.
- 입력 로직 : 입력을 받는 비동기 함수.
- validator : 입력 로직이 반환한 값을 넣어서 실행하는 함수
- parser : 입력받은 값을 변경해서 반환하는 함수

각 단계에서 에러가 잡히게 되면, 다시 해당 입력 로직이 실행되도록 하였습니다.
- 로또의 가격은 500원 이어야 한다. 이는 정적 멤버여야한다.
- 로또는 생성자를 통해 발행 가능하다.
- 생성자에는 올바른 번호 6자리를 입력받아야 한다.
- 로또 번호의 범위는 1 ~ 30 이다.
- 생성한 로또의 번호는 getLottoNumbers 를 통하여 가져올 수 있어야 한다.
외부 의존성이다보니 해당 로직을 따로 빼서 사용하는 곳에서 테스트가 쉽도록 주입하게 하려했습니다.
- 요구사항에 맞추어 5개만 입력받을 수 있도록 수정하였습니다.
- 특정 객체에 종속되지 않는 것이 좋아보여 static으로 구현하였습니다.
- 로또를 구매하고 구매한 로또와 관련된 일련의 작업을 LottoDevice에서 하도록 하였습니다.

- 로또를 발행하기 위해 랜덤한 수를 뽑아야 합니다. 다만 이는 "로또 발행"에 종속된 동작이므로 유틸 함수가 아닌 해당 클래스에 넣었습니다.
calcRank를 통하여 등수를 반환할 때 0으로 반환된 값을 카운트 하도록 수정하였습니다
- constants.js에 있는 LOTTO_COST값 제거
- utils.js에 있는 getRandomLottoNumbers 제거
- handleInputError의 parser 문 제거
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments