Node.js 8에서 10으로 마이그레이션하면서 겪은 문제들
배경
회사에서 운영 중인 API 서버를 Node.js 8.11에서 10.9 LTS로 올리기로 했다. 성능 개선과 보안 패치가 주된 이유였고, 10이 LTS로 전환될 예정이라 미리 준비하는 차원이었다.
주요 이슈
1. bcrypt 네이티브 바인딩
가장 먼저 마주친 문제는 bcrypt 모듈이었다. Node 10에서 빌드된 네이티브 바인딩이 달라서 재설치가 필요했다.
npm rebuild bcrypt
Docker 이미지 빌드 시에는 package.json의 postinstall 스크립트에 추가했다.
2. fs.promises API
Node 10부터 fs.promises가 정식 지원되어 콜백 지옥을 벗어날 수 있게 됐다. 기존 코드를 점진적으로 변경 중이다.
// 기존
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
// Node 10+
const { promises: fs } = require('fs');
await fs.readFile('./config.json', 'utf8');
3. OpenSSL 버전 차이
Node 10에서 OpenSSL 1.1.0으로 업그레이드되면서 일부 암호화 알고리즘의 동작이 달라졌다. 특히 레거시 SSL 인증서와 통신하는 외부 API 연동에서 문제가 생겼다.
임시로 --tls-min-v1.0 옵션을 추가해 해결했지만, 근본적으로는 외부 업체에 인증서 갱신을 요청했다.
4. 성능 테스트
V8 엔진 업그레이드(6.8)로 인한 성능 개선을 확인했다. 내부 벤치마크 결과 JSON 파싱이 약 20% 빨라졌고, async/await 오버헤드도 줄어들었다.
결론
전체적으로 마이그레이션은 성공적이었다. 네이티브 모듈 재빌드만 주의하면 큰 문제는 없었고, 새로운 API들을 활용할 수 있게 되어 코드 품질도 개선할 수 있었다. 다음 달부터 프로덕션에 단계적으로 배포할 예정이다.