TIL 25일차 -[JS/Node] 비동기와 Node.js

Yoon Kyung Park·2023년 5월 15일
0

TIL

목록 보기
25/75
  • 어떤 경우에 중첩된 콜백(callback)이 발생하는지 이해할 수 있다.

    o
    하나의 작업을 처리하고 나서 다음 작업을 처리하는 동기 처리 보다
    동시에 작업을 처리하되 먼저 완료된 작업 순으로 처리하는 비동기 처리는
    그 순서를 예측할 수 없기 때문에
    이를 제어하여 예측 가능한 비동기 처리를 하기 위해 중첩된 콜백을 사용한다.

  • 중첩된 콜백(callback)의 단점, Promise의 장점을 이해할 수 있다.

    o
    callback이 길어질수록, 복잡하고 가독성이 떨어지는 callback hell 현상과 callback의 미흡한 에러 처리 기능을 보완하고자 Promise가 등장했고, 이는 ES6에 추가되었다.

    Promise 또한 비동기 처리를 제어하기 위해 사용된다.

  • async/await 키워드에 대해 이해하고, 작동 원리를 이해할 수 있다.

    o
    비동기 처리를 동기적으로 처리하기 위해 사용한다.
    복잡한 Promise 코드를 간결하게 작성하고자 등장했고, 이는 ES8에 추가되었다.

    함수 앞에 async 키워드를 사용하고, async 함수 내에 await 키워드를 사용하여, 이 키워드를 포함한 코드의 비동기 처리가 완료될 때까지 대기한다.

  • callback과 promise, async/await 구현 방법을 이해한다.

    o
    모두 비동기 처리를 제어하기 위해 사용된다.

  • Promise 실행 함수가 가지고 있는 두 개의 매개변수 resolve와 reject
    를 활용할 수 있다.

    o
    Promise는 class 이므로, new 키워드를 사용하여 Promise 객체를 생성해야 한다. 이때, promise 객체가 생성되면,executor 생성자 함수가 자동으로 실행되고, 작성한 코드들이 실행된다.
    이때, 생성자 함수에는 비동기 처리를 실행할 콜백 함수로
    resolve와 reject 두 개의 함수를 전달인자로 받는다.

    작성한 코드가 정상적으로 작동하면, resolve(value) 함수를 호출하고,
    작성한 코드에 에러가 발생하면, reject(error) 함수를 호출한다.

  • new Promise()를 통해 생성한 Promise 인스턴스가 사용할 수 있는 메서
    드의 용도를 이해한다.

    o
    Promise 객체의 메소드에는 .then/.catch/.finally가 있다.
    new Promise가 반환하는 Promise 객체는 state, result를 내부 프로퍼티로 갖는데 이는 직접 접근이 불가하고, 위 3가지 메소드를 통해 접근 가능하다.

    .then 메소드는 new 키워드로 만들어진 Promise 인스턴드에 생성된 함수(executor)의 코드들이 정상 작동할 경우 호출한 resolve 함수에 접근하기 위해 사용된다.

    .catch 메소드는 new 키워드로 만들어진 Promise 인스턴드에 생성된 함수(executor)의 코드들에 에러가 발생할 경우 호출한 reject 함수에 접근하기 위해 사용된다.

    .finally 메소드는 executor 함수에서 작동하는 코드들의 정상 처리 여부와 관계없이 .finally 메소드를 이용하여 접근할 수 있다.

  • Promise의 세 가지 상태는 각각 무엇인지 설명할 수 있다.

    o
    Promise 객체의 내부 프로퍼티는 [[prototype]]과 [[promiseState]],[[promiseResult]]가 있다. Promise의 원형 객체는 promise이고,
    Promise의 상태는 기본적으로는 대기(pending)상태이다.
    만약, 비동기 작업을 수행할 콜백 함수(executor)가 성공적으로 작동되면,
    Promise의 state는 fulfilled(이행)으로 변경되고,
    에러가 발생하면, Promise의 state는 rejected(거부)로 변경된다.

    Promise의 값은 기본적으로는 undefined다.
    만약, 비동기 작업을 수행할 콜백 함수(executor)가 성공적으로 작동하여,
    resolve(value) 함수가 호출되면, value로 변경되고,
    에러가 발생하여 reject(error) 함수가 호출되면, error로 변경된다.

  • async/await 키워드와 함께 실행되는 함수는 어떤 타입이어야 하는지 이해
    한다.

    o
    async 키워드와 함께 정의된 함수는 await된 Promise가 fulfilled 이거나 rejected가 될 때까지 async 함수의 실행을 일시 정지하고, Promise가 fulfilled가 되면, async 함수를 일시 정지한 부분부터 실행한다.
    항상 Promise를 반환하므로 Promise를 반환하는 비동기 함수여야한다.

    따라서 async 키워드와 함께 실행되는 함수는 Promise를 반환하는 비동기 함수다.

  • await 키워드를 사용할 경우 어떤 값이 리턴되는지 설명할 수 있다.

    o
    async 키워드와 함께 정의된 함수는 항상 Promise를 반환한다.
    함수 내부에서 return 문을 사용하여 값을 반환하면, 해당 값은 암묵적으로 Promise.resolve로 감싸져서 반환되므로 Promise에서 fulfilled된 값을 리턴한다.

  • Node.js 내장 모듈을 사용할 수 있다.

    o
    여러 가지가 있지만,
    오늘 사용한 모듈은 파일을 읽거나 저장하는 기능을 구현할 수 있도록 돕는 파일 시스템 모듈이었다.

  • 서드 파티 모듈 (3rd-party module)을 활용할 수 있다.

    o
    내장된 모듈이 아닌 모든 외부 모듈을 의미하며,
    Node.js에서는 대표적인 서드 파티 모듈로 underscore이 있다.
    이러한 서드 파티 모듈은 내장되어 있지 않으므로,
    서드 파티 모듈을 다운로드하기 위해서는 npm을 사용해야 한다.
    ex) npm install underscore

  • Node.js 공식 문서를 활용하여 fs.readFile을 이용할 수 있다.

    o
    파일 내용을 읽기 위한 fs.readFile 메소드는
    전달인자로 (path[, options], callback) 이 3가지를 전달 받는다.

    첫 번째 인자인 path에는 파일 경로 즉, 파일 이름을 받는데,
    path로 <string> ,<Buffer>, <URL>, <integer>을 받을 수 있다. 그러나 주로 문자열로 받는다.

    두 번째 인자인 options는 인코딩 방식을 받는데
    넣을 수도 있고, 넣지 않을 수도 있기 때문에
    선택적 전달인자를 의미하는 대괄호로 표시한다.

    options는 문자열이나 객체 형태로 받을 수 있는데, 문자열로 전달할 경우 인코딩을 받는다. 이때, 대표적인 인코딩 방식으로는 utf8이 있다.

    세 번째 인자인 callback은 콜백 함수를 전달한다.
    이는 파일을 읽고 난 후에 비동기적으로 실행되는 함수를 받는다.
    이때 콜백 함수에는 err와 data 두 가지 매개변수가 있는데,
    에러가 발생하면, (err,null)이 되고,
    에러가 발생하지 않으면, err는 null 이 되어 (null, data)가 된다.
    이때,data에 문자열이나 Buffer라는 객체가 전달되고, data는 파일의 내용을 의미한다.


Part 2 - fs 모듈 개요 과제

Q. .then 메소드 안에 왜 함수를 리턴하는지?
A. user2Path의 속성에 접근하기 위해서 return으로 불러옴.
return result를 하면, 함수가 종료되기 때문에 함수 안에 함수를 리턴하는 방법으로 함수 인자 user2Path를 한 번 더 불러오려고 retrun으로 함수를 불러옴.
한 함수에 리턴은 한 번만 되므로
user1 함수 안에서 리턴을 한 번 더 해서 user2를 불러온 것,

const readAllUsersChaining = () => {
  // TODO: 여러개의 Promise를 then으로 연결하여 작성합니다
 const result = [];
 return getDataFromFilePromise(user1Path)

 .then((user1) => {
  result.push(JSON.parse(user1));
  return getDataFromFilePromise(user2Path) 👈 (질문 🧐?)

  .then((user2)=>{
    result.push(JSON.parse(user2));
    return result;
  });
 });
}

소감

🔡➡️💻➡️🤓👍

과제를 할 때에는 이게 맞는 건지 잘 이해가 되지 않아서
검색을 통해 과제를 수행할 수 있었다.

과제를 제출하고 페어 활동 시간에 페어분께
설명을 할 때, 100% 이해한 것이 아니기에
정확하고 분명한 설명을 하지 못해 아쉬웠다.

이후, 5시에 진행된 실시간 세션에서
강사분께 질문을 하여 질문에 대한 답변을 얻을 수 있었고,
머릿속에서 모호했던 학습 내용들이 조금은 자리를 잡아갈 수 있었다.

페어 활동과 질의응답 실시간 세션을 중요하게 생각하지 않았는데
오늘은 이 두 가지를 통해 많이 얻을 수 있었다.

뭔가 페어분께 부족했지만 설명을 할 수 있다는 것에
스스로 뿌듯함을 느꼈고, 또 모호했던 지식이 뚜렷해지는 과정에서
배움의 희열을 느낄 수 있었던 하루였다.

profile
developerpyk

0개의 댓글