[우아한테크코스 7기 프리코스] 2주차 회고 🚀

Seaniiio·2024년 10월 30일
3

우아한테크코스

목록 보기
2/6
post-thumbnail

우테코 7기 프리코스 2주차 - 자동차 경주

📍 문제 요구 사항

초간단 자동차 경주 게임을 구현한다.

  • 주어진 횟수 동안 n대의 자동차전진 또는 멈출 수 있다.
  • 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
  • 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
  • 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
  • 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
  • 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
  • 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

입출력 요구 사항

입력

  • 경주할 자동차 이름(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
  • 시도할 횟수
5

출력

  • 차수별 실행 결과
pobi : --
woni : ----
jun : ---
  • 단독 우승자 안내 문구
최종 우승자 : pobi
  • 공동 우승자 안내 문구
최종 우승자 : pobi, jun

실행 결과 예시

경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 횟수는 몇 회인가요?
5

실행 결과
pobi : -
woni :
jun : -

pobi : --
woni : -
jun : --

pobi : ---
woni : --
jun : ---

pobi : ----
woni : ---
jun : ----

pobi : -----
woni : ----
jun : -----

최종 우승자 : pobi, jun

📍 설계 과정

  • 이번에도 MVC 패턴을 이용해서 과제를 진행했습니다!
  • "자동차 경주"는 Car의 묶음 단위로 진행되는 것이고, 이 Car의 묶음에 대한 연산(Max값 구하기, 라운드 별로 상태 출력하기 등)이 많다는 생각이 들어서, 일급 컬렉션인 Cars로 관리했습니다.
  • 지금 생각해보면, CarsRacingController에 게임에 대한 로직을 많이 수행하는 것 같습니다. 이를 service로 분리했으면 더 좋았겠다는 생각이 들어요(이 부분에 대해 리뷰에서도 많이 지적받았습니다📚)

📍 배운 점

이번 미션 페이지의 꼭대기에 이러한 학습 목표가 적혀있었습니다.

  • 여러 역할을 수행하는 큰 함수를 단일 역할을 수행하는 작은 함수로 분리한다.
  • 테스트 도구를 사용하는 방법을 배우고 프로그램이 제대로 작동하는지 테스트한다.

이것을 보고, 이번 미션에서 테스트가 중요하겠다는 생각이 들었습니다. 기능을 분리하는 것은 유지보수, 가독성, 재사용성 등에서 많은 효과가 있지만, 단위 테스트를 작성하는 데에도 효과적이라고 생각했습니다.

그래서 저는 이번 미션에서 단위 테스트를 꼼꼼히 작성하기 위해 노력했는데요, 그 과정에서 배운 점들을 적어보겠습니다.

장점 1. 유지보수가 쉽다.

코드에서 어느 부분에 실수가 있어서 제대로 동작하지 않는 경우

-> 작은 단위로 나누어서 각각을 테스트한다면, 오류가 나타나는 코드를 좁은 범위로 줄일 수 있을 것이고, 오류를 빠르게 잡아 수정할 수 있을 것입니다.

장점 2. 개발하는데에 편의성을 제공한다.

개발한 기능이 제대로 동작하는지 간편하게 확인할 수 있습니다.

이번 미션에서 "자동차의 전진 기능"을 확인하기 위해서는, 자동차의 이름을 입력하고, 시도 횟수를 입력하고, 그 와중에 랜덤 숫자가 4가 넘어 자동차가 전진해야 합니다. 그런데 단위 테스트를 작성하면, 작은 기능이 제대로 동작하는지는 쉽게 확인할 수 있습니다!

장점 3. 코드의 작은 오류 부분을 쉽게 확인할 수 있다.

제가 조금 덤벙거려서 놓칠뻔 한 부분을 쉽게 잡을 수 있었습니다!

    private static void validateCountFormat(String countInput) {
        try {
            Integer.parseInt(countInput);
        } catch (IllegalStateException e) {
            throw new CountFormatException();
        }
    }

제가 초반에 작성했던 시도 횟수를 정수로 변환 가능한지에 대한 검증을하는 코드인데요, 이상한 부분이 있지 않나요?

    @Test
    public void 시도_횟수_문자열_예외_테스트() {
        String countInput = "5번";

        assertThatThrownBy(() -> Validator.validateCount(countInput))
                .isInstanceOf(CountFormatException.class);
    }

위의 테스트가 자꾸 실패해서 코드를 다시 살펴보니...

catch를 NumberFormatException이 아닌, IllegalStateException로 잡고 있어서 제가 원하는 커스텀 예외를 던지지 않았다는 것을 확인할 수 있었습니다.. 직접 실행하면서 테스트 할 때, 시도 횟수에 String을 입력하면 에러가 뜨면서 종료되어서, 원하는 의도대로 동작하고 있는 줄로만 알았습니다.(이런 부분도 놓치지 말아야 합니다..)

이렇게 사소한(??) 코드의 오류도 쉽고 빠르게 찾을 수 있다는 장점을 알게 되었습니다!

🤔 TDD

저는 이번에 모든 구현을 마치고 테스트 코드를 작성하기 시작했는데요, 테스트 코드를 작성하는 과정에서 오류를 발견하거나 리팩터링할 부분을 찾는 경우가 많았습니다. 그래서 테스트 코드를 작성하는 동시에 리팩터링도 굉장히 많이 수행했어요.

그러다 보니, 테스트 코드를 먼저 작성하거나 병행했다면, 기능을 개발하기 편했겠다는 생각이 들었습니다. 커뮤니티에서 많은 분들이 TDD에 대한 대화를 나누셨던 것을 저는 그저 구경만 했었는데, 많은 사람들이 사용하는 데에는 이유가 있구나 싶었습니다.

다음 미션에서는 TDD까지는 못하더라도, 기능 구현과 그에 대한 단위 테스트를 작성하는 것을 병행해보려고 합니다!

📍 성찰

1주차 미션을 마치고 "이것이 자바다"라는 자바 기본서를 구매했었는데요, 이번에 필요한 부분을 집중적으로 배우는 데에 많이 유용했습니다 😊 특히 stream을 처음 배우고 적용해보는데, 코드가 깔끔해지고 가독성도 좋아지는 것을 느꼈었습니다!

그럼에도 아직 자바 기본기가 부족하다는 것을 많이 느꼈습니다. 이 책을 올해 안에 완독하는 것을 목표로 삼아보겠습니다!

📍 마무리

이번 미션에서도 코드 리뷰를 주고 받았는데요, 역시 코드 리뷰는 자신의 부족함을 깨닫는 데에 정말 좋은 방법인 것 같습니다. 저는 2주차 미션에서도 1주차 리뷰에서의 배움을 기반으로 많이 발전했다고 생각합니다. 다른 분들의 코드를 보고 좋다고 생각했던 커스텀 예외를 사용해보거나, 피드백을 얻고 상수화에 대해 고민해본 후 상수화에 대한 저만의 기준을 세우기도 했습니다.

이제 리뷰와 회고를 마무리했으니 3주차 미션도 시작해보려 합니다. 이번에는 5시간 안에 기능구현목록 작성부터 기능 구현, 테스트코드 작성까지 어떻게든 마쳐보는 것이 목표입니다! 끝도 없는 리팩터링 과정을 거치겠네요..☀️

2개의 댓글

comment-user-thumbnail
2024년 11월 1일

배운 점을 잘 정리해주셨네요!
설계도도 굉장히 예쁘게 만들어주셨는데 mermaid를 활용하면 코드로도 표현해볼 수 있을 것 같아요
책을 통해 지식을 습득하고자 하는 부분도 인상깊었습니다.
남은 프리코스도 화이팅해봐요! 🙌

1개의 답글

관련 채용 정보