Node.js 18 LTS로 마이그레이션하면서 겪은 이슈들

배경

회사 프로젝트가 Node.js 14를 사용 중이었는데, 2023년 4월이면 EOL이라 18 LTS로 마이그레이션을 진행했다. 10월에 18 LTS가 공식 릴리즈되었고, 이번 달에 시간을 내서 작업했다.

주요 변경사항

1. fetch API 기본 탑재

Node.js 18부터 fetch가 global로 제공된다. 기존에 axios를 쓰고 있었지만, 간단한 API 호출은 fetch로 변경했다.

// 기존
const axios = require('axios');
const response = await axios.get('https://api.example.com/data');

// 변경
const response = await fetch('https://api.example.com/data');
const data = await response.json();

2. OpenSSL 3.0 이슈

가장 골치 아팠던 부분. OpenSSL 1.1.1에서 3.0으로 업그레이드되면서 legacy 알고리즘이 기본적으로 비활성화되었다.

레거시 시스템과 통신하는 부분에서 ERR_OSSL_EVP_UNSUPPORTED 에러가 발생했다.

# 임시 해결
NODE_OPTIONS=--openssl-legacy-provider node app.js

프로덕션에서는 레거시 시스템 쪽을 먼저 업데이트하는 방향으로 결정했다.

3. crypto.DEFAULT_ENCODING 제거

기존 코드 중 일부에서 crypto 모듈을 사용하면서 deprecated API를 쓰고 있었다.

// 수정 전
const hash = crypto.createHash('md5').update(data);
crypto.DEFAULT_ENCODING = 'hex';

// 수정 후
const hash = crypto.createHash('md5').update(data).digest('hex');

4. 성능 개선

V8 엔진이 10.2로 업데이트되면서 체감 성능이 좋아졌다. 벤치마크 결과 약 15% 정도 빨라진 것을 확인했다.

결론

마이그레이션 자체는 2일 정도 소요되었다. OpenSSL 관련 이슈만 주의하면 큰 문제는 없었다. fetch API가 기본 탑재된 것은 좋지만, 당장 axios를 걷어내기에는 에러 핸들링이나 인터셉터 등 편의 기능이 많아서 점진적으로 교체할 예정이다.