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들을 먼저 정리해야 할 것 같다.