Node.js의 child_process 모듈을 사용하여 프로세스를 실행하고 결과를 받는 과정에서 콜백 형태가 아닌 더 깔끔한 방법으로 처리 가능할까 하고 찾아보다가 promisify()라는 함수를 알게 되었습니다. 나름 유용할 것 같아 소개 글을 작성해보려고 합니다.
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() 함수를 사용할 때 주의해야 할 몇 가지 사항이 있습니다.
- promisify() 함수는 콜백 패턴을 사용하는 함수를 Promise 객체를 반환하는 함수로 변환해 주는 것이지, 비동기적인 작업을 수행하는 함수를 동기적으로 만들어주는 것이 아닙니다.
- promisify() 함수를 사용하여 Promise 객체를 반환하는 함수로 변환한 후, then()과 catch() 메서드를 사용하여 비동기적인 작업을 수행하게 되는데, 이때 then()과 catch() 메서드를 연속적으로 사용하는 것이 아닌, 체이닝 방식으로 사용하도록 주의해야 합니다.
- promisify() 함수는 콜백 패턴을 사용하는 함수에서 발생하는 모든 에러를 처리할 수 없습니다. 따라서 개발자가 직접 에러 처리를 해주어야 합니다.
Node.js의 util 모듈의 promisify() 함수를 사용하면 콜백 패턴을 사용하는 함수를 Promise 객체를 반환하는 함수로 변환하여 중첩된 코드 없이 간결한 코드로 비동기적인 작업을 처리할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다. 그러나 promisify() 함수를 사용할 때에는 몇 가지 주의 사항이 있으므로, 개발자는 이를 유의하여 사용해야 합니다.
'Backend > Node.js' 카테고리의 다른 글
[Node.js] Node.js의 가비지 컬렉션 (Garbage Collection, GC) 2 _ Minor GC, Major GC 와 알고리즘 (1) | 2024.12.09 |
---|---|
[Node.js] Node.js의 가비지 컬렉션 (Garbage Collection, GC) 1 _ V8 엔진의 메모리 구조 (Stack과 Heap) (0) | 2024.12.03 |
[Node.js] RxJS란 (0) | 2023.02.18 |
[Node.js] 스트림이란 (Stream) ② (0) | 2023.02.18 |
[Node.js] 스트림이란 (Stream) ① (0) | 2023.02.18 |