우아한 테크코스 2주차를 진행했다.
2주차는 이전주보다 설계의 비중이 높아진게 느껴졌다.
숫자야구 게임을 구현하는 문제였다.
입출력
2주차에는 입출력이 가장 난관이었다.
입출력에 사용하는 라이브러리인 MissionUtils의 Console은 nodeJs의 readline을 사용하여 구현되었는데, 이게 비동기로 작동한다.
내가 하고 싶었던 것은 입력 받은 값을 선언해서 이후 코드에서 사용할 수 있게 하는 것이었다.
const input = MissionUtils.Console.readLine(질문내용,어쩌구저쩌구....);
play(input);
이런식으로 이후 입력값을 계속해서 사용할 수 있게 하고 싶었다.
MissionUtils.Console.readLine("question", (input)=>{
...
});
readLine은 이런식으로 사용되는데, 처음 이걸 봤을 때는 비동기처럼 작동하니까, 프로미스를 이용해서 동기처리 해주자고 생각했다. 그래서 비동기에 대해 제대로 공부할 수 있었다.
콜백을 어떻게 promise를 통해 처리해주지?라고 고민했는데 이렇게 처리해 줄 수 있었다.
function input(){
return new Promise((resolve)=>{
MissionUtils.Console.readLine("질문", (inputQuery)=>{
resolve(inputQuery);
})
});
이렇게 하면 받은 inputQuery의 값을 변수형태로 처리가 가능했고, 이후 다른 함수의 인자로 넘겨서 처리할 수 있었다.
UnhandledPromiseRejection, DeprecatedWarning
문제는 입력받는 함수가 계속해서 호출된다는 점이다.
이런식으로 코드를 작성했었는데, 중간에 validationChecker가 Error를 throw하도록 작성했다.
이렇게 하고 태스트를 진행하니, 기존 Error에 UnhandledPromiseRejection, DeprecatedWarning이 추가로 기재되어 오류 처리가 제대로 이뤄지지 않았다. try catch문을 이용해서 처리하려 해도 throw를 하는 이상 이 오류를 해결할 수는 없었다.
그래서 Promise를 사용하는 방식을 포기하고, 게임을 진행하ㅈ는 함수와 입력을 받는 함수를 분리하여 입력함수에서 콜백을 이용해서 처리했다.
해당 이슈는 이후 프리코스 토론에서도 확인할 수 있었다. 대부분 나와 비슷하게 해결한 것 같다.
https://github.com/woowacourse-precourse/community/discussions/486
https://github.com/woowacourse-precourse/community/discussions/453
try catch
이번 미션에서는 throw를 이용해서 예외를 만들라는 것이 명시되어 있어서 throw Error를 사용해 볼 수 있었다.
덕분에 자연스럽게 try와 catch에도 접근해 볼 수 있었는데, 입력마다 validation함수를 따로 만들어서, 해당 입력에 관련된 입력값 검증을 모두 수행한 뒤에, Error를 잡아서 다시 던지는 식으로 구현했다.
사실 지금 보니 굳이 다시 잡아서 던질 필요는 없는 것 같다.
그래도 input에 대한 validation을 한번에 수행할 수 있어서 보다 통일성 있고, 추가가 쉬운 코드를 작성 할 수 있었다.
객체지향에 대한 고민
이번 2주차도 역시 객체지향을 도입할까 말까 많이 고민했다.
그러나 관리해야하는 객체가 여전히 적고, 공통으로 묶기에는 조금 난해한 부분이 있어서 객체지향 없이 validation을 제외한 코드를 Game에다가 전부 구현했다.
지금 와서 보니 그래도 하나의 책임에 하나의 객체를 할당하는게 맞았나 싶기도 하고...
아쉬움이 많이 느껴진다.