Skip to content

Conversation

@codingle2
Copy link

javascript-lotto-precourse

로또

프로젝트 개요

콘솔(Console) 환경에서 동작하는 로또 게임 애플리케이션입니다. 사용자가 구입 금액을 입력하면 로또를 발급하고,
당첨 번호와 보너스 번호를 입력받아 당첨 통계 및 수익률을 계산합니다. 사용자는 구매 금액을 입력하면 자동으로 로또 번호가 발행됩니다.
이후 당첨 번호와 보너스 번호를 입력하면, 전체 당첨 통계와 총 수익률이 계산되어 출력됩니다.

  • 목표: 로또 발매기 및 여러 에러 케이스 정리
  • 패턴: MVC (Model-View-Controller)

기능적 요소

기능 설명
구매 금액 입력 및 유효성 검사 1,000원 단위 금액만 허용. 0 이하 금액 예외 처리
로또 자동 발행 1~45 사이의 숫자 6개 랜덤 생성 (중복 없음)
당첨 결과 계산 3개 이상 일치 시 당첨. 5개+보너스 시 2등 처리
통계 및 수익률 계산 전체 구매 대비 수익률 (%) 계산
에러 및 입력 검증 시스템 통합 예외 처리
자동 시뮬레이션 1만 장 구매 등 대규모 통계 테스트 가능

기능 요구 사항

주요 설계 결정

  1. MVC (Model-View-Controller) 패턴 적용
  • Model (Lotto, LottoStore, PrizeCalculator): 데이터와 비즈니스 로직을 담당합니다.
  • View (InputView, OutputView): 콘솔 입출력(UI)을 담당하며, 로직을 가지지 않습니다.
  • Controller (LottoController): View로부터 입력을 받아 Model을 제어하고, Model의 데이터를 View를 통해 출력합니다.
  • 이를 통해 **관심사 분리(Separation of Concerns)**를 달성하여 코드의 유지보수성과 테스트 용이성을 높였습니다.
  1. 도메인 객체의 자가 유효성 검증 (Self-Validation)
  • Lotto 클래스는 생성자(constructor)에서 로또 번호의 개수(6개), 중복, 숫자 범위(1~45)를 스스로 검증합니다.
  • 따라서 LottoController는 당첨 번호를 입력받을 때도 new Lotto(numbers)를 호출하는 것만으로 검증 로직을 재사용 가능.
  1. 상수 설정
  • LottoConfig.js 파일에 로또 가격, 번호 범위, 당첨금, 모든 에러 메시지를 상수로 정의
  • 로또 가격 변경하거나 "에러 메시지 수정"이 필요할 때, 이 파일 한 곳만 수정하면 전체 반영.

아키텍쳐

MVC 패턴
📁 src
 ├── App.js                # 프로그램 시작점 (run())
 ├── controller/
 │    └── LottoController.js # 사용자 입력/출력 흐름 제어
 ├── model/
 │    ├── Lotto.js           # 한 장 로또, 번호 관리
 │    ├── LottoStore.js      # 여러 장 로또 관리
 │    └── PrizeCalculator.js # 당첨 결과 계산 및 수익률
 ├── view/
 │    ├── InputView.js       # 사용자 입력
 │    └── OutputView.js      # 출력
 └── constants/
      └── LottoConfig.js     # 번호 범위, 가격, 상금, 등수 설정

branch 구조

브랜치 이름 담당 기능 상세 내용 테스트 포인트
feature/set-up 기본 구조 생성 MVC 패턴 별 폴더, 파일 생성 기본적인 프로젝트 생성
feature/purchase-input 구입 금액 입력 1000원 단위 입력, 잘못된 입력 시 [ERROR] 출력 후 재입력 금액 범위, 1000원 단위 확인, 재입력 흐름
feature/lotto-generation 로또 발행 1~45 범위, 중복 없는 6개 번호 생성, N장 구매 시 N개 생성 번호 개수, 범위, 중복, 오름차순 정렬
feature/winning-input 당첨 번호 입력 쉼표 구분 6개 숫자 입력, 범위 1~45, 중복 불가 번호 개수, 범위, 중복, 재입력 흐름
feature/result-calculation 당첨 결과 & 수익률 등수 판정, 당첨 개수 계산, 총 수익률 계산 등수 판정 로직, 보너스 번호 판정, 수익률 계산
feature/error-handling 예외 처리 금액, 번호, 보너스 입력 오류 처리, [ERROR] 메시지 통일 Error 메시지 테스트, 재입력 흐름 검증

코드적 요소

요소 상세 내용
객체지향 Lotto, LottoStore, PrizeCalculator 클래스별 단일 책임(SRP)
SRP 클래스/메서드별 단일 책임 유지, 15줄 이하
에러 처리 [ERROR] 메시지 일관성, 타입별 Error 분리 가능
입출력 추상화 InputView / OutputView 인터페이스 적용 → Mocking 가능
설정화 LottoConfig → 번호 범위, 가격, 상금, 등수 관리

요구사항: SRP, 함수 길이 15줄 이하, 3항 연산자 사용 금지, 함수형 프로그래밍 일부 적용

👤 개발자 이름: 이원형 프리코스 과제: 자동차 경주 (racingcar-precourse)

- 사용자의 구입 금액 입력 기능 구현 (InputView)
- 출력 기능 구현 (OutputView)
- 숫자 입력 및 1,000원 단위 유효성 검사 추가
- LottoController와 입력 흐름 연동
- 잘못된 입력에 대한 예외 처리 추가
- LottoController에 issueLottos() 메서드 추가로 로또 생성 및 출력 기능 구현
- LottoStore 모델 생성 및 mission-utils Random API로 번호 무작위 생성 적용
- Lotto 클래스에 번호 검증, 정렬, 일치 개수 계산, 보너스 확인 로직 추가
- OutputView에서 로또 구매 결과 및 발행된 로또 번호 출력 구현
- 전체 흐름(App.js): 구입 금액 입력 → 로또 발행 → 출력 순서
- LottoController에 당첨 번호 관련 메서드 추가
- LottoController 보너스 번호 유효성 검사
- InputView 당첨, 보너스 번호 입력 추가
- LOTTO_CONFIG.js 에러 메시지 추가
- 전체 흐름(App.js): 로또 발행 → 당첨 번호 → 보너스 번호
- LottoController 당첨 결과를 계산하고 출력을 요청
- PrizeCalculator.js 구현
- OutPutView
- LOTTO_CONFIG.js 당첨 등수, 당첨금 추가
- 전체 흐름(App.js): 결과 계산 및 출력 추가
- Lotto.js test 케이스를 위한 파일 위치 변경
- PrizeCalculator.test.js 테스트 추가
- 당첨 결과 테스트, 수익율 테스트
- 1만장 구매 자동화 테스트
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