✔ 숫자 야구
미션 제출 방법
- 미션 요구사항을 파악해 기능을 구현한 후 GitHub을 통해 add, commit, push
- 미션을 모두 완료 후 Pull Request로 woowacourse에 제출
- 우아한테크코스 지원 플랫폼에 GitHub ID, Pull Request 주소, 과제 진행 소감을 프리코스 과제로 제출
진행 방식
1) 과제 진행 요구 사항 파악하기
1. 미션 저장소를 Fork & Clone해 시작하기
2. 기능을 구현하기 전에 구현할 기능 목록을 정리해 추가하기
2) 프로그래밍 요구 사항 파악하기
1. JDK 17 버전에서 실행
2. 프로그램 실행의 시작점은 Application의 main()
3. Java 코드 컨벤션 가이드를 준수하여 프로그래밍
4. build.gradle 파일은 변경할 수 없음
5. ApplicationTest의 모든 테스트가 성공해야 함
6. 파일, 패키지 이름을 수정하거나 이동하지 않음
7. Randoms의 pickNumberInRange() 및 Console의 readLine() API를 사용하여 구현
3) 기능 요구 사항 파악하기
[게임 설명]
1. 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임
2-1. 같은 수가 같은 자리에 있으면 스트라이크 힌트
2-2. 같은 수가 다른 자리에 있으면 볼 힌트
2-3. 같은 수가 전혀 없으면 낫싱 힌트
3. 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리
[기능 요구 사항 설명]
1. 상대방의 역할을 컴퓨터가 하게 됨
2. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택
3. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력
4. 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료
5. 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션 종료
[입출력 요구 사항 설명]
* 입력 *
서로 다른 3자리의 수
게임이 끝난 경우 재시작/종료를 구분하는 1과 2중 하나의 수
* 출력 예시 *
숫자 야구 게임을 시작합니다.
숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요 : 145
1볼
숫자를 입력해주세요 : 671
2볼
숫자를 입력해주세요 : 216
1스트라이크
숫자를 입력해주세요 : 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료
게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
1
숫자를 입력해주세요 : 123
1볼 ...
구현할 기능 목록 정리
1) 게임이 시작되면 '숫자 야구 게임을 시작합니다.' 출력
2) 상대방의 역할인 컴퓨터가 3개의 숫자를 랜덤으로 선택
1부터 9까지 서로 다른 수로 이루어진 3자리의 랜덤 수 생성
3) 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력
[Exception]
수가 아닐 경우
3자리의 숫자가 아닐 경우
1부터 9까지의 수가 아닐 경우
각 자릿수에 중복인 숫자 값이 있을 경우
→ 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션 종료
4) 게임 플레이어의 입력과 컴퓨터의 숫자 비교
같은 수가 같은 자리에 있으면 스트라이크
같은 수가 다른 자리에 있으면 볼
같은 수가 전혀 없으면 낫싱
5) 입력한 수에 대한 결과를 출력
x볼 y스트라이크
x != 0 && y != 0 일 때, x볼 y스트라이크
x != 0 && y == 0일 때, x볼
x == 0 && y != 0일때, y스트라이크
x == 0 && y == 0일 때, 낫싱
x == 0 && y == 3일 때, 3스트라이크
'3스트라이크'가 아닐 경우 결과 출력 후, 3번부터 다시 시작
'3스트라이크'일 경우 게임 '3스트라이크' 및 '3개의 숫자를 모두 맞히셨습니다! 게임 종료' 출력 후, 게임 종료
6) 게임이 끝난 후 재시작/종료 여부 입력
1일 경우, 2번부터 다시 시작
2일 경우, 게임 종료
[Exception]
수가 아닐 경우
1또는 2가 아닐 경우
→사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션 종료
기능 구현
1) MVC 패턴을 적용해서 설계해보자
Model : 애플리케이션의 정보, 데이터 (상수, 초기화값, 변수 등) 등의 가공을 책임지는 컴포넌트
View : 사용자 인터페이스 요소로 데이터를 기반으로 사용자들이 볼 수 있는 화면
Controller : 데이터와 사용자 인터페이스 요소를 잇는 다리 역할로, 이벤트들을 처리
[필요한 Model]
1. 예외 메시지/게임 룰/게임 출력 메시지 (constants)
2. 컴퓨터가 만들어낸 3자리 랜덤 수 객체 정보 (domain)
3. 사용자 입력 수 객체 정보 (domain)
4. 재시작/종료 여부 객체 정보 (domain)
5. 컴퓨터가 만들어내는 3자리 랜덤수 초기값 생성 (service, business)
6. 입력 변수 처리하고 예외처리 (service, business)
[필요한 View]
1. 사용자 입력 화면
2. 사용자 출력 화면
[필요한 Controller]
1. 게임 시작 컨트롤러 (데이터인 Model와 사용자 인터페이스인 View를 잇는 역할)
[그 외 utils]
1. 숫자 비교 및 출력을 위한 변수 가공
model
|- domain
|- Computer : 컴퓨터가 만들어낸 3자리 랜덤 수 객체 정보
|- Player : 사용자 입력 수 객체 정보
|- Restart : 재시작/종료 여부 객체 정보
|- service
|- Generator : 컴퓨터가 만들어내는 3자리 랜덤수 초기값 생성
|- Validator : 입력 변수 처리하고 예외처리
|- constants
|- Error : 예외 메시지 상수
|- Phrase : 출력 메시지 상수
|- Rule : 룰 상수
view
|- InputView : 사용자 입력 화면
|- OutputView : 사용자 출력 화면
controller
|- BaseballGame : 게임 시작 컨트롤러
utils
|- Comparator : 숫자 비교 및 출력을 위한 변수 가공
2) TDD를 적용해가면서 구현해보자
1. 테스트 코드 작성
2. 테스트 코드를 통과하기 위한 최소한의 코드 작성
3. 테스트 코드 통과를 유지하면서 리팩토링
+) 테스트 코드를 짜기 힘들 경우 코드 먼저 짜고서라도 테스트 코드 작성하기
3) 리팩토링
클린 코드에 맞춰 리팩토링을 하려고 노력했다.
1. 의미 있는 메소드명, 변수명, 클래스명을 사용하자
2. 중복을 최대한 제거하자
3. 한 메소드에서는 하나의 일만 하도록 하자
4. 상수 대신 열거형을 사용하자
5. 인터페이스 사용과 의존성 주입을 통해 결합도를 낮추자
6. final 사용을 통해 변수를 불변하도록 하자
7. 생성자 대신 정적 팩토리 메서드를 사용해보자
8. 접근 권한을 최소화하자
9. 가독성이 떨어지지 않는다면 스트림을 사용해보자
이 외에도 다양한 곳을 리팩토링하려고 했다.
회고
이전에는 MVC 패턴에 대해 이론적인 이해만 가지고 있었지만, 이번 프리코스를 통해 직접 적용해 보려고 노력했습니다.
특히, MVC 중 Model 부분에서 데이터의 domain 정의와 비즈니스 로직을 처리하기 위한 service를 분리하는 부분에서 디렉토리 구조를 어떻게 정리할지 고민을 많이 했습니다. 또한 MVC 패턴의 작동 원리에 따라 코드가 서로의 규칙을 위반하고 있지 않는지 지속해서 확인하면서 진행했습니다. 앞으로의 프리코스를 통해 더욱 학습하고 개선해 나갈 계획입니다.
MVC 패턴뿐만 아니 저의 학습 경험들을 토대로 작성한 블로그 글도 하나씩 다시 살펴보면서 리팩토링을 진행했습니다.
클린 코드 관련 글을 다시 읽으면서 변수명 등을 의미 있는 이름으로 수정하고, 스프링 프레임워크 관련 글을 다시 보며 인터페이스 작성과 의존성 주입을 통해 코드를 작성하고자 했습니다.
제 몰입을 담은 블로그 글이 제 개인 학습에 도움이 된 것처럼, 다른 개발자들에게도 도움이 되었으면 함을 느끼게 되었습니다. 이를 통해 다시 한번 지식과 경험 공유의 중요성도 깨닫게 되었습니다.
'Community > 우테코 프리코스' 카테고리의 다른 글
[우테코] 웹 백엔드 프리코스 4주차 미션 (0) | 2023.11.09 |
---|---|
[우테코] 웹 백엔드 프리코스 3주차 미션 (0) | 2023.11.02 |
[우테코] 웹 백엔드 프리코스 2주차 미션 (0) | 2023.10.26 |
[우테코] 2024 우아한테크코스 입학설명회 (0) | 2023.10.06 |