우아한 테크 코스 회고/프리코스 후기

[우아한테크코스 5기 _ 프리코스 FE] 2주차미션 후기/ 숫자야구게임

Rulu_ 2023. 4. 21. 17:32

작성일 2023년 1월 29일

어떡하지 벌써부터 쓰기가 귀찮다..아 그래도 약간 차례대로 프리코스부터 후기가 있어야 이쁠 것 같다는 생각 하나로 하고 있긴한데..과제 제출하고 같이 쓴 소감문 그대로 복붙인데도 넘넘 귀찮다..하지만 본 코스는 시작도 안했는데 벌써부터 안하면 안된다! 화이팅이다..

🫧문제 및 코드 보기🫧

 

GitHub - hafnium1923/javascript-baseball: 숫자 야구 게임 미션을 진행하는 저장소

숫자 야구 게임 미션을 진행하는 저장소. Contribute to hafnium1923/javascript-baseball development by creating an account on GitHub.

github.com


 

2주차 미션은 숫자야구게임을 만들어보는 문제였다. 문제자체의 난이도는 높다고 할 수 없지만, 프리코스부터 코딩테스트까지 사용하는 mission-util에 대한 사용법을 익히는 것이 중요한 미션이었다. 개인적인 의견으로는 이 과제가 모든 미션중에 가장 중요했던 것 같다. util중에 readLine이라고 출력 후 입력 값 받아오는 것이 있는데, 처음보는 형식의 동작이었기 때문에 적응하는 것에 조금 시간이 걸렸었다. 만약, 최종 코딩테스트까지 노리고 있다면 미션 유틸들을 사용할 때 다른 문법을 추가해서 본인이 스스로 제어하기 보단 주어진 util 그 자체로 사용하는 것에 익숙해질 필요가 있다.


README

진행방식:

  • 같은 수 같은자리 : 스트라이크
  • 같은 수 다른자리 : 볼
  • 같은 수 전혀없음 : 낫싱
  • 재시작: 1 종료: 2

요구사항:

  • indent(인덴트, 들여쓰기) depth를 2까지만 허용한다.
  • 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
  • Random 값 추출은 MissionUtils 라이브러리의 Random.pickNumberInRange()를 활용한다.
  • 사용자의 값을 입력 받고 출력하기 위해서는 MissionUtils 라이브러리에서 제공하는 Console.readLine, Console.print를 활용한다.
  • 상수명은 SNAKE_CASE로 작성
    ex) const FIREFOX = 1;
    const IS_LEFT = true;

기능목록:

  • play() - 게임의 시작
  • makeRandomNum() - 랜덤 숫자 생성 함수
  • reGame() - 게임의 반복을 컨트롤 하는 함수
    /예외처리: 1,2 이외의 숫자가 입력될 경우
  • startGame() - 게임을 진행하는 함수
    /예외처리: 숫자를 입력하지 않을경우
    /입력한 길이가 3을 초과한 경우
  • checkNum() - 사용자가 입력한 숫자를 판별하는 함수
    반환 값: 1 세개 다 맞춤, 0 틀림
    /예외처리: 중복된 숫자를 입력했을 경우
    /숫자 0 입력
  • duplicateCheck() - 중복 숫자 체크 함수
    반환 값: 1 중복값 있음
  • print() - 라운드 결과를 프린트하는 함수

문제 풀이 후기

미션을 처음 봤을 때는 무척 쉬워 보였다.
play에서 시작해 입력 값을 읽으면서 조건에 맞을 때 까지 반복하도록 풀기 시작했다.
입력한 숫자를 판별하는 로직과 인덴트 요구사항에 맞추기 위해 최대한 기능 별 나눈 함수같은 큼직큼직한 기능들은 구현이 쉬웠다. 문제는 과제에서 사용하라고 제시한 모듈을 사용할 때였다.

js가 동기로 진행되기 때문에 readLine의 입력 값을 기다리지 않고 바로 다음으로 넘어가는 것이었다. 때문에 입력의 무한 반복과 입력도 받기 전에 함수가 끝나는 문제가 반복해서 발생했다. 해당 문제를 고치기 위해 모듈이 저장되어있는 src 파일에 들어가서 어떤 식으로 readLine이 작동하는지 파헤치기 위해 노력했고, close() 의 위치를 바꿔가며 동작 방식을 이해해갔다. 그동안 공부해왔던 java나 c언어는 비동기로 진행되어 입출력을 다루기 쉬웠는데 처음으로 동기를 다루게 되어 적응하는 것이 많이 어려웠다. 그래도 이번 과제를 진행하며 동기에 대해 감을 잡을 수 있게 되었다. 과제에서는 입력 값을 받아야만 다음으로 넘어갈 수 있게 readLine안에서 if로 조건을 걸어 진행을 제어하는 방식으로 해결했다.

또한 test 문서를 해석하는 것도 어려웠다. 내가 직접 입력하는 방식으로 console 확인할 때는 모든 요구사항이 작동하는데 test로 작동하니 오류가 뜨는 것이었다. 어떤 테스트에서 통과를 못했는지 큰 범위에서만 알려주어서 내 코드에서의 오류를 찾기 어려웠다. 그래서 test문서에 있는 mock와 jest.spyOn등 함수들을 찾아보며 어떻게 test를 진행하는지 이해하기 위해 노력했다.

하나씩 나눠가며 찾아보니 answer은 잘 들어가는데 random 값에서 테스트가 돌아가지 않는 것이다. 그래서 random 값 생성하는 부분을 다시 찾아보았는데 미션 요구 사항에서 사용하라고 한 pickNumberInRange함수가 아닌 pickUniqueNumbersInRange 함수를 사용한 것이 문제가 되었다. 원인을 찾으니 너무 허무했었다. 이 경험을 통해 코드를 작성하기 전에 요구사항을 꼼꼼하게 분석하고 제시한 조건을 충족하는 것이 얼마나 중요한 것인지 다시 한번 깨닫게 되었다.