[회고] - 우테코 프리코스 1주차

hoheesu·2024년 10월 21일

회고

목록 보기
1/6
post-thumbnail

🚀 우테코 7기 지원
나는 겁이 많은 성격인가? -
그동안 나는 '우테코, 싸피는 내가 아직 넘볼 레벨이 아니다...' 라고 생각하며 혼자 겁먹고, 혼자 실패하며 지원조차 할 생각을 하지 않았었다.
하지만 이제는 준비가 된 것 같다는 느낌이 들었고, 밑져야 본전이다라는 생각으로 처음으로 우테코를 지원했다!
막상 시도하고 시작해보니, 그동안 왜 시도조차 안했을까라는 후회가 한가득...
앞으로는 더 도전적인 마인드로 삶을 살아봐야겠다

🎓 우테코 프리코스를 시작하며

우선 code conventionAirbnb 컨벤션을 따르라고 적혀있었다. 문서 전부를 읽어본 것은 아니지만 그래도 가장 유명한 컨벤션이고 그동안 나름 지키면서 코딩을 해보려고 노력했었기 때문에, 다행히 개발하는데에 크게 문제가 되지 않았다.


또한 커밋을 엄청 상세하게 달아둘까 생각을 했었는데, 개인 취향차이지만 나는 커밋을 아주아주 세세한 단위로 하는 것을 그닥 좋아하지 않는 편이라서, 그냥 편하게 기능단위로 달았다.
그 와중에 첫번째 커밋 혼자 Docs로 대문자 적어서 킹받음

☀️ 우테코 프리코스 - 1주차 [문자열 덧셈 계산기]

class App {
  async run() {}
}

export default App;

이미 지원은 했고, 첫주차 문제를 봤는데, 딱 class를 보고 바로 띠용? 이었다.. 다른건 모르겠는데 하필 가장 약한 class....?
일단 class는 뒤로 제쳐두고 test코드를 봤는데 ...

import App from "../src/App.js";
import { MissionUtils } from "@woowacourse/mission-utils";

const mockQuestions = (inputs) => {
  MissionUtils.Console.readLineAsync = jest.fn();

  MissionUtils.Console.readLineAsync.mockImplementation(() => {
    const input = inputs.shift();
    return Promise.resolve(input);
  });
};

const getLogSpy = () => {
  const logSpy = jest.spyOn(MissionUtils.Console, "print");
  logSpy.mockClear();
  return logSpy;
};


describe("문자열 계산기", () => {
  test("커스텀 구분자 사용", async () => {
    const inputs = ["//;\\n1"];
    mockQuestions(inputs);

    const logSpy = getLogSpy();
    const outputs = ["결과 : 1"];

    const app = new App();
    await app.run();

    outputs.forEach((output) => {
      expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(output));
    });
  });

  test("예외 테스트", async () => {
    const inputs = ["-1,2,3"];
    mockQuestions(inputs);

    const app = new App();

    await expect(app.run()).rejects.toThrow("[ERROR]");
  });
});

........네?
JEST...말로만 들어봤지.. 사실 그동안 JEST를 이용해서 테스트코드를 구성해본 적이 없었던 터라 처음부터 멘탈이 나갈뻔했다...😱
하지만 원래 막상 해보면 또 하게 될 것을 알기때문에 우선 JEST에 대해서 검색을 해보고 대충 조금만 이해한 상태로 시작했다.

우선 내가 가장 익숙한 방식으로 코드를 짜기 시작했고 그 결과... 나는 class를 쓰면서 기능은 function으로 빼서 사용하는 파렴치한 행위를 저질렀다... 쓰면서도 이럼 안될 것 같은데 싶었지만 우선 기능부터 완성하자... 라는 생각으로 코드를 작성했다.

기능에는 문제가 없었지만 class로 선언을 해서 실행을 하는데 기능을 외부 함수로 빼는 것은 정말 좋지 못한 것 같아서 결국 class 내부 메서드로 기능 함수를 선언하여 this.메서드로 호출해서 리팩토링을 했다.

하지만 진짜 문제는 여기가 아니었다...
나는 터미널 에서 잘 작동했으니 테스트 케이스도 통과할 줄 알았지만, 제공된 테스트케이스 두개가 다 실패가 떠버린것이다.
진짜 너무 속상했다. 분명히 npm start 로 직접 테스트 했을때는 원하는대로 잘 출력 되었는데 왜 두개의 테스트 케이스가 다 실패하는건지 처음에는 감도 안왔다... 하지만 JEST 테스트 코드를 다시 보니 우선 제출하는 부분은 "결과 : 1"로 출력하라고 되어있었는데 나는 그냥 냉큼 Number타입으로 1을 출력해주었다. 그렇게 첫번재 케이스는 고칠 수 있었다.

하지만 두번째 케이스는 분명히 [ERROR]을 잘 출력해주고 있는 것 같은데 왜 안되는지 이해를 할 수가 없었다. 하지만 에러코드를 확인해보니

✕ 예외 테스트 (1 ms)

  ● 문자열 계산기 › 예외 테스트

    expect(received).rejects.toThrow()

    Received promise resolved instead of rejected
    Resolved to value: undefined

      39 |     const app = new App();
      40 |
    > 41 |     await expect(app.run()).rejects.toThrow("[ERROR]");
         |           ^
      42 |   });
      43 | });
      44 |

      at expect (node_modules/expect/build/index.js:113:15)
      at expect (__tests__/ApplicationTest.js:41:11)
      at call (__tests__/ApplicationTest.js:2:1)
      at Generator.tryCatch (__tests__/ApplicationTest.js:2:1)
      at Generator._invoke [as next] (__tests__/ApplicationTest.js:2:1)
      at asyncGeneratorStep (__tests__/ApplicationTest.js:2:1)
      at asyncGeneratorStep (__tests__/ApplicationTest.js:2:1)
      at _next (__tests__/ApplicationTest.js:2:1)
      at Object.<anonymous> (__tests__/ApplicationTest.js:2:1)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total
Time:        0.276 s, estimated 1 s
Ran all test suites.

이렇게 에러코드가 생성되어있었다. 나는 예외처리가 필요한 부분은 throw로 던지고 catch 부분에서 Console.print('[Error]')로 출력을 하고 있었다. 분명 throw로 던졌고 try/catch 중 catch 에 잘 잡혔는데 왜 Promise.reject에 잡히지 않는다는걸까... 처음에는 이해가 안됐는데 throw new Error(ERROR_MESSAGE);catch에서 reject로 던져주니 그제서야 정상적으로 작동을 했다. (ERROR_MESSAGE는 '[Error]'를 상수에 담아둔 것이다.)

이렇게 우테코 프리코스 1주차 과제를 마무리 지었는데,,, 아직도 부족한 부분이 너무 많다고 느꼈다... 앞으로도 더 공부하고 발전해서 훌륭한 개발자가 될때까지 노력해야겠다.

profile
🤔👏💡👨🏻‍💻🤯😇

0개의 댓글