Backend/Java

[숫자야구게임 Step2] 정책을 정의내리고 테크스펙을 작성해보자.

Seyun(Marco) 2024. 4. 20. 12:00
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를 실행할 수 있는 숫자를 정의내린다.
  • 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