노드 공식 문서
https://nodejs.org/docs/latest-v8.x/api/util.html#util_util
util 라이브러리 (무려 주간 다운로드 수가 19,812,357)
https://www.npmjs.com/package/util
You usually do not have to install util yourself. If your code runs in Node.js, util is built in. If your code runs in the browser, bundlers like browserify or webpack also include the util module.
뭐, 그러니까 node로 실습할 때는 따로 설치가 필요없다는 군요.
우선 급하게 제가 사용해야할 util.pomisify를 짚어보겠습니다.
node 8 이상 부터 추가되었고 Promise로 되어있지 않은 레거시한 모듈들을 비동기로 실행할때 유용합니다.
promisify는 함수의 마지막 인자가 콜백함수(err,value) => … 와 같은경우Promise로 쉽게 감싸줄 수 있는 유틸리티 함수입니다.
이러한 모양의 대표적인 함수로 readFile이 있겠네요
const fs = require('fs');
fs.readFile('./hello.txt', 'utf-8', (err, result) => {
console.log(result);
});
다음과 같은 비동기형 함수를 만들었다고 가정합시다.
const util = require('util');
const fs = require('fs');
const getDataFromFile = function(filePath, callback) {
fs.readFile(filePath, 'utf-8', (err, result) => {
if(result === undefined){
callback(err, null);
}else{
callback(null, result);
}
});
};
이렇게 작성했다면 해당 함수는 다음과 같이 사용해야 합니다.
getFileData('./hello.txt',(err, result) => {
if(err){
console.log(err);
}else{
console.log(result); // '안녕하세요~!'
}
});
그런데 문제는, 콜백을 사용하지 않고, 다음과 같이 간략하게 then을 사용하고 싶을 때 입니다.
getFileData('./hello.txt').then(res => conosle.log(res))
이런 방식을 사용하려면 Promise를 이용해서 함수를 정의해야 합니다. 다음과 같이 작성해야 겠군요
const fs = require('fs');
// Promise를 활용한 비동기 함수
const getDataFromFile = function(filePath) {
return new Promise((resolve, reject)=>{
fs.readFile(filePath, 'utf-8', (err, result) => {
if(result === undefined){
reject(err);
}else{
resolve(result);
}
});
});
};
// 사용
getDataFromFile('./hello.txt').then(data=>{
console.log(data);
});
그런데 util.promisify를 사용하면 다음과 같이 Promise를 이용한 리팩토링을 하지 않아도 됩니다.
단순히 본래와 같이 콜백을 가진 형태로 정의한 다음
위와 같은 함수를 util.promisify를 사용하면 다음과 같이 리팩토링할 수 있다.
const util = require('util'); // util 함수 선언
const fs = require('fs');
// Promise가 아닌 콜백 형태의 정의
const getDataFromFile = function(filePath, callback) {
fs.readFile(filePath, 'utf-8', (err, result) => {
if(result === undefined){
callback(err, null);
}else{
callback(null, result);
}
});
};
// util.promisify로 감싸주기
const readFile = util.promisify(getDataFromFile);
// then 사용 가능!
readFile('./hello.txt', 'utf-8').then(result => {
console.log(result); // '안녕하세요~!'
});
참고한 글)
'Node, Nest, Deno > 🚀 Node.js (+ Express)' 카테고리의 다른 글
중앙 집중식 API 에러 핸들링 (탑레벨 fetching handler를 만들어라) (0) | 2020.09.17 |
---|---|
pm2 이용 및 로그 기록 살피기 (0) | 2020.08.06 |
[koa] KOA 백엔드의 라우팅 폴더 구조 (0) | 2020.07.30 |
[koa] koa 살펴보기 (0) | 2020.07.29 |
chained route handlers (0) | 2020.07.02 |