Node.js 20 신기능 탐색 - 권한 모델과 테스트 러너
배경
사내 API 서버를 Node.js 18에서 20으로 업그레이드하기 전에 주요 변경사항을 점검했다. 4월에 정식 릴리즈된 Node.js 20은 올해 10월에 LTS로 전환될 예정이라 미리 준비하는 게 좋겠다고 판단했다.
주요 변경사항
1. 실험적 권한 모델
--experimental-permission 플래그로 파일 시스템 접근을 제한할 수 있다. 써드파티 패키지가 예상치 못한 파일에 접근하는 걸 방지하려는 목적이다.
// --experimental-permission --allow-fs-read=/app/data 로 실행
const fs = require('fs');
fs.readFileSync('/app/data/config.json'); // OK
fs.readFileSync('/etc/passwd'); // Error: Access denied
아직 실험 단계라 프로덕션엔 적용하지 않았지만, 보안이 중요한 환경에서 유용할 것 같다.
2. 안정화된 테스트 러너
Node.js 18에서 실험적으로 도입된 내장 테스트 러너가 안정화됐다. Jest나 Mocha 없이도 기본 테스트가 가능하다.
import { test, describe } from 'node:test';
import assert from 'node:assert';
describe('User Service', () => {
test('should create user', async () => {
const user = await createUser({ name: 'John' });
assert.strictEqual(user.name, 'John');
});
});
간단한 유틸리티 패키지에 적용해봤는데, 의존성 없이 테스트 환경을 구축할 수 있어서 좋았다. 다만 모킹 기능이 제한적이라 복잡한 테스트는 여전히 Jest를 쓸 것 같다.
3. V8 11.3 업데이트
V8 엔진이 11.3으로 업데이트되면서 성능이 개선됐다. String 처리와 JSON 파싱이 빨라졌다고 하는데, 벤치마크 결과 실제로 JSON 파싱이 약 15% 정도 빨라진 걸 확인했다.
마이그레이션 계획
당장 LTS는 아니지만 9월쯤 스테이징 환경에 적용해보고, 10월 LTS 전환 이후 프로덕션에 반영할 예정이다. 대부분 하위 호환성이 유지되지만 일부 deprecated API들을 먼저 정리해야 할 것 같다.