30. util
// util
// 각종 편의 기능을 모아둔 모듈
// - deprecated와 promisify가 자주 쓰임
// - callbackify 도 있는데 이건 거의 안쓰임
// -----------------------------------------------------------------
// 여러분이 노드로 프로그램을 만들었는데, 이를 남들도 쓰기를 원할 때, 그때 알아 챘다면, 잘못 만들었다는 것을..
// 그런데 그렇다고 기존 코드를 지울 수 있느냐. 못 지운다.
// 왜냐면 그 코드를 지워버리면, 그 코드를 사용하고 있었던 프로그램들은 모두 고장나기 때문이다.
// 자바스크립트에서 ES6 모듈 문법이 나왔는데도 CommonJS 방식도 고수할 수 밖에 없는 이유
// 왜냐면 ES6 모듈 문법이 나왔다고해서 이것만 채택해버리면 그동안 CommonJS 방식으로 개발된 프로그램들이 다 고장나기 때문이다.
// 그래서 한번 잘못 만들면 그대로 계속 가야된다. 웬만하면.
// 그래도 잘못 만든 것은 알려주기라도 해야된다.
// 그때 deprecate 메서드를 사용한다.
// 그럼 deprecate 메서드로 감싼 함수를 사용할 때마다, 경고 메시지가 뜨게된다.
// 최대한 이렇게 알려주고 나중에 '주' 버전이 오를 때 deprecate 메서드를 지운다.
const util = require('util');
const crypto = require('crypto');
const dontUseMe = util.deprecate((x, y) => {
console.log(x + y);
}, 'dontUseMe 함수는 deprecated 되었으니 더 이상 사용하지 마세요!')
dontUseMe(1, 2);
// 3
// (node:11769) DeprecationWarning: dontUseMe 함수는 deprecated 되었으니 더 이상 사용하지 마세요!
// (Use `node --trace-deprecation ...` to show where the warning was created)
// -----------------------------------------------------------------
// 자바스크립트가 콜백 기반에서 프로미스 기반으로 넘어가고 있다.
// 그런데 옛날 함수들은 콜백 기반으로 많이 되어있다.
// 그리고 그런 콜백 기반 함수들은 못 없앤다. (왜 못 없애는지는 위에서 말했다.)
// 그리고 노드에선 아직 프로미스를 지원 안하고 콜백 기반으로 남아있는 함수들이 많다.
// 그런 콜백 기반 함수, 메서드들은 async await 문법 사용 못해서 엄청 불편하다.
// 그럴 때 promisify 메서드로 콜백 기반 메서드를 감싸주면
// 마법같이 promise, then, catch 를 붙여줄 수 있게된다.
const randomBytesPromise = util.promisify(crypto.randomBytes);
randomBytesPromise(64)
.then(buf => {
console.log(buf.toString('base64')); // TOl5ILfu2jr1UZUO2q/vxWoXj2DAJLQIYDjhZltxZztraDeaTawMRsqeFBIobKQHlo2yH/UK9jANhsntpUmN9Q==
})
.catch(error => {
console.error(error);
})
// -----------------------------------------------------------------
// 그런데 위와 같이 promisify 메서드로 감싸줄 땐 조건이 하나 있다.
// 콜백 기반 함수가 (error, data) => {} 형식이어야 된다.
// 해당 콜백 함수의 첫번째 인자가 error이고 두번째 인자가 data여야지만 콜백을 프로미스로 바꿀 수 있다.
// 만약 이런 규칙을 지키지 않았다면 promise로 못 바꾼다.
// 노드에선 웬만하면 (error, data) => {} 이런식으로 되어있다. 콜백기반은.
// -----------------------------------------------------------------
// Promise를 callback 기반으로 바꿔주는 util.callbackify 메서드도 있지만 자주 사용되진 않는다.