
NestJS 11 업데이트 살펴보기: Express 5 지원과 성능 개선
Node.js 생태계에서 널리 쓰이는 백엔드 프레임워크 NestJS가 11 버전으로 판올림되었습니다. 이번 업데이트는 최신 Node.js 런타임 표준을 맞추고 오랫동안 정체되어 있던 기본 웹 프레임워크 어댑터를 최신 버전으로 끌어올리는 데 집중했습니다. 대규모 애플리케이션의 구동 속도를 늦추던 동적 모듈 처리 방식을 재설계하고 컨테이너 환경에서 유용한 JSON 로깅을 내장한 점도 눈에 띕니다.
Node.js 20 전환과 Express 5 지원
NestJS 11의 가장 큰 기반 변화는 최소 런타임 요구사항이 Node.js 20 버전 이상으로 상향된 점입니다. 지원 주기가 끝난 Node.js 16과 18 버전에 대한 지원을 종료하고 장기 지원 버전 중심의 최신 자바스크립트 기능을 온전히 활용할 수 있도록 정리했습니다.
HTTP 계층에서는 Express 5와 Fastify 5에 대한 공식 지원이 추가되었습니다. Fastify 5 전환은 비교적 부드럽지만 기본 HTTP 어댑터로 쓰이는 Express 5는 라우트 경로 처리 문법에 호환되지 않는 변경이 있습니다. 와일드카드 경로를 정의할 때 이전에는 별표 기호 하나만 사용해도 경로 전체를 잡을 수 있었지만 Express 5부터는 이름이 지정된 와일드카드를 사용해야 합니다. 예를 들어 기존의 와일드카드 경로는 이름이 붙은 별도 파라미터 형태로 작성해야 라우터 충돌 없이 정상 동작합니다. 기존 프로젝트에서 범용 와일드카드 라우트를 다수 운영하고 있었다면 업그레이드 전 라우트 설정을 점검해야 합니다.
객체 참조 기반의 빠른 동적 모듈 초기화
초기 구동 속도 개선도 큰 폭으로 이루어졌습니다. 이전 버전의 NestJS는 동적 모듈을 초기화할 때 모듈의 메타데이터를 문자열로 직렬화한 뒤 해시값을 계산해 고유 식별 키를 만들었습니다. 환경 설정 파일이나 복잡한 옵션 객체를 다루는 대형 프로젝트에서는 이 해시 계산 과정이 불필요한 부하를 만들며 애플리케이션 기동 시간을 지연시키는 원인이 되었습니다.
NestJS 11은 메타데이터 전체를 해싱하는 대신 자바스크립트 객체 참조를 직접 사용하는 방식으로 변경했습니다. 설정 크기가 큰 모듈을 초기화할 때 불필요한 직렬화 연산이 사라져 서버 부팅 시간이 눈에 띄게 단축됩니다. 동일한 설정을 가진 동적 모듈을 여러 곳에서 중복으로 등록해 싱글톤처럼 재사용하던 패턴의 경우 모듈 객체를 단일 변수로 분리해 임포트해야 인스턴스가 불필요하게 복제되는 문제를 방지할 수 있습니다.
내장 콘솔 로거의 JSON 포맷 지원
클라우드 컨테이너 환경을 위한 구조화 로깅 기능도 기본 탑재되었습니다. 과거에는 쿠버네티스나 클라우드 감시 도구로 구조화된 로그를 보내기 위해 Winston이나 Pino 같은 외부 로깅 패키지를 별도로 연결해야 했습니다.
NestJS 11부터는 기본 콘솔 로거에 구조화 옵션이 추가되어 추가 의존성 설치 없이 JSON 형식의 로그를 출력할 수 있습니다.
다음은 NestJS 11에서 내장 콘솔 로거를 사용해 JSON 로그를 활성화하는 부트스트랩 코드입니다.
로그 메시지와 타임스탬프가 표준 JSON 형태로 기록되므로 도커 컨테이너 환경에서 수집 도구가 파싱하기 수월해집니다.
적용 시점과 권장 전략
새 프로젝트를 시작하는 개발자라면 NestJS 11을 기본 선택지로 삼는 것이 합리적입니다. Node.js 20의 안정성과 향상된 기동 성능, 내장 JSON 로깅의 편의성을 바로 누릴 수 있습니다.
반면 Node.js 18 이하 런타임에 머물러 있는 기존 운영 환경이나 Express 전용 서드파티 미들웨어 의존성이 높은 프로젝트라면 서두를 필요가 없습니다. 인프라의 Node.js 버전을 먼저 올린 후 라우트 경로 문법과 외부 모듈 호환성을 테스트 환경에서 검증한 뒤 점진적으로 마이그레이션하는 방식을 추천합니다.
