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월에 됐으니, 프로덕션에 올릴 타이밍은 지금이 맞다.
📎 참고 자료
'AI.IT' 카테고리의 다른 글
| Runway, 경쟁 도구랑 비교해보니 (0) | 2026.03.23 |
|---|---|
| GitHub Copilot CLI에 MCP 붙어보니 이랬다 (0) | 2026.03.23 |
| Claude Code 써보고 Cursor 다시 켰다, 결론은 둘 다다 (0) | 2026.03.23 |
| Google AI Pro vs Ultra — Gemini 구독 어떤 걸 골라야 하나 (0) | 2026.03.23 |
| OpenAI가 uv랑 Ruff 만든 회사를 사버렸다 (0) | 2026.03.23 |