https://jihyun-devstory.tistory.com/18
[우아한테크코스 6기 프리코스] 2주차 코드 리뷰 종합해보기!
PR 주소 [자동차 경주] 이지현 미션 제출합니다. by Jihyun3478 · Pull Request #999 · woowacourse-precourse/java-racingcar- 사용자로부터 자동차 이름을 입력받는 기능 예외 1-1) 이름의 길이가 1자 미만, 5자 초과
jihyun-devstory.tistory.com
✔️ 제시된 요구사항 목록
✔️ 게임 프로세스 요약 📝
1. 사용자로부터 구입 금액을 입력받는다.
- 구입한 로또의 개수는 (입력받은 구입 금액 / 1,000)이다.
- 예외 상황 1-1 : 입력받은 금액이 1,000원으로 나누어 떨어지지 않는 경우
2. 1과 45 사이의 숫자를 랜덤으로 6개씩 선택한다.
3. 사용자가 구입한 로또의 개수만큼 2 과정을 반복하여 출력한다.
- 로또 번호는 오름차순으로 정렬되어야 한다.
4. 사용자로부터 당첨 번호를 입력받는다.
- 예외 상황 4-1 : 입력받은 숫자가 6개가 아닌 경우
- 예외 상황 4-2 : 입력받은 숫자가 1과 45 사이의 숫자가 아닌 경우
- 예외 상황 4-3 : 중복된 숫자가 존재하는 경우
5. 사용자로부터 보너스 번호를 입력받는다.
- 예외 상황 5-1 : 입력받은 숫자가 1과 45 사이의 숫자가 아닌 경우
- 예외 상황 5-2 : 입력받은 숫자가 당첨 번호와 중복되는 경우
6. 랜덤 로또, 당첨 번호, 보너스 번호를 이용하여 당첨 통계를 계산한 후 출력한다.
- 랜덤 로또와 당첨 번호 중 3개 일치하면 5등이다.
- 상금 : 5,000원
- 랜덤 로또와 당첨 번호 중 4개가 일치하면 4등이다.
- 상금 : 50,000원
- 랜덤 로또와 당첨 번호 중 5개가 일치하면 3등이다.
- 상금 : 1,500,000원
- 랜덤 로또와 당첨 번호 충 5개가 일치하고, 보너스 번호도 일치하면 2등이다.
- 상금 : 30,000,000원
- 랜덤 로또와 당첨 번호 중 6개가 일치하면 1등이다.
- 상금 : 2,000,000,000원
7. 당첨 금액과 구입 금액을 이용하여 수익률을 계산한 후 출력한다.
- 수익률은 (당첨 금액 / 구입 금액) * 100이다.
- 수익률은 소수점 둘째 자리에서 반올림한다.
✔️ 기능 목록 🚀
1. 사용자로부터 로또 구입 금액을 입력받는 기능
- 🚫 예외 1-1 : 입력받은 금액이 1,000원으로 나누어 떨어지지 않는 경우
2. 발행한 로또 수량 및 번호를 출력하는 기능
- (1) 로또 수량 = (입력받은 로또 구입 금액/1000) 이다.
- (2) 로또 번호는 1과 45 사이의 중복되지 않은 숫자 6개를 랜덤으로 뽑는다.
- (3) 로또 번호는 오름차순으로 정렬해야 한다.
- (2)~(3) 과정을 로또 수량만큼 반복한다.
3. 사용자로부터 당첨 번호를 입력받는 기능
- 🚫 예외 3-1 : 입력받은 숫자가 6개가 아닌 경우
- 🚫 예외 3-2 : 입력받은 숫자가 1과 45 사이의 숫자가 아닌 경우
- 🚫 예외 3-3 : 중복된 숫자가 존재하는 경우
4. 보너스 번호를 입력받는 기능
- 🚫 예외 4-1 : 입력받은 숫자가 1과 45 사이의 숫자가 아닌 경우
- 🚫 예외 4-2 : 입력받은 숫자가 당첨 번호와 중복되는 경우
5. 당첨 내역을 출력하는 기능
- 6개 번호가 일치하면 1등이다.
- 5개 번호+보너스 번호가 일치하면 2등이다.
- 5개 번호가 일치하면 3등이다.
- 4개 번호가 일치하면 4등이다.
- 3개 번호가 일치하면 5등이다.
6. 수익률을 출력하는 기능
- 수익률은 (당첨 금액 / 구입 금액) * 100이다.
- 수익률은 소수점 둘째 자리에서 반올림한다.
✔️ 구현 🛠️
[로또] 이지현 미션 제출합니다. by Jihyun3478 · Pull Request #1275 · woowacourse-precourse/java-lotto-6
github.com
2주차를 진행하며 도메인 로직을 분리해보았던 경험 덕분에 3주차의 요구사항에 맞게 도메인을 분리하는 것은 크게 어렵지 않았다. 설계한 기능 목록에 맞게 1차적으로 클래스를 다음과 같이 설계하였다.
- domain
- Money
- Lottos
- Lotto
- BonusNumber
- Result
- view
- constant
- Constant
- OutputMessage
- ErrorMessage
- InputView
- OutputView
- constant
- controller
- GameManageController
1-4번의 기능을 구현하기 위해 Money, Lotto, Lottos, BonusNumber 클래스를 만들어 각 도메인 내부에서 검증 로직을 구현하였다. 2주차 때까지는 검증 로직을 관리하는 클래스를 따로 구현하였는데, 검증 로직은 비즈니스 로직이기에 도메인 또는 서비스 내부에서 구현해야한다는 것을 알게되었기 때문이다. 이후 5-6번 기능을 구현하기 위해 제시된 요구사항을 다시 읽어보는 과정에서 놓친 부분이 있다는 것을 깨달았다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고,"[ERROR]"로 시작하는 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다.
- Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.
이전 주차 과제와 달리 예외를 발생시키면 종료되는 것이 아닌 에러 메시지 출력 후 그 부분부터 다시 입력받아야했다. 이를 만족하기 위해 controller 내부에서 try-catch문을 이용해 예외를 감싸고, 예외가 발생하면 해당 함수를 다시 호출하는 방식으로 구현하였다.
이후 5-6번 기능을 구현하기 위해 고민하는 과정에서 기존에 설계했던 방식을 아래와 같이 변경하였다.
- domain
- Money
- Lottos
- Lotto
- BonusNumber
- WinningStatistics
- WinningResult
- view
- constant
- Constant
- OutputMessage
- ErrorMessage
- InputView
- OutputView
- constant
- controller
- GameManageController
WinningStatistics라는 enum 객체를 만들어 이를 활용해야겠다는 생각이 들었다. enum에 대한 내용은 다음 블로그를 참고하였다.
https://techblog.woowahan.com/2527/
Java Enum 활용기 | 우아한형제들 기술블로그
{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E
techblog.woowahan.com
5-6번 기능을 구현하기 위해서는
- 사용자가 구입한 로또들과 입력받은 당첨 번호를 비교해 같은 숫자가 있으면 카운팅한다.
- 보너스 번호가 사용자가 구입한 로또들 중 포함되어있는지 확인한다.
- 카운팅 개수가 3개면 5등 당첨 개수를 카운팅, 4개면 4등 당첨 개수를 카운팅, 5개면 3등 당첨 개수를 카운팅, 5개이고 보너스 점수가 포함되어있으면 2등 당첨 개수를 카운팅, 6개이면 1등 당첨 개수를 카운팅한다.
- (당첨 금액/구입 금액 * 100) 로직을 이용해 수익률을 계산한다.
위 사항을 만족하는 함수들을 WinningResult 클래스 안에 구현해야 했다. 하지만 이 과정은 생각보다 복잡했고 제출 기한에 맞춰 끝까지 구현하지 못했다. enum을 객체로 바라보고 이를 활용하는 과정이 생각보다 어려웠던 것 같다. 결론적으로 LottoTest는 통과되었지만 제일 중요한 ApplicationTest가 통과되지 못하였다.
✔️ 어려웠던 점 💡
3주차를 진행하는 동안 enum을 객체로 바라보고 이를 활용하는 부분이 가장 어려웠다. enum 객체에 대한 내용은 추후 아래 포스팅에서 더 자세히 다룰 예정이다.
1. enum
✔️ 3주차를 마치며
점점 주차가 지나면 지날수록 요구사항이 많아지고, 더 어려워진다는 것을 간과하고 있었던 것 같다. 이것은 명백한 나의 실수다. 요구사항을 더 꼼꼼히 읽어보고 구현에 집중해야 했다. 아쉬움이 많이 남았다. 하지만 끝날 때까지 끝난 것이 아니기에 포기하지 않고 끝까지 3주차 과제를 구현해보고 싶다.
매 주차때마다 드는 생각이지만 처음부터 끝까지 다른 외부 라이브러리 또는 프레임워크의 도움 없이, 기능을 구현하는 일은 쉽지 않은 것 같다. 3주차 과제를 수행하며 Money, Lotto, Lottos, BonusNumber 도메인을 구현하고 이를 controller와 view 단에 연결하며 자신감이 붙었던 나였지만, 주어진 제출 기한 안에 끝까지 구현하지 못해 실망하는 내가 되어버렸다. 이 경험을 발판 삼아 4주차 과제는 제출 기한에 맞춰 반드시 구현을 완성하고, 여기까지 달려온 것보다 더 쏟아부어야겠다는 생각이 들었다. 정말 아쉬움이 많이 남는 3주차이지만 새롭게 배우고, 다짐했던 부분들을 발판 삼아 끝까지 완수하고 싶다. 우아한테크코스 프리코스를 진행하며 작은 성공을 맛보고 성장하는 것을 느꼈기에 더욱 포기하지 않겠다는 다짐을 하게 된다. 얼른 3주차를 마무리하고 4주차를 준비해야겠다.
'우아한테크코스 > 6기 프리코스' 카테고리의 다른 글
[우아한테크코스 6기 프리코스] 프리코스를 마치며 (0) | 2023.11.18 |
---|---|
[우아한테크코스 6기 프리코스] 4주차 회고 (1) | 2023.11.15 |
[우아한테크코스 6기 프리코스] 2주차 코드 리뷰 종합해보기! (0) | 2023.11.06 |
[우아한테크코스 6기 프리코스] 2주차 회고 (0) | 2023.11.01 |
[우아한테크코스 6기 프리코스] 1주차 코드 리뷰 종합해보기! (2) | 2023.10.27 |