본문으로 바로가기

노드 공식 문서

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); // '안녕하세요~!'
});

 

 

 

참고한 글)

 

 

[2019.04.27] Promise 꿀팁 - util 모듈 promisify()

node.js의 내장함수인 util모듈 중에 promisify라는 함수가 있다. 이것을 쓰면, 비동기로 돌리려는 함수를 promise로 감싸주지 않고 사용할 수 있다. 그래서 지금부터 이 Promise를 조금 더 잘 다룰 수 있도

helloinyong.tistory.com

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체