[우아한 프리코스] 2주차 미션 회고 - 숫자 야구 게임
업데이트:
2주차도 무사히 끝이났다 😎
이번 주차 미션은 “숫자 야구 게임”이었다.
이번 기수에서는 HTML 코드가 없고 Console을 이용한 입출력만으로 프로그래밍을 요구하는 점이 작년과 비교하여 달라진 방식이었다.
그리고 … 추가된 요구 사항에 엄청난 친구가 있었다 ..
Jest랑 친해지기 🧪
Jest를 이용하여 테스트 코드를 작성하라는 요구 사항이 추가되어 테스트 코드 공부에 정말 많은 시간을 투자했다.
처음에는 기존에 우테코에서 제공하는 테스트 코드들을 이해하기도 어려워 이틀을 꼬박 jest 공식문서를 보고 공부했던 것 같다.
과제를 받은지 3일차쯤 되는 날 jest 문법을 어느정도 익히면서 자연스럽게 TDD 개발론도 알게되었다.
TDD 시도 그리고 .. 💦
초심자의 무모함일까. 얼마나 어려울지도 모른채 대차게 TDD 개발을 시도해보았다.
사용자의 입력값을 받는 부분은 예외 처리할 것이 많아서 test를 먼저 작성하고 그 test를 성공시키는 방식으로 나름 TDD 개발론을 잘 이행하고 있다고 생각했다.
그런데 점점 기능이 늘어갈수록 구현을 먼저 하고 테스트를 작성하고 있는 나를 발견했다 🥶
아무래도 미션에 시간제한이 있기에 함수 분리와 클린코드에 더 집중해야겠다고 생각하여 도중에 TDD 방식은 포기를 했다.
포기할 당시에는 테스트 코드 작성 실력이 부족해서 TDD로 구현하지 못한거 같아 아쉬움이 많았는데 이제 보니 시도만으로 충분했었다…
( 포비님이 TDD는 Trash…라고 하셔서 충격 그 잡채 😅 지난주에 난 뭘한거지 ?! Haha )
테스트 코드의 중요성
그래도 구현 초반에 TDD 방식으로 구현을 하던 중 이점을 본 사례가 있었다.
사용자 입력에 대한 예외 처리 부분을 구현할 때, 아래 순서대로 코드를 작성하고 있었다.
-
입력받은 3개의 숫자 중 중복된 숫자가 있는지 검사하는 테스트 코드 작성 (실패해야함)
✅ 위 테스트 코드를 성공시키는 코드 작성 → 테스트 코드 성공
-
입력받은 숫자가 3자리가 맞는지 검사하는 테스트 코드 작성 (실패해야함)
🆘 아직 코드 작성을 안했기 때문에 실패해야하는데 성공하는 문제가 발생
아래 코드를 통해 보면 왜 2번째 테스트 케이스가 성공했는지 알 수 있다.
// userInputCheck.test.js
test("중복된 숫자가 있으면 예외 발생", () => {
const answers = ["112"];
mockQuestions(answers);
expect(() => {
app.play();
}).toThrow();
});
// userInputCheck.js
// 유저 입력값 배열을 Set 객체로 중복제거한 배열의 길이가 3이 아니면 에러를 발생
if (new Set(userInput.split("")).length !== 3)
throw new Error(GAME_ERROR_MESSAGE.DUPLICATE);
// userInputCheck.test.js
test("입력된 수가 3자리가 아닌 경우 예외 발생", () => {
const answers = ["1", "12", "1234"];
expect(() => {
checkUserInput(answers);
}).toThrow();
});
// userInputCheck.js
if (this.number.length !== 3)
throw new Error(GAME_ERROR_MESSAGE.THREE_DIGIT);
예외 값 (1, 12, 1234) 는 중복된 값이 아니라 3자리수가 아닌 값인데 중복된 숫자를 검사하는 예외 코드 new Set(userInput.split("")).length !== 3
여기에서 걸려버렸던 것이다.
테스트 코드 작성으로 3자리수인지 체크하는 if 문을 중복을 체크하는 if 문 위에 꼭 작성했어야 한다는 것을 알게되었다.
설계단계에서는 미처 예상하지 못했던 부분을 테스트 코드를 통해 잡아낸 경험을 한 것만으로 신기했다.
또한 TDD를 활용하면 자신있는 코드를 만들 수 있다는 말이 조금은 와닿기도 하였다.
아마 테스트 코드 없이 기능만 구현했어도 이정도의 흠은 잡아냈을 것 같지만!
나중에 큰 애플리케이션을 제작한다면 테스트 코드가 정말 중요하겠구나를 느꼈다.
3주차엔 이렇게 해보자
지난주에 시간을 많이 뺏었던 TDD는 안해도 된다고 하셨으니 다시 기능 구현 목록, 커밋, 클래스 분리, 클린코드에 집중해보려고 한다.
그리고 이번 주차에서 테스트 코드에 대한 감이 잘 안와서 미션 제출 후 다른 분들의 테스트 코드를 보았는데 하나의 함수에서도 정말 다양하고 많은 양의 테스트 코드를 작성한 분들이 계셨다.
나는 하나의 함수에 대해 하나의 테스트만 했던 것 같아 너무 부끄러웠다.
함수의 기댓값에 대한 테스트만 하지 말고 코너 케이스 체킹, 역체킹 등 다양한 시각에서 내 코드를 검사할 수 있는 테스트 코드를 작성해야겠다.
사실 회고록에 쓸말이 많이 남았지만.. 일단 이쯤에서 회고를 마무리 하고 3주차 미션을 하러가보려 한다🏃🏻♀️
댓글남기기