본문 바로가기
개발자 일기/일일회고 (TIL)

부트캠프 25일차 (비동기, Node.js)

by MS_developer 2022. 9. 26.

오늘의 생각

페어 과제가 나날이 어려워지고 있다. 

 

먼저 비동기를 이해하기 위해 타이머 API를 활용해 콜백 함수, Promise, async/await 구현 방법을 활용했었다. 실습을 통해서 함께 진행하는 페어 과정이었기 때문에 같이 코드를 적으면서 해 봤는데, 의외로 술술 진행되었다. 전체적으로 코드는 잘 작동이 되었지만...명확히 개념을 알고 있는 것 같지 않다는 생각이 들었다.

 

그냥 코드를 따라 쳐보고, 아~ 이런 게 있구나 신기하다. 하고 넘어갔던 것 같다. 

 

당연히 후폭풍이 오후에 몰려왔다. Node.js에서 fs(File System) 모듈을 활용해 비동기 함수를 구현해 보았다. 첫 문제부터 삐걱댔는데, 주어진 전달인자로 파일경로와 콜백 함수를 통해 파일을 읽어오고 이 후에 콜백 함수를 실행시켜야 했다.

 

너무나도 어려웠다.

 

 

기본적으로 배운 콜백 함수를 활용해 

 

 

주어진 매개변수 filePath와 callback 함수를 활용해 fs 모듈의 기본 중 하나인 파일 읽어오기를 구현하는 것이 첫 문제였다. 문제의 의도가 잘 이해되지 않았지만 그래도 "파일 경로(filePath)"와 "콜백 함수(callback)"를 활용해 fs.readFile 기능을 가져와 구현하면 되겠다는 생각이 들었다.

 

 

 

Node.js 공식문서(Doumentation)에서 제공한 가이드에 따라 fs.readFile 파일 경로를 매개변수에 대입하고 기존에 배웠던 콜백 함수를 활용해 아래와 같이 입력했다. 하지만 테스트 결과는 좋지 못했다.

 

 

에러를 봐도 잘 이해되지 않았다. 첫번째 인자와 두번째 인자에 전달이 되지 않았다는 사실은 알겠지만, 애당초 주어진 콜백함수가 (err, data)의 두 변수를 받지 않는건가? 라는 생각이 들었다.

 

내가 생각했던 콜백 함수

 

콜백 함수에 첫번째 인자와 두번째 인자에 에러 객체와 파일 내용이 전달되어야 된다는 부분을 곱씹어 보았다. 페어분들과 오랜 고민과 토론 끝에 해답을 알아낼 수 있었다. 

 

 

먼저 "에러를 전달할 상황"과 "데이터를 전달할 상황"을 나눈 후 두 조건에 따라 콜백 함수가 어떤 변수를 받을지 알아내었다. (참고한 웹사이트) 검색으로 알아낸 결과에 따라 에러를 전달할 상황에는 첫번째 인자에 에러, 두번째 인자에 null 값을 할당했다. 반대의 경우 첫번째 인자에 null값과 두번째 인자에 데이터값을 할당해서 콜백함수를 조건에 맞게 실행시켰다.

 

이후에 해당 테스트는 통과했다.

 

페어프로그래밍 당시에는 매우 억울했다.

 

"이걸 어떻게 알아?" 라는 말이 절로 나왔다.

 

첫번째 테스트 케이스 이후에도 여러 굴곡이 있었지만, 해당 테스트 케이스만큼 억울하지는 않았다. (다른 테스트 케이스들은 그래도 잘 해결했다.) 페어 프로그래밍이 끝나고 해당 테스트 케이스를 되돌아봤다. 검색을 통한 결과도 한결 같았다. "그냥 이렇게 쓴다."라는 답변들이 나를 반겼다.

 

이쯤되니 오히려 당황스러웠다. 코드스테이츠에서 내가 안 배운 걸 시켰나? Bare Minimum Requirements 단계에서? 생각키 어려운 부분이기 때문에 배웠던 과정들을 돌아봤다.

 

 

진짜 있었다. 내가 가볍게 훑고 지나간 내용이 사실은 전혀 가볍지 않은 부분이었다. Promise 개념에 어려움을 겪고 있었기 때문에 콜백함수를 잘 이해하지 못했다고 생각했음에도 복습을 소홀히 한 대가였다. 

 

 

내가 아는 것은 과연 잘 아는가? 그냥 알고 있다고 믿는 것 아닐까? 라는 생각이 들었다.

 

자바스크립트 개념과 관련된 포스팅을 할 때마다 느끼는 점이었지만, 내가 "알고 있다"고 생각하는 개념을 누군가에게 완벽히 설명할 수 없다면 그것은 "알지 못하는 것"과 같다는 말이 사무치게 와 닿았다. 모르면 오래 고민해도 답이 안 나온다는 사실도 새삼 다시 한 번 깨달았다.

 

코드스테이츠에서 배우는 개념들과 관련된 포스팅을 할 때면 더 찾아보고 스스로가 의문스러웠던 점들에 대해 질문하게 되었고, 스스로에게 매우 유용한 시간이 되고 있다.

 

하지만 현실적으로 코드스테이츠에서 배우는 개념들을 진도에 맞춰 블로그 글로 적기에는 어려움이 있다. 

 

앞으로는 조금씩이라도 그날 배운 개념을 복습하고 돌아봐야겠다는 생각이 들었다. 


오늘의 키워드

콜백함수, Promise 객체, async/wait 키워드, Timer API, Node.js, fs(File System)


오늘의 학습내용

  • 콜백함수에서의 에러 핸들링
  • Promise 객체의 에러 핸들링
  • Promise 객체를 활용한 데이터 바인딩과 체이닝(Chaining)
  • 데이터의 JSON화(JSON.parse)
  • Promise 내장 메서드를 활용한 데이터 바인딩 (Promise.all)
  • 배열 또는 객체를 접목한 async 키워드와 await 키워드의 활용

어려웠던 keyword / 활용한 질문

  • Promise 객체를 콜백함수 대신 활용하는 이유가 무엇인가요? 데이터 체이닝을 이용해 설명해주세요.
  • JSON.parse의 기능을 설명할 수 있나요?
  • Promise 객체에서 받아온 데이터 값은 어떤 형태로 반환되나요?
  • new Promise()를 통해 생성한 Promise 인스턴스에는 어떤 메서드가 존재하나요? 각각은 어떤 용도인가요?
  • await 키워드 다음에 등장하는 함수 실행은 어떤 타입을 리턴할 경우에만 의미가 있나요?

댓글