728x90
서론
- Java의 학습을 위해, 미션 학습을 진행하고 있습니다. 첫번째 미션으로는 “숫자야구게임”을 진행해보려고 합니다.
- Step1을 종료하고, Step2로 넘어갈 예정입니다.
- Step1의 글을 작성하고 정리하면서 아쉬웠던 부분들을 Step2에서 같이 리팩토링을 진행해볼 예정입니다.
- 가장 중요한건 확장가능한 설계와 도메인 모델 정의, 테스트 코드 작성을 통한 안정적인 애플리케이션 구현을 가지고 해당 미션을 진행해보려고 합니다.
- 의도적으로 꼼꼼한 테스트 코드와 원시값 포장을 진행하였습니다. 해당 부분은 참고해주시면 좋을거 같습니다.
미션 요구사항
- 숫자야구게임이란?
- 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임입니다.
- 컴퓨터와 싸우는 게임으로 컴퓨터가 뽑은 랜덤의 숫자를 뽑을수 있도록 합니다.
- 이전 게임 결과를 볼수 있습니다.
- 이전 게임의 시작 시간 / 종료 시간 / 플레이어의 시도 횟수를 확인할 수 있습니다.
- 실제 게임의 출력과 동일하게 결과를 확인할 수 있습니다.
상세 스펙
- [명령어]
- ~~1을 입력하면 게임을 시작합니다.~~
- ~~2를 입력하면 이전 게임의 기록을 볼수 있습니다.~~
- 9를 입력하면 애플리케이션을 종료합니다.
게임을 시작하면 1~9 서로 다른 임의의 수 3개를 선택합니다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력해야 합니다.번호를 입력 한 뒤에 힌트에 대한 정의스트라이크: 이전에 뽑은 숫자에서 위치와 실제 숫자와 같은 경우볼: 이전에 뽑은 숫자에서 위치는 다르지만 숫자가 존재하는 경우낫싱: 이전에 뽑은 숫자에서 아예 존재하지 않은 경우
애플리케이션을 종료하는 값(9)를 입력하지 전까지 게임을 계속 진행할 수 있다.[게임 기록 확인]이전 게임의 시작시간과 종료시간 플레이어의 시도 횟수를 확인할 수 있습니다.실제 게임의 출력과 동일하게 결과를 확인할 수 있습니다.
- [통계기능]
- 3을 입력하면 통계를 알수 있습니다.
- 가장 적은 횟수를 알 수 있습니다. (기록 ID가 같이 나옵니다.)
- 가장 많은 횟수를 알 수 있습니다. (기록 ID가 같이 나옵니다.)
- 평균 횟수를 알 수 있습니다.
- 콘솔 실행 결과
게임을 새로 시작하려면 1, 기록을 보려면 2, 통계를 보려면 3, 종료하려면 9을 입력하세요.
1
컴퓨터가 숫자를 뽑았습니다.
숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요: 145
1볼
숫자를 입력해주세요: 671
2볼
숫자를 입력해주세요: 216
1스트라이크
숫자를 입력해주세요: 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다.
-------게임 종료-------
게임을 새로 시작하려면 1, 기록을 보려면 2, 통계를 보려면 3, 종료하려면 9을 입력하세요.
2
- [1] / 시작시간: 2024. 04. 07 23:12 / 종료시간: 2024. 04. 07 23:13 / 횟수: 5
-------기록 종료-------
게임을 새로 시작하려면 1, 기록을 보려면 2, 통계를 보려면 3, 종료하려면 9을 입력하세요.
3
가장 적은 횟수: 5회 - [1]
가장 많은 횟수: 5회 - [1]
평균횟수: 5회
-------통계 종료-------
게임을 새로 시작하려면 1, 기록을 보려면 2, 통계를 보려면 3, 종료하려면 9을 입력하세요.
애플리케이션이 종료되었습니다.
테크스펙
기술 스택
- Java17 / Junit 5.9.1 / assertJ 3.25.3
모델링
- Enum Command
- value: int
- Commend를 실행할 수 있는 숫자를 정의내린다.
- value: int
- VO Number
- value: 숫자 값
- 숫자 야구게임에서 사용하는 1~9의 숫자를 정의내리는 Value Object입니다.
- 일급컬렉션(VO) BaseBallNumbers
- value: 숫자야구게임의 3개의 숫자 목록
- 실제 중복되지 않는 1~9의 3개의 상태를 가지고 있는 Value Object이자 일급컬렉션입니다.
- Domain Computer
- numbers: 컴퓨터가 뽑은 숫자의 수
- 임의의 숫자 1~9까지 중에 3개를 뽑은 List를 상태로 가지고 있습니다.
- PlayerRecord
- numbers: Player가 입력한 숫자
- strikeCount: 해당 숫자의 스트라이크 갯수
- ballCount: 해당 숫자의 볼 갯수
- notting: 낫싱 여부
- success: 성공 여부
- 플레이어의 한 게임의 한 시도의 결과 도메인
- Count(VO)
- value: strike, ball 갯수의 VO
- Game
- id: PK
- computer: 게임에 참여한 컴퓨터
- playerNumbers: 게임을 시도한 플레이어의 모든 숫자 목록
- startAt: 게임 시작 시간
- endAt: 게임 종료 시간
- 게임의 모든 정보가 있는 도메인
정책 요구사항
- Step2에서 저장된 기록을 계산할 수 있는 로직을 작성합니다.
- 횟수를 기반으로 게임을 조회할수 있습니다.
- 평균 횟수를 조회할 수 있도록 합니다.
- 최대, 최소 횟수를 조회할수 있습니다.
기술적 부분
- stream 메서드들을 활용하여 처리합니다.
- max(), min(), average()를 활용합니다.
- filter()를 활용합니다.
결론
- 의도적으로 맨처음 테크스펙을 작성하고 관련된 흐름으로 흘러가도록 노력해보려고 한다.
- 이번 Step에서는 도메인 구현이 없기 때문에 Repository 구현을 보겠습니다.
728x90
728x90
'Backend > Java' 카테고리의 다른 글
[숫자야구게임 Step3] Repository 구현 (0) | 2024.09.20 |
---|---|
[숫자야구게임 Step2] 실제 애플리케이션이 동작할 코드를 작성하자 (0) | 2024.04.26 |
[숫자야구게임 Step2] 비지니스 로직을 작성하자. (0) | 2024.04.24 |
[숫자야구게임 Step2] 도메인 구현 (2) | 2024.04.24 |
Five API Performance Optimization Tricks that Every Java Developer Must Know(모든 자바 개발자가 알아야 할 다섯 가지 API 성능 최적화 팁) (0) | 2024.04.20 |