TechFeedTechFeed
Backend

Node.js 22 LTS 새 기능 총정리

V8 업그레이드, Fetch API 안정화, Test Runner, Watch Mode 등 Node.js 22 LTS 핵심 변경사항.

한 줄 요약: Node.js 22는 2024년 4월 출시 후 2024년 10월 LTS로 전환됐다. V8 12.4 엔진 업그레이드, Fetch API 안정화, Test Runner 개선, Watch Mode 정식 지원, require()로 ES 모듈 로드 가능 등이 핵심 변경점이다. 현재 Node.js 20 LTS를 쓰고 있다면 22로 전환을 검토할 시점이다.

Node.js LTS 주기를 따르는 실무 환경이라면 버전 전환 타이밍이 중요하다. Node.js 20 LTS는 2026년 4월 Active LTS가 종료되고 Maintenance 단계로 진입한다. 22 LTS로 전환하지 않으면 보안 업데이트만 받는 Maintenance 단계에 머문다. 이 글은 Node.js 22의 주요 변경점과 마이그레이션 시 주의사항을 정리한다.

V8 12.4 — 엔진 업그레이드

Node.js 22는 V8 12.4를 탑재한다. Node.js 20의 V8 11.3 대비 주요 JavaScript 표준 기능이 추가됐다.

Array groupBy — Object.groupBy / Map.groupBy

배열 요소를 기준에 따라 그룹핑하는 기능이 네이티브로 지원된다. Lodash의 _.groupBy를 대체할 수 있다.

Iterator Helpers

이터레이터에 .map(), .filter(), .take(), .drop() 등의 메서드를 체이닝할 수 있다. 배열로 변환하지 않고 지연 평가(lazy evaluation)로 처리할 수 있어 메모리 효율이 높다.

Promise.withResolvers()

Promise의 resolve와 reject를 외부에서 제어할 수 있는 패턴을 표준화한다. 기존에 상태 변수로 처리하던 코드가 더 깔끔해진다.

Node.js 22 신규 V8 기능 예시
// Object.groupBy (V8 12.4) const files = [ { name: 'app.js', type: 'js' }, { name: 'style.css', type: 'css' }, { name: 'index.js', type: 'js' }, { name: 'logo.png', type: 'image' }, ]; const grouped = Object.groupBy(files, ({ type }) => type); // { js: [...], css: [...], image: [...] } // Iterator Helpers const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; const result = numbers .values() // 이터레이터로 변환 .filter(n => n % 2 === 0) // 짝수만 (지연 평가) .take(3) // 앞 3개만 .toArray(); // 배열로 수집 // [2, 4, 6] // Promise.withResolvers() const { promise, resolve, reject } = Promise.withResolvers(); // 기존 방식 let outerResolve; const oldPromise = new Promise((res) => { outerResolve = res; });

Fetch API 안정화

Node.js 22에서 Fetch API가 Stable 상태로 전환됐다. Node.js 18에서 Experimental로 도입됐고, Node.js 21에서 Stable 플래그를 받았으며, 22에서 완전히 안정화됐다.

node-fetch, axios 없이 네이티브 fetch()를 프로덕션 코드에 쓸 수 있다. Request, Response, Headers, FormData, ReadableStream 등 Web Fetch API와 호환된다.

주의 사항

Node.js의 Fetch 구현은 브라우저와 100% 동일하지 않다. HTTP/2 지원이 없고, 브라우저의 쿠키 자동 관리, CORS 처리 등이 없다. HTTP 클라이언트에 고급 기능(인터셉터, 자동 재시도, 타임아웃 설정)이 필요하다면 여전히 axios나 ky 같은 라이브러리가 유용하다.

내장 Test Runner 개선

Node.js 22의 node:test 모듈은 실무 수준의 테스트 러너로 성숙했다. Jest나 Mocha 없이 기본 테스트를 작성할 수 있다.

Node.js 22 내장 Test Runner 예시
// test/math.test.js import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; describe('add()', () => { it('두 양수를 더한다', () => { assert.equal(1 + 2, 3); }); it('음수와 양수를 더한다', () => { assert.equal(-1 + 2, 1); }); }); // mock 기능 import { mock } from 'node:test'; it('DB 호출을 모킹한다', () => { const db = { query: mock.fn(() => [{ id: 1 }]) }; const result = db.query('SELECT * FROM users'); assert.equal(db.query.mock.calls.length, 1); assert.deepEqual(result, [{ id: 1 }]); }); // 실행: node --test test/math.test.js // 또는: node --test (프로젝트 내 *.test.js 자동 탐색)

Watch Mode 정식 지원

Node.js 22에서 --watch 플래그가 Stable로 전환됐다. 파일 변경 시 자동으로 프로세스를 재시작한다. nodemon 없이 개발 환경에서 자동 재시작을 설정할 수 있다.

Watch Mode 사용 예시
# 단일 파일 감시 node --watch app.js # 특정 경로 감시 (변경 시 재시작) node --watch --watch-path=./src app.js # package.json scripts에서 활용 # { # "scripts": { # "dev": "node --watch src/index.js" # } # } # 테스트 watch 모드 node --watch --test test/**/*.test.js

require()로 ES 모듈 로드

Node.js 22의 가장 실용적인 변경 중 하나다. require().mjs 파일이나 "type": "module"인 ES 모듈을 로드할 수 있다. --experimental-require-module 플래그로 활성화하며, Node.js 22.12부터는 플래그 없이 기본 지원된다.

이 변경이 중요한 이유: 지금까지 CommonJS(CJS) 프로젝트에서 ES 모듈만 제공하는 패키지(예: node-fetch v3, chalk v5)를 사용하려면 Dynamic Import(import())를 써야 했다. 비동기 컨텍스트에서만 쓸 수 있어 코드 구조가 복잡해졌다. require()로 ES 모듈을 로드할 수 있게 되면서 이 제약이 사라진다.

제한 사항

최상위 await(Top-level await)를 사용하는 ES 모듈은 require()로 로드할 수 없다. 비동기 초기화가 필요한 모듈은 여전히 import()를 사용해야 한다.

성능 개선 — 무엇이 빨라졌나

Node.js 22는 V8 업그레이드와 내부 최적화로 전반적인 성능이 향상됐다.

  • 스트림 성능: Node.js 22의 stream 모듈이 Node.js 20 대비 최대 40% 빠른 벤치마크 결과가 Node.js 공식 블로그에 게재됐다. 파일 처리, 네트워크 스트리밍이 많은 서버에서 체감 가능하다.
  • URLPattern API 내장: URL 패턴 매칭을 위한 URLPattern이 글로벌 객체로 추가됐다. Express/Hono 같은 프레임워크 내부에서 사용하는 URL 라우팅 패턴을 네이티브 수준에서 처리한다.
  • WebSocket 클라이언트 실험 지원: --experimental-websocket 플래그로 브라우저 호환 WebSocket 클라이언트 API를 Node.js에서 사용할 수 있다.

마이그레이션 체크리스트

항목확인 방법
engines 필드 확인package.json의 engines.node 범위가 22 포함인지 확인
의존성 호환성npm install 후 node_modules의 engines 경고 확인
Deprecation 경고NODE_OPTIONS=--trace-deprecation 으로 실행하여 확인
CI 환경 업데이트GitHub Actions, Docker 이미지의 node 버전 변경
crypto 변경 확인레거시 crypto API 사용 여부 점검 (일부 제거됨)
LTS 전환 타이밍: Node.js 20 LTS의 Active LTS는 2026년 4월 종료된다. 그 이후에는 Maintenance 단계로 보안 패치만 제공된다. 2026년 상반기 안에 22 LTS로 전환하는 것을 권장한다. nvm이나 .nvmrc 파일로 버전을 관리하고 있다면 전환 비용이 낮다.
주의 — Node.js 22에서 제거된 것들: url.parse()의 일부 레거시 동작이 변경됐다. --experimental-global-customevent 플래그가 제거됐다 (CustomEvent가 글로벌로 지원됨). process.binding()의 일부 내부 바인딩이 제거됐다. 네이티브 애드온(.node 파일)은 Node.js 22용으로 재컴파일이 필요할 수 있다.
Node.js22-LTSV8Test-Runner백엔드

관련 포스트

REST API 설계 모범 사례 20262026-02-22GraphQL vs REST API — 2026년 비교2026-03-10마이크로서비스 vs 모놀리스 — 현실적 선택 기준2026-03-11WebSocket 실전 구현 가이드2026-03-11