일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 13기
- SWEA
- 삼성
- 우테코 7기
- 우테코
- 우테코 프리코스
- 개발자
- 정보처리기사
- 정처기
- 코딩
- 마이스터고
- 싸피 13기
- dfs
- 파이썬
- 코딩테스트
- SSAFY
- 백준
- 디자인패턴
- 삼성 청년 SW 아카데미
- 프리코스
- 부트캠프
- UML
- 코테
- 취뽀
- 비전공자
- 삼성 청년 sw아카데미
- 싸피
- 삼성청년SW아카데미
- 삼성 부트캠프
- 백준 2003
- Today
- Total
룰루코딩
우테코 프리코스 3주차 회고록 본문
로또
과제 진행 요구 사항
- 미션은 로또 저장소를 포크하고 클론하는 것으로 시작한다.
- 기능을 구현하기 전 README.md에 구현할 기능 목록을 정리해 추가한다.
- Git의 커밋 단위는 앞 단계에서 README.md에 정리한 기능 목록 단위로 추가한다.
- AngularJS Git Commit Message Conventions을 참고해 커밋 메시지를 작성한다.
- 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다.
기능 요구 사항
간단한 로또 발매기를 구현한다.
- 로또 번호의 숫자 범위는 1~45까지이다.
- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
- 로또 1장의 가격은 1,000원이다.
- 당첨 번호와 보너스 번호를 입력받는다.
- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
- 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 해당 지점부터 다시 입력을 받는다.
입출력 요구 사항
입력
- 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다.
14000
- 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다.
1,2,3,4,5,6
- 보너스 번호를 입력 받는다.
7
출력
- 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다.
8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
- 당첨 내역을 출력한다.
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
- 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%)
총 수익률은 62.5%입니다.
- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다.
[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다.
실행 결과 예시
구입금액을 입력해 주세요.
8000
8개를 구매했습니다.
[8, 21, 23, 41, 42, 43]
[3, 5, 11, 16, 32, 38]
[7, 11, 16, 35, 36, 44]
[1, 8, 11, 31, 41, 42]
[13, 14, 16, 38, 42, 45]
[7, 11, 30, 40, 42, 43]
[2, 13, 22, 32, 38, 45]
[1, 3, 5, 14, 22, 45]
당첨 번호를 입력해 주세요.
1,2,3,4,5,6
보너스 번호를 입력해 주세요.
7
당첨 통계
---
3개 일치 (5,000원) - 1개
4개 일치 (50,000원) - 0개
5개 일치 (1,500,000원) - 0개
5개 일치, 보너스 볼 일치 (30,000,000원) - 0개
6개 일치 (2,000,000,000원) - 0개
총 수익률은 62.5%입니다.
프로그래밍 요구 사항 1
- Node.js 20.17.0 버전에서 실행 가능해야 한다.
- 프로그램 실행의 시작점은 App.js의 run()이다.
- package.json 파일은 변경할 수 없으며, 제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다.
- 프로그램 종료 시 process.exit()를 호출하지 않는다.
- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다.
- 자바스크립트 코드 컨벤션을 지키면서 프로그래밍한다.
- 기본적으로 JavaScript Style Guide를 원칙으로 한다.
프로그래밍 요구 사항 2
- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.
- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
- Jest를 이용하여 정리한 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인한다.
- 테스트 도구 사용법이 익숙하지 않다면 아래 문서를 참고하여 학습한 후 테스트를 구현한다.
프로그래밍 요구 사항 3
- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
- 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다.
- else를 지양한다.
- 때로는 if/else, when문을 사용하는 것이 더 깔끔해 보일 수 있다. 어느 경우에 쓰는 것이 적절할지 스스로 고민해 본다.
- 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
- 구현한 기능에 대한 단위 테스트를 작성한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다.
- 단위 테스트 작성이 익숙하지 않다면 LottoTest를 참고하여 학습한 후 테스트를 작성한다.
라이브러리
- @woowacourse/mission-utils에서 제공하는 Random 및 Console API를 사용하여 구현해야 한다.
- Random 값 추출은 Random. pickUniqueNumbersInRange()를 활용한다.
- 사용자의 값을 입력 및 출력하려면 Console.readLineAsync()와 Console.print()를 활용한다.
사용 예시
- 1에서 45 사이의 중복되지 않은 정수 6개 반환
MissionUtils.Random.pickUniqueNumbersInRange(1, 45, 6);
Lotto 클래스
- 제공된 Lotto 클래스를 사용하여 구현해야 한다.
- Lotto에 numbers 이외의 필드(인스턴스 변수)를 추가할 수 없다.
- numbers의 접근 제어자인 #은 변경할 수 없다.
- Lotto의 패키지를 변경할 수 있다.
class Lotto {
#numbers;
constructor(numbers) {
this.#validate(numbers);
this.#numbers = numbers;
}
#validate(numbers) {
if (numbers.length !== 6) {
throw new Error("[ERROR] 로또 번호는 6개여야 합니다.");
}
}
// TODO: 추가 기능 구현
}
💡 구현할 기능 목록 💡
📍 Model
- Lotto: 로또 번호 생성 및 검증
- 1~45 범위의 중복되지 않는 6개의 숫자를 생성한다.
- 생성된 숫자 배열을 검증하여 6개의 숫자가 포함되도록 한다.
- LottoStore: 로또 발행 및 구입 내역 저장
- 입력된 구입 금액에 맞춰 로또 발행 수량을 계산한다.
- 로또 번호 목록을 저장하고, 당첨 번호와 보너스 번호 정보를 저장한다.
- WinningNumbers: 당첨 번호 및 보너스 번호 관리
- 당첨 번호 및 보너스 번호를 저장하고, 중복 여부와 범위를 검증한다.
- ResultCalculator: 당첨 결과 계산 및 수익률 산출
- 로또 번호와 당첨 번호를 비교하여 등수를 계산한다.
- 당첨 통계와 수익률을 계산하여 반환한다.
📍 View
- InputView: 입력 처리
- 구입 금액, 당첨 번호, 보너스 번호 입력 받아서 Model에 전달한다.
- OutputView: 결과 출력
- 발행된 로또 번호를 오름차순으로 정렬하여 출력한다.
- 당첨 내역과 수익률을 지정된 형식에 맞게 출력한다.
📍 Controller
- LottoController: 프로그램 흐름 관리
- 구입 금액을 입력받아 로또 발행 개수를 계산하고, 로또 번호를 생성하여 Model에 저장한다.
- 입력받은 당첨 번호와 보너스 번호를 저장하고 검증한다.
- ResultCalculator를 사용하여 당첨 결과를 계산하고 수익률을 산출하여 View에 출력하도록 한다.
⚠️ 예외처리 목록 ⚠️
📍 구입 금액 입력
- 금액이 1,000원 단위가 아닌 경우
-
[ERROR] 구입 금액은 1,000원 단위여야 합니다.
-
- 입력 값이 숫자가 아닌 경우
-
[ERROR] 구입 금액은 숫자여야 합니다.
-
- 입력 값이 1,000원 미만인 경우
-
[ERROR] 구입 금액은 1,000원 이상이어야 합니다.
-
- 입력 값이 비어있는 경우
-
[ERROR] 입력 값이 비어있습니다
-
📍 당첨 번호 입력
- 당첨 번호가 6개가 아닌 경우
-
[ERROR] 당첨 번호는 6개여야 합니다.
-
- 각 번호가 1~45 범위 밖인 경우
-
[ERROR] 당첨 번호는 1부터 45 사이의 숫자여야 합니다.
-
- 당첨 번호에 중복된 숫자가 있는 경우
-
[ERROR] 당첨 번호에는 중복된 숫자가 없어야 합니다.
-
- 당첨 번호의 구분자가 잘못된 경우
-
[ERROR] 번호 구분자는 쉼표(,)만 유효합니다.
-
📍 보너스 번호 입력
- 보너스 번호가 1~45 범위 밖인 경우
-
[ERROR] 보너스 번호는 1부터 45 사이의 숫자여야 합니다.
-
- 보너스 번호가 당첨 번호와 중복될 경우
-
[ERROR] 보너스 번호는 당첨 번호와 중복되지 않아야 합니다.
-
📁 파일구조 📁
├── src/
│ ├── constants/
│ │ └── Constants.js
│ ├── controllers/
│ │ └── LottoController.js
│ ├── models/
│ │ ├── Lotto.js
│ │ ├── LottoStore.js
│ │ ├── WinningNumbers.js
│ │ └── ResultCalculator.js
│ ├── utils/
│ │ └── Validator.js
│ ├── views/
│ │ ├── InputView.js
│ │ └── OutputView.js
│ │── App.js
│ └── index.js
├── __tests__/
│ └── ApplicationTest.js
│ └── LottoStoreTest.js
│ └── LottoTest.js
│ └── ResultCalculatorTest.js
│ └── ValidatorTest.js
│ └── WinningNumbersTest.js
├── README.md
3주차 프리코스 회고
저번 2주차 프리코스 동안 다른 사람들의 코드를 보면서 많은 것을 배우고, 제가 미처 생각하지 못했던 점들을 새롭게 인식하게 되었다. 여러 지원자들이 문제를 해결하는 다양한 접근 방식을 보는 것은 매우 흥미로웠다. 같은 문제를 해결하는 데 있어 각자 다른 전략과 방법을 사용하는 모습이 재미있었고, 이를 통해 다양한 아이디어를 얻을 수 있었다. 코드 리뷰와 다른 지원자의 코드를 분석하는 과정은 단순한 피드백을 넘어, 서로의 사고 방식을 이해하고 더 나은 해결책을 고민하는 기회가 되었다.
📍 MVC 패턴 도입
이번 프리코스에서는 MVC 패턴을 도입해보았다. MVC 패턴에 대한 기본 개념을 공부한 후, 문제를 천천히 읽으며 시스템의 전체 구조를 먼저 구상하는 데 중점을 두었다. 처음 시도하는 접근 방식이라 약간의 어려움을 느끼기도 했지만, 직접 찾아보고 코드를 작성하면서 많은 것을 익힐 수 있었다. MVC 패턴을 활용함으로써 코드의 구조가 훨씬 더 명확해졌고, 각 클래스의 역할이 분리됨에 따라 유지보수와 확장성의 장점을 적용할 수 있었다.
📍 로또 미션
이번 로또 미션은 이전 미션들에 비해 기능이 좀 더 복잡했지만, 각 기능을 하나씩 몰입해서 구현해 나가다 보니 시간이 금방 지나갔다. 개발 과정에서 마주치는 다양한 문제들은 새로운 도전이 되었고, 이를 해결하는 과정에서 성취감을 느꼈다. 이번 미션에서는 2주차 피드백을 바탕으로 README 파일을 보다 상세하게 작성하려고 노력했다. 또한 값을 하드 코딩하지 않기 위해 새롭게 상수 파일을 만들어 사용하는 것도 처음 시도해보았고, 함수가 단일 책임 원칙을 따르도록 구성하여 코드를 더욱 깔끔하게 유지하고자 했다. 이러한 노력 덕분에 코드의 가독성이 향상되고 더 효율적인 코드에 가까워졌다고 생각한다.
📍 테스트 케이스
다른 지원자들의 테스트 케이스를 살펴보니 파일별로 테스트를 세분화하여 수행하는 경우가 종종 있었다. 저도 이번 미션에서는 단위 테스트를 위해 테스트를 더욱 상세히 분리해보았다. 이러한 과정을 통해 코드의 품질이 개선되었음을 느꼈고, 테스트 코드와 여러 테스트 케이스의 중요성을 다시 한번 깨닫게 되었다.
📍 다음 미션
다음 미션에서도 피드백을 통해 더 성장하고 싶다. 이번 미션의 코드 리뷰와 다른 지원자의 코드 분석을 통해 지금보다 더 나은 결과를 이끌어낼 수 있다고 느끼고 있다. 프리코스를 진행하면서 이 과정에 참여하여 몰입하는 것만으로도 얻어가는 것이 많다고 생각하며, 마지막 주차까지 최선을 다해 임할 것이다.
'우테코' 카테고리의 다른 글
우테코 프리코스 4주차 회고록 (7) | 2024.11.12 |
---|---|
우테코 프리코스 2주차 회고록 (3) | 2024.10.28 |
우테코 프리코스 1주차 회고록 (0) | 2024.10.22 |