🚀 기능 요구 사항
로또 게임은 아래와 같은 규칙으로 진행됩니다.
- 로또 번호의 숫자 범위는 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원이다.
- 당첨 번호와 보너스 번호를 입력받는다.
- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
- Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.
✏️ 구현할 기능 목록
- 로또 시작 기능을 구현합니다.
- 사용자로부터 로또 구입 금액을 입력받습니다.
- 금액의 단위는 1,000원입니다.
- 1,000원으로 나누어 떨어지지 않는 경우에는 예외 처리를 합니다.
- 구입 금액에 제한을 설정합니다.
- 총 당첨 금액의 자료형을 long으로 설정합니다. (최댓값 : 9,223,372,036,854,775,807)
- 구매한 모든 로또가 1등에 당첨되었다고 가정하면 구매할 수 있는 최대 로또 수는 4,611,686,018개입니다.
- 따라서, 구입 금액의 최대값은 4,611,686,018,000원입니다.
- 최소 1개의 로또를 구입하기 위해 구입 금액의 최소값은 1,000원으로 설정합니다.
- 구매한 로또 개수와 각 로또마다 중복되지 않는 6개의 숫자를 뽑아 출력합니다.
- 사용자로부터 당첨 번호와 보너스 번호를 입력받습니다.
- 각 번호는 쉼표(,)를 기준으로 구분됩니다.
- 위의 과정으로 구분된 당첨 번호는 총 6개이고, 보너스 번호는 1개입니다.
- 당첨 번호와 보너스 번호의 숫자 범위는 1 ~ 45까지입니다.
- 당첨 번호와 보너스 번호 중에는 중복된 숫자가 없어야 합니다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받습니다.
- 모든 입력이 완료되면 사용자의 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료합니다.
- 일치한 숫자 개수가 3개부터 6개인 로또의 각 개수를 출력합니다.
- 당첨된 로또의 상금을 모두 합해서 구입한 로또 금액 대비 수익률을 출력합니다.
🤔 고민한 점
1. 클래스와 객체 분리
클래스와 객체를 분리하는 과정에서 코드의 구조를 재구성하고 각 클래스의 역할을 명확히 정의하였습니다.
비슷한 기능을 하는 코드를 하나의 클래스로 묶으면서 코드의 응집성을 높이는 작업을 진행했습니다.
이 과정에서 클래스 간의 의존성도 최소화하고, 코드의 유지보수성과 가독성을 향상시키기 위해 노력했습니다.
2. 도메인 로직에 대한 단위 테스트 작성
저번 주차에도 테스트 코드를 작성하였는데 그 때는 너무 큰 단위의 테스트 코드를 작성하였습니다.
이번에는 작은 단위의 테스트 코드를 작성하여 각 기능이 예상대로 작동하는지 검증하였습니다.
각 클래스와 메서드의 기능을 분석하고, 예상된 입력에 대한 기대되는 출력을 정의했습니다.
JUnit5와 AssertJ를 사용하여 테스트 케이스를 작성하였고 다양한 시나리오와 예외 상황을 고려한 테스트 케이스를 작성하여 코드의 안정성과 신뢰성을 높이도록 노력했습니다.
💡 느낀 점
- 이번 주차를 통해 코드의 품질을 높이고 유지보수를 용이하게 하려면 코드를 작은 단위로 나누고 각 단위에 대한 테스트 코드를 작성하는 것이 중요하다는 것을 깨달았습니다.
- 이처럼 작은 단위의 코드와 단위 테스트 코드를 작성하는 습관을 키우고, 코드 품질을 향상시키는 방법을 끊임없이 학습해야겠다고 다짐했습니다.
'기타 > 우테코' 카테고리의 다른 글
[우테코] 프리코스 4주차 미션 - 크리스마스 프로모션 (0) | 2023.11.16 |
---|---|
[Kotlin] JUnit의 Assert 함수 사용하기 (0) | 2023.11.09 |
[Kotlin] JUnit으로 테스트 코드 작성하기 (0) | 2023.11.07 |
[우테코] 프리코스 2주차 미션 - 자동차 경주 (0) | 2023.11.03 |
[우테코] 프리코스 1주차 미션 - 숫자 야구 (0) | 2023.10.27 |