Skip to content

Conversation

@shlish95
Copy link

@shlish95 shlish95 commented Nov 3, 2025

로또(자동) 미션 – 구현 PR

개요

  • 목표: 콘솔 기반 로또 발매기 구현
  • 흐름: 구입 금액 입력 → 로또 발행(난수) 및 출력 → 당첨/보너스 입력 → 매칭/등수 집계 → 수익률 출력
  • 준수 사항: JDK 21, camp.nextstep.edu.missionutilsRandoms/Console 사용, UI 로직 단위 테스트 제외, 제공 Lotto 클래스 제약 준수

변경 사항

domain

  • PurchaseAmount: 금액 검증(공백/숫자/양수/1000단위) 및 장수 계산
  • LottoNumber: 번호 범위(1~45) 검증
  • LottoTicketFactory: 6개·중복 없음·범위 검증 후 오름차순 리스트 생성
  • WinningNumbers: 메인/보너스 입력 파싱 및 검증(중복 금지)
  • Rank: 등수/상금 정의(1~5등, NONE)
  • Result: 등수별 집계, 합산 상금, 스냅샷 제공
  • ProfitRate: 총 상금/지출 기반 수익률 계산(소수점 한 자리 반올림, % 포함)
  • Lotto: 중복 검증 보강, 출력용 numbers() 및 매칭 보조 메서드(contains, countMatchesWith)
  • LottoJudge: 단일 티켓과 당첨 번호 매칭하여 Rank 산출

application

  • LottoMachine: Randoms.pickUniqueNumbersInRange(1,45,6) 사용, 불변 리스트 → 가변 복사 후 정렬
  • GameRunner: 입력 → 발행 → 매칭 → 집계 → 출력 실행 플로우
  • Application: main 진입점 (Console.close() 호출 안 함 – NsTest 호환)

view

  • InputView: 재입력 루프(예외 시 [ERROR] 메시지 후 해당 입력부터 다시)
  • OutputView: 발행 결과/당첨 통계/수익률 출력. 예시와 동일한 포맷·개행·순서 유지

주요 요구사항 반영 여부

  • JDK 21에서 실행
  • 시작점 Application.main()
  • 외부 라이브러리 미사용(제공 라이브러리만 사용)
  • camp.nextstep.edu.missionutils.Randoms/Console 사용
  • else/switch 미사용, 메서드 15라인 내 유지(필요시 분리)
  • indent depth ≤ 2, 한 메서드 하나의 역할
  • 예외는 IllegalArgumentException 등 명확한 유형 사용, 메시지 [ERROR]로 시작
  • 발행 번호 오름차순 출력, 통계 출력 순서 고정(3→4→5→2→1등)
  • 수익률은 소수점 한 자리(둘째 자리 반올림) + % 표기

테스트

  • 도메인 단위 테스트: 금액 검증, 번호 범위/중복/정렬, 당첨 파싱, 등수 매핑, 집계/수익률
  • 통합(NsTest) 스모크: 고정 난수 시퀀스로 예시 출력 검증
  • 실패 원인이었던 부분 정리
    • LottoMachine: 불변 리스트 정렬 → 가변 복사 후 정렬로 수정
    • ProfitRate: % 누락 → % 포함하도록 수정
    • Result.snapshot(): 빈 맵 반환 → 집계 복사본 반환으로 수정

회고(간단)

  • 도전 포인트: UI 재입력 루프와 예외 메시지 규격화, NsTest 호환(콘솔 자원 정리)
  • 배운 점: 불변 컬렉션 다루기(정렬 시 가변 복사 필요), 출력 포맷을 테스트와 문자 단위로 맞추는 중요성
  • 다음 단계(아이디어): 출력 포맷을 Rank의 라벨로 캡슐화, 발행기 포트/어댑터 분리로 테스트 더블 주입

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