728x90
서론
- Java의 학습을 위해, 미션 학습을 진행하고 있습니다. 첫번째 미션으로는 “숫자야구게임”을 진행해보려고 합니다.
- Step1을 종료하고, Step2로 넘어갈 예정입니다.
- Step1의 글을 작성하고 정리하면서 아쉬웠던 부분들을 Step2에서 같이 리팩토링을 진행해볼 예정입니다.
- 가장 중요한건 확장가능한 설계와 도메인 모델 정의, 테스트 코드 작성을 통한 안정적인 애플리케이션 구현을 가지고 해당 미션을 진행해보려고 합니다.
- 의도적으로 꼼꼼한 테스트 코드와 원시값 포장을 진행하였습니다. 해당 부분은 참고해주시면 좋을거 같습니다.
미션 요구사항
- 숫자야구게임이란?
- 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임입니다.
- 컴퓨터와 싸우는 게임으로 컴퓨터가 뽑은 랜덤의 숫자를 뽑을수 있도록 합니다.
- 이전 게임 결과를 볼수 있습니다.
- 이전 게임의 시작 시간 / 종료 시간 / 플레이어의 시도 횟수를 확인할 수 있습니다.
- 실제 게임의 출력과 동일하게 결과를 확인할 수 있습니다.
상세 스펙
- [명령어]
- ~~1을 입력하면 게임을 시작합니다.~~
- ~~2를 입력하면 이전 게임의 기록을 볼수 있습니다.~~
- 9를 입력하면 애플리케이션을 종료합니다.
게임을 시작하면 1~9 서로 다른 임의의 수 3개를 선택합니다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력해야 합니다.번호를 입력 한 뒤에 힌트에 대한 정의스트라이크: 이전에 뽑은 숫자에서 위치와 실제 숫자와 같은 경우볼: 이전에 뽑은 숫자에서 위치는 다르지만 숫자가 존재하는 경우낫싱: 이전에 뽑은 숫자에서 아예 존재하지 않은 경우
애플리케이션을 종료하는 값(9)를 입력하지 전까지 게임을 계속 진행할 수 있다.- [게임 기록 확인]
- 이전 게임의 시작시간과 종료시간 플레이어의 시도 횟수를 확인할 수 있습니다.
- 실제 게임의 출력과 동일하게 결과를 확인할 수 있습니다.
- 콘솔 실행 결과
게임을 새로 시작하려면 1, 기록을 보려면 2, 종료하려면 9을 입력하세요.
1
컴퓨터가 숫자를 뽑았습니다.
숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요: 145
1볼
숫자를 입력해주세요: 671
2볼
숫자를 입력해주세요: 216
1스트라이크
숫자를 입력해주세요: 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다.
-------게임 종료-------
게임을 새로 시작하려면 1, 기록을 보려면 2, 종료하려면 9을 입력하세요.
2
게임 기록
[1] / 시작시간: 2024. 04. 07 23:12 / 종료시간: 2024. 04. 07 23:13 / 횟수: 5
1
1번 게임 결과
숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요: 145
1볼
숫자를 입력해주세요: 671
2볼
숫자를 입력해주세요: 216
1스트라이크
숫자를 입력해주세요: 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다.
-------기록 종료-------
게임을 새로 시작하려면 1, 기록을 보려면 2, 종료하려면 9을 입력하세요.
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: 게임 종료 시간
- 게임의 모든 정보가 있는 도메인
정책 요구사항
- 각각의 Game의 정보가 있어야 합니다.
- 해당 게임에 참여한 컴퓨터
- 해당 게임에서 플레이어가 입력한 모든 숫자의 목록
- 시작 시간
- 종료 시간
- 시작 시간보다 이전이 될 수 없습니다.
- 총 플레이어의 시도 횟수
- 게임이 시작하고, 종료되었을때 시간을 저장해야 한다.
- 사용자가 한번도 시도하지 못햇다면, 게임을 종료할 수 없다.
- 사용자가 성공하지 못했다면 게임을 종료할 수 없다.
- 이전 Game의 기록이 애플리케이션이 종료될때까지 저장되어있어야 합니다.
- 시도 횟수는 1이상이여야 합니다.
기술적 부분
- Game 도메인을 구현한다.
- PlayerRecord를 구현한다.
- ComputerRepository를 제거하고 GameRepository로 Game의 정보를 인메모리 Collection에 저장할 수 있게 한다.
- Count에 대한 VO를 생성한다.
- 목적은 Count에 대한 Validate와 책임 위임
결론
- 의도적으로 맨처음 테크스펙을 작성하고 관련된 흐름으로 흘러가도록 노력해보려고 한다.
- 2편에서는 실제 도메인을 어떻게 설계하였는지 작성해보려고 합니다.
728x90
728x90
'Backend > Java' 카테고리의 다른 글
[숫자야구게임 Step2] 도메인 구현 (2) | 2024.04.24 |
---|---|
Five API Performance Optimization Tricks that Every Java Developer Must Know(모든 자바 개발자가 알아야 할 다섯 가지 API 성능 최적화 팁) (0) | 2024.04.20 |
[숫자야구게임 Step1] 실제 애플리케이션이 동작할 코드를 작성하자 & 마무리 (2) | 2024.04.20 |
[숫자야구게임 Step 1] 비지니스 로직을 작성하자. (0) | 2024.04.13 |
[번역] Memory-Hogging Enum.values() Method(메모리를 과도하게 사용하는 Enum.values() 메서드) (0) | 2024.04.12 |