- 최근 Node.js는 기존에 npm 패키지로만 가능했던 기능들을 런타임에 내장하며 빠르게 발전 중임
- 이를 통해 공급망 보안 리스크 감소, 코드 이식성 향상, 의존성 축소, 유지보수 간소화가 가능하게 하고, 프로덕션 환경에서 성능과 안정성을 확보하는 데 기여
-
fetch(), WebSocket, node:test 등 글로벌 API가 추가되어 node-fetch, ws, mocha 같은 유명 패키지 없이도 개발 가능
-
파일 시스템 기능 확장으로 glob, rimraf, mkdirp 등을 대체하는 fs.glob(), fs.rm(), fs.mkdir() 옵션 제공
-
유틸리티 및 암호화 API에서 crypto.randomUUID(), util.styleText(), atob/btoa 등이 표준으로 포함되어 uuid, chalk 같은 패키지 불필요
- 일부 기능(node:sqlite, URLPattern, --env-file, TypeScript 실행 등)은 아직 실험적 단계에 머물러 있음
- Node.js의 자체 진화로 인해 기본 런타임만으로도 현대적 애플리케이션 개발이 가능해진다는 점이 중요함
Node.js의 내장 기능으로 대체된 주요 npm 패키지
- Node.js는 그동안 HTTP 유틸리티, 파일 시스템 헬퍼 등 다양한 npm 패키지에 의존해왔음
- 그러나 최근 버전(v18~v22)에서 이러한 기능을 점차 런타임에 직접 통합하는 흐름이 강화됨
- 이로 인해 패키지 관리의 복잡성과 보안 노출 위험이 줄어드는 효과가 있음
1. node-fetch → Global fetch()
- Node.js 18부터 브라우저와 동일한 fetch() 가 전역 함수로 제공됨
-
node-fetch 없이도 HTTP 요청 처리 가능
- v17.5.0에서 실험적으로 도입되어 v18.0.0에서 안정화
- 단, 18 이전 버전에서는 여전히 node-fetch 필요
2. ws → Global WebSocket
- Node.js 21부터 글로벌 WebSocket 클래스로 클라이언트 측 WebSocket 연결 지원
- v21.0.0에서 실험적으로 추가, 현재까지 실험 단계
-
서버 측 WebSocket 구현에는 여전히 ws 패키지나 관련 라이브러리 사용 필요
3. 테스트 프레임워크 → node:test
- Node.js 18부터 mocha, jest 등을 대체하는 내장 테스트 러너 node:test 제공
- v18.0.0에서 실험적으로 도입, v20.0.0에서 안정화
- 기본적인 단위 테스트 작성 및 실행 지원
-
스냅샷, 모킹, 풍부한 플러그인 등이 필요한 경우 서드파티 프레임워크가 여전히 유용
- 모듈 수준 테스트에는 충분하나, 풀스택 애플리케이션 개발에는 기존 프레임워크 장점 존재
4. sqlite3 / better-sqlite3 → node:sqlite
- Node.js에서 SQLite 접근을 위한 실험적 node:sqlite 모듈 도입 중
- 기존 네이티브 바인딩 패키지의 컴파일 문제 및 업그레이드 시 오류 해결
- 메모리 내 데이터베이스 생성, 테이블 생성 등 기본 작업 지원
- 아직 실험 단계이므로, 고급 성능 튜닝이나 추가 기능이 필요하면 커뮤니티 패키지 사용 권장
5. chalk / kleur → util.styleText()
- Node.js 20.12.0부터 util.styleText()로 콘솔 텍스트 스타일링 가능
- v22.17.0에서 안정화
- 색상, 굵게, 밑줄 등 기본적인 텍스트 스타일 적용
-
복잡한 테마, 체이닝 문법, 하위 호환성이 필요하면 chalk등을 계속 사용 가능
6. strip-ansi → util.stripVTControlCharacters()
-
ANSI 이스케이프 코드 제거 기능을 Node.js 내장 함수로 제공
- 대부분의 사용 사례를 네이티브로 커버하여 서드파티 패키지 불필요
7. glob → fs.glob()
- Node.js 22부터 파일 패턴 검색을 위한 내장 fs.glob() 기능 추가
- v22.0.0에서 추가, v22.17.0 LTS에서 안정화
-
**/*.js 같은 glob 패턴으로 파일 검색
-
구버전 Node.js 호환성이 필요한 경우 glob 패키지 사용
8. rimraf → fs.rm({ recursive: true })
-
디렉토리 재귀 삭제를 Node.js 네이티브 API로 지원
-
fs.rm()의 recursive, force 옵션으로 구현
- v12.10.0경부터 사용 가능, 현재 모든 LTS 버전에서 안정화
-
rimraf 패키지 없이도 안전한 디렉토리 삭제 가능
9. mkdirp → fs.mkdir({ recursive: true })
-
디렉토리 재귀 생성을 fs.mkdir()의 recursive 옵션으로 제공
- v10.12.0부터 추가되어 오랜 기간 안정화
- 별도 패키지 없이 중첩 디렉토리 생성 가능
10. uuid → crypto.randomUUID()
- Node.js 14.17.0부터 UUID 생성 함수 crypto.randomUUID() 제공
-
uuid 패키지 없이 안전한 랜덤 ID 생성 가능
11. base64-js / atob → atob, btoa
- Node.js 20부터 atob, btoa 글로벌 함수 제공
- 브라우저와 동일한 Base64 인코딩/디코딩 API
- 기존 Buffer 외에 추가 옵션 제공
- 폴리필 없이 Base64 처리 가능
12. url-pattern → URLPattern
- Node.js 20부터 글로벌 URLPattern API 실험적으로 제공
- 라우트 매칭, 경로 파라미터 추출 등 지원
- 아직 실험 단계로 안정화 필요
- URL 패턴 매칭을 표준 Web API로 처리 가능
13. dotenv → --env-file 플래그
- Node.js 20.10.0부터 --env-file 플래그로 환경 변수 로딩 지원
- 실행 시 .env 파일을 직접 로드
- 아직 실험 단계
-
변수 확장, 다중 env 파일 등 고급 기능은 dotenv 패키지 필요
14. event-target-shim → EventTarget
- Node.js 15.0.0부터 Web 표준 EventTarget 이벤트 시스템을 글로벌로 제공
- v15.4.0에서 안정화
- 브라우저와 동일한 이벤트 처리 모델 지원
-
EventEmitter 대안으로 사용 가능
15. tsc → Node.js TypeScript 실행
- Node.js 21부터 --experimental-strip-types 플래그로 .ts 파일 직접 실행 가능
- 타입 제거만 수행, 전체 타입 체킹은 미지원
- 아직 실험 단계
-
프로덕션 빌드, 정적 타입 검사, 선언 파일 생성, 완전한 타입 체킹에는 여전히 tsc 필요
결론
- Node.js의 발전 방향은 외부 패키지 의존도를 줄이고 플랫폼 자체 완성도를 높이는 것
- 최신 LTS 버전(v22)에서는 이미 많은 npm 패키지가 불필요해졌으며,
이는 보안·성능·유지보수성 측면에서 큰 개선을 의미함
- 기업용 운영 환경에서는 이러한 변화를 실시간으로 모니터링하기 위해 N|Solid 같은 솔루션이 활용되고 있음
- 내장 기능(fetch, node:test, crypto.randomUUID() 등)의 실제 워크로드 성능 분석
-
N|Sentinel AI 에이전트가 사용량 모니터링 및 코드 수준 최적화 권장 사항 제공