Node.js 8 LTS로 마이그레이션하면서 겪은 이슈들
배경
10월에 Node.js 8이 LTS로 전환되면서 프로덕션 환경 업그레이드를 진행했다. 주요 목적은 async/await를 Babel 없이 사용하고, V8 엔진 업그레이드에 따른 성능 향상을 얻기 위함이었다.
마주친 문제들
1. bcrypt 네이티브 모듈 재빌드
배포 후 bcrypt 관련 에러가 발생했다. Node 버전이 바뀌면서 네이티브 모듈을 재컴파일해야 했다.
npm rebuild bcrypt --build-from-source
CI/CD 파이프라인에 이 과정을 추가했다.
2. Promise rejection 핸들링
Node 8에서는 unhandledRejection 경고가 더 엄격해졌다. 기존에 방치했던 Promise rejection들이 로그에 쌓이기 시작했다.
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// 로깅 시스템으로 전송
});
전역 핸들러를 추가하고, 주요 비동기 코드에 catch 블록을 보강했다.
3. util.promisify 활용
콜백 기반 API를 Promise로 변환하던 부분을 util.promisify로 대체했다.
const { promisify } = require('util');
const fs = require('fs');
const readFileAsync = promisify(fs.readFile);
// 기존 코드
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 변경 후
async function readConfig() {
const data = await readFileAsync('file.txt', 'utf8');
console.log(data);
}
성능 개선
V8 5.8 -> 6.1 업그레이드로 약 15% 정도의 처리량 향상을 확인했다. 특히 JSON 파싱이 많은 API 서버에서 체감할 수 있었다.
결론
큰 문제 없이 마이그레이션을 완료했다. async/await를 네이티브로 쓸 수 있게 되어 코드 가독성이 많이 개선됐다. 다음 스프린트부터는 ES6 모듈 시스템 도입을 검토할 예정이다.