JangBaGeum.gif

[Node.js] Util 모듈의 promisify() 함수 사용법 본문

Backend/Node.js

[Node.js] Util 모듈의 promisify() 함수 사용법

장바금 2023. 2. 21. 23:06

 Node.js의 child_process 모듈을 사용하여 프로세스를 실행하고 결과를 받는 과정에서 콜백 형태가 아닌 더 깔끔한 방법으로 처리 가능할까 하고 찾아보다가 promisify()라는 함수를 알게 되었습니다. 나름 유용할 것 같아 소개 글을 작성해보려고 합니다.

https://itnext.io/async-way-to-the-future-e299b4e0551b

 Node.js는 비동기적인 작업을 수행하는데 매우 유용한 프레임워크입니다. 그러나 Node.js에서는 대부분의 함수들이 콜백 패턴을 사용하며, 이는 비동기적인 작업을 수행할 때 중첩된 코드를 작성하게 만들어 코드의 가독성과 유지보수성을 낮추는 요인 중 하나입니다.

 이러한 문제를 해결하기 위해 Node.js의 util 모듈에는 콜백 패턴을 사용하는 함수를 Promise 객체를 반환하는 함수로 변환해 주는 promisify() 함수가 있습니다. 이 함수를 사용하면 중첩된 코드 없이 간결한 코드로 비동기적인 작업을 처리할 수 있습니다.

 

promisify() 함수란?

 promisify() 함수는 콜백 패턴을 사용하는 함수를 Promise 객체를 반환하는 함수로 변환해 줍니다. 이를 통해 비동기적인 작업을 수행할 때 중첩된 코드 없이 간결한 코드로 작성할 수 있습니다.

 예를 들어, Node.js의 파일 시스템 모듈(fs)에서 제공하는 readFile() 함수는 콜백 패턴을 사용합니다. 다음과 같이 콜백 함수를 전달하여 파일을 읽을 수 있습니다.

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
  } else {
    console.log(data);
  }
});

 하지만 이러한 방식은 코드의 가독성을 떨어뜨리고 유지보수성을 낮추는 요인 중 하나입니다. 이를 해결하기 위해 promisify() 함수를 사용하여 다음과 같이 코드를 작성할 수 있습니다.

const fs = require('fs');
const { promisify } = require('util');

const readFile = promisify(fs.readFile);

readFile('example.txt', 'utf8')
  .then(data => console.log(data))
  .catch(error => console.error(error));

 

 위의 예제 코드에서는 promisify() 함수를 사용하여 readFile() 함수를 Promise 객체를 반환하는 함수로 변환하고 있습니다. 이렇게 변환된 함수는 then()과 catch() 메서드를 사용하여 성공적인 결과와 에러를 처리할 수 있습니다.

 

promisify() 함수 사용 방법

 우선 Node.js의 util 모듈에서 promisify() 함수를 가져와야 합니다.

const { promisify } = require('util');

 

 그리고 콜백 패턴을 사용하는 함수를 promisify() 함수를 사용하여 Promise 객체를 반환하는 함수로 변환합니다. 이때, promisify() 함수에는 변환하려는 함수를 인수로 전달합니다.

const readFile = promisify(fs.readFile);

 그리고 Promise 객체를 반환하는 함수를 사용하여 비동기적인 작업을 수행합니다. 이때 then()과 catch() 메서드를 사용하여 성공적인 결과와 에러를 처리할 수 있습니다.

readFile('example.txt', 'utf8')
  .then(data => console.log(data))
  .catch(error => console.error(error));

 promisify() 함수는 콜백 함수의 인자로 전달되는 첫 번째 인자가 에러 객체인 경우, reject() 함수를 호출하고 나머지 인자들을 resolve() 함수에 전달합니다. 두 번째 인자부터는 resolve() 함수에 전달됩니다.

 

promisify() 함수 사용 시 주의 사항

promisify() 함수를 사용할 때 주의해야 할 몇 가지 사항이 있습니다.

  1. promisify() 함수는 콜백 패턴을 사용하는 함수를 Promise 객체를 반환하는 함수로 변환해 주는 것이지, 비동기적인 작업을 수행하는 함수를 동기적으로 만들어주는 것이 아닙니다.
  2. promisify() 함수를 사용하여 Promise 객체를 반환하는 함수로 변환한 후, then()과 catch() 메서드를 사용하여 비동기적인 작업을 수행하게 되는데, 이때 then()과 catch() 메서드를 연속적으로 사용하는 것이 아닌, 체이닝 방식으로 사용하도록 주의해야 합니다.
  3. promisify() 함수는 콜백 패턴을 사용하는 함수에서 발생하는 모든 에러를 처리할 수 없습니다. 따라서 개발자가 직접 에러 처리를 해주어야 합니다.

 Node.js의 util 모듈의 promisify() 함수를 사용하면 콜백 패턴을 사용하는 함수를 Promise 객체를 반환하는 함수로 변환하여 중첩된 코드 없이 간결한 코드로 비동기적인 작업을 처리할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다. 그러나 promisify() 함수를 사용할 때에는 몇 가지 주의 사항이 있으므로, 개발자는 이를 유의하여 사용해야 합니다.