[우테코 프리코스] 자동차경주 미션 회고
자동차경주 미션🏁
2주차 미션은 다음의 요구사항을 만족하는 자동차 게임을 구현하는 것이었다.
요구사항
- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.
과제 제출
2주차 미션 역시 기능에 맞게 클래스를 따로 분리하지는 않고 Application 내부에서 메서드를 나누어 프로그램을 작성한 뒤 제출했다.
이때 가장 고려대상이 되었던 건 기능을 최대한 분리하는 것과 테스트 코드를 작성하는 것이었다.
특히, 지난주차 과제에 비해 JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다.
는 요구사항이 추가되었기 때문에 ApplicationTest에 별도의 테스트들도 진행해주었다.
테스트 코드를 작성하는 것은 익숙하지 않아 우테코 측에서 프로젝트 내부에 작성해 준 테스트 코드 예제를 참고해 테스트를 진행했는데 이 과정에서 여러 시행착오가 있었다.
프로그램은 사용자로부터 경주에 참가할 자동차 목록에 대한 입력, 경주 횟수에 대한 입력으로 총 두번 입력을 받고 있다. 기존에 제공된 테스트 코드에서는 경주 횟수에 대해 예외 처리가 정상적으로 작동하는지 확인하려면 내부에 전달하는 인자가 “참가할 자동차 목록”, “경주 횟수” 와 같은 방식으로 전달되어야 했는데, 테스트 코드를 꼼꼼하게 살펴보지 않은 탓에 적절하지 않은 테스트를 하고 있었던 것이었다..!
2주차 소감문은 이때의 경험을 바탕으로 기능별로 테스트를 진행하는 과정에서 발생하는 시행착오에 대해 중점적으로 작성했다.
피드백
공통으로 받은 피드백 중에서 내 프로젝트에서 가장 와닿았던 피드백을 꼽아보면 다음과 같다.
- README 에서 기능 목록을 너무 상세히 구현하지 않는다. 이는 언제든 변경될 수 있다.
- 값을 하드코딩하지 않는다.
- 한 함수가 한가지 기능만 하도록 한다.
- 처음부터 큰 단위의 테스트를 만들지 않는다.
다시 구현해보기
과제 제출이 끝나고 천멋개 야호씨가 리뷰를 도와줬다.
주어진 요구사항을 이런 방식으로 구분해보는 방법을 알려줬는데 이게 정말 큰 도움이 되었다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
* 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. (책임 + 역할)
* 각 자동차에 이름을 부여할 수 있다. (책임 + 역할)
* 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. (책임 + 역할)
* 이름은 5자 이하만 가능하다. (규칙)
* 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. (규칙)
* 우승자는 한 명 이상일 수 있다. (규칙)
* 자동차 이름은 쉼표(,)를 기준으로 구분하며 (입력)
* 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. (입력)
* 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. (출력)
* 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. (출력)
* 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다. (구현)
요구사항을 토대로 다음과 같이 5가지로 구현해야 할 클래스를 분리해보았다.
기능 | 비고 | ||
---|---|---|---|
자동차 | 전진/정지, 이름과 이동 거리를 반환 | 자동차 이름은 5자 이내여야 한다. 4이상의 숫자를 입력받으면 전진하고 3 이하인 경우 정지한다. | |
경주 | 경주 생성(경주 참가자 생성), 특정 횟수만큼 모든 자동차 전진/정지 | ||
결과 | 라운드 결과 반환, 우승자 반환 | 우승자는 2명 이상일 수 있다. | |
입력 | 참가자 목록, 이동 횟수 | 참가자 목록은 중복될 수 없다. 참가자 목록은 쉼표로 구분된다. (2명 이상) | |
출력 | 라운드 결과, 우승자 | 우승자가 2명 이상인 경우 쉼표로 구분한다. |
결과물은 여기서 확인할 수 있고, 값을 하드코딩하는 부분이랑 예외처리 부분은 조금 더 손봐야할 듯 싶지만 야호가 도와줬던 feature/yaho 브랜치랑 비교해보니 거의 비슷한 것 같아 나름 만족스럽다.