본문 바로가기
AI.IT

Node.js 24 올려보고 달라진 게 있었다

by bamsik 2026. 3. 23.
반응형

Node.js 24로 올린 지 두 달쯤 됐다. 처음엔 그냥 버전 업그레이드니까 큰 변화 없겠지 싶었는데, 쓰다 보니 체감되는 부분이 몇 가지 있었다. 특히 URLPattern이 글로벌로 풀리고, Permission Model이 드디어 안정 단계에 들어선 게 반갑더라.

V8 13.6 업그레이드 - 개발자가 실제로 쓸 수 있는 것들

Node.js 24의 핵심은 V8 13.6 업그레이드다. 버전 숫자만 보면 잘 모르지만, 실제로 뭐가 달라졌냐면:

Explicit Resource Management (using 키워드)

드디어 JavaScript에도 using 키워드가 왔다. C#이나 Python의 with 구문처럼, 자원을 자동으로 정리해주는 패턴이다.

// Node.js 24 이전
const conn = await db.connect();
try {
  await doSomething(conn);
} finally {
  conn.close(); // 깜빡하면 누수
}

// Node.js 24 이후
await using conn = await db.connect();
await doSomething(conn); // 블록 끝나면 자동 close

파일 핸들, DB 연결, 락 같은 걸 다룰 때 finally 블록 빠뜨리는 실수가 없어진다. 처음엔 "어, 이거 TypeScript에서 이미 쓰던 거 아냐?" 싶었는데, 이제 런타임 레벨에서 지원이라 트랜스파일 없이 된다.

Float16Array

AI 추론 작업에서 쓸 수 있는 16비트 부동소수점 배열. WebGPU랑 같이 쓸 때 메모리 절약이 확실하다. ML 관련 Node.js 백엔드 작업하는 사람한테 유용할 듯.

RegExp.escape()

이건 진짜 오랫동안 기다린 기능이다.

// 기존 방식 - 직접 이스케이프 함수 작성
function escapeRegex(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

// Node.js 24
const safe = RegExp.escape(userInput);
const pattern = new RegExp(safe, 'gi');

사용자 입력을 정규식에 넣을 때마다 직접 이스케이프 유틸 함수를 만들었었는데, 이제 네이티브로 된다. 이거 없어서 npm 패키지 쓴 사람 꽤 있을 거다.

URLPattern 글로벌 노출 - 이게 생각보다 큰 변화

Node.js 24부터 URLPattern이 전역 객체로 올라왔다. 예전엔 import { URLPattern } from 'urlpattern-polyfill' 같은 걸 써야 했는데, 이제 그냥 된다.

const pattern = new URLPattern({ pathname: '/users/:id' });
const result = pattern.exec('https://example.com/users/42');
console.log(result.pathname.groups.id); // '42'

라우팅 로직 짤 때 정규식 대신 이걸 쓰면 코드 읽기가 훨씬 편해진다. Express 같은 프레임워크 안 쓰고 직접 서버 만들 때 특히 유용하더라.

Permission Model - 이제 --permission 으로

Node.js 20에서 실험적으로 나왔던 Permission Model이 이제 --permission 플래그로 안정화됐다.

# 파일 시스템 읽기만 허용
node --permission --allow-fs-read=/tmp app.js

# 네트워크 접근만 허용
node --permission --allow-net app.js

서버리스 함수나 신뢰할 수 없는 플러그인 실행하는 경우에 쓸 수 있다. 개인 프로젝트엔 별로 안 쓸 것 같지만, 엔터프라이즈 환경이나 멀티테넌트 서비스에선 꽤 중요한 기능이다.

npm 11 - 달라진 점

Node.js 24엔 npm 11이 번들되어 있다. 체감 변화는 이렇다:

  • 설치 속도 - 체감상 20% 정도 빠른 것 같긴 한데, 네트워크 영향이 커서 일관된 비교는 어렵다
  • 보안 강화 - bulk 어드바이저리 요청 실패 시 예전 엔드포인트로 폴백하지 않음. 더 엄격해졌다
  • lifecycle script - --ignore-scripts 플래그 동작이 더 일관적으로 바뀜

Test Runner 개선 - 기다리던 변화

Node.js 내장 Test Runner가 이제 서브테스트를 자동으로 기다려준다.

// 이전 - 수동으로 await 해야 했음
test('parent', async (t) => {
  await t.test('child', () => { ... });
});

// 이제 - 자동으로 기다림
test('parent', (t) => {
  t.test('child', () => { ... }); // await 없어도 됨
});

작은 변화 같지만, 테스트 빠뜨리는 실수를 방지해준다. Jest 쓰다가 내장 테스트 러너로 넘어오는 사람한테 특히 반가운 개선이다.

실제 프로젝트에 올렸을 때 주의할 점

솔직히 말하면, Node.js 24로 올리면서 한 가지 이슈가 있었다. Windows에서 MSVC 지원이 제거됐다. ClangCL이 필요한데, CI 파이프라인에 Windows 빌드가 있다면 체크가 필요하다. 우리 팀은 다행히 macOS/Linux만 써서 문제없었지만.

그리고 AsyncLocalStorage가 AsyncContextFrame으로 기본값이 바뀌었다. 성능이 좋아졌다고 하는데, 일부 모니터링 라이브러리랑 충돌이 보고된 경우가 있다. 올리기 전에 APM 도구 호환성 확인해보는 게 좋다.

정리하면

Node.js 24가 획기적인 변화냐고 물으면, 그건 아니다. 하지만 오랫동안 기다렸던 것들이 하나씩 정착되는 버전이라는 느낌이다. using 키워드, RegExp.escape(), URLPattern 글로벌, Permission Model 안정화 - 이런 것들이 쌓이면 코드 품질이 달라진다.

LTS는 2025년 10월에 됐으니, 프로덕션에 올릴 타이밍은 지금이 맞다.


📎 참고 자료

반응형