NestJS 8에 추가된 기능

이호영·2021년 9월 14일
0

💡 https://trilon.io/blog/announcing-nestjs-8-whats-new

v8 릴리즈에는 프레임워크, @nestjs/graphql@nestjs/config 패키지에 대한 수많은 개선사항이 포함되어 있습니다.

API versionng

전통적으로 Node.js(및 NestJS) 애플리케이션에서 API 버전 관리는 올바른 방법이 없었습니다.

v8 에서는 동일한 애플리케이션에서 다른 버전의 컨트롤러 또는 개별 라우터를 실행할 수 있습니다. 우리는 3가지 다른 방식으로 버전관리를 지원합니다.

  • URI Versioning

    → Request URI에 버전이 전달됩니다. (default)

  • Header Versioning

    → 커스텀 Request Header로 버전을 지정합니다.

  • Media Type Versioning

    → Requst의 Accept 헤더로 버전을 지정합니다.

컨트롤러에 버전을 지정해 모든 컨트롤러의 경로에 버전을 설정할 수 있습니다.

@Controller({
  path: 'cats',
  version: '1', // 👈
})
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats for version 1';
  }
}

또는 개별 라우터에 지정할 수 있습니다.

@Version('1') // 👈
@Get()
findAll(): string {
  return 'This action returns all cats for version 1';
}

NestJS + Severless documentation

서버리스 컴퓨팅은 클라우드 제공업체가 주문형 머신 리소스를 할당하여 고객을 대신하여 서버를 관리하는 클라우드 컴퓨팅 실행 모델입니다. 앱이 사용중이 아니면 앱에 할당된 컴퓨팅 리소스가 없습니다. 가격은 애플리케이션 (source)에서 사용하는 실제 리소스 양을 기준으로 합니다.

서버리스 환경에서 Nest 애플리케이션을 올바르게 실행하는 것은 때때로 까다로울 수 있습니다. 좀 더 간단하게 하기 위해 우리는 벤치마크, 런타임 및 빌드 시간 최적화, 몇 가지 기본 사례 및 통합, Nest의 주요 문제점을 설명하는 챕터를 공식문서에 추가했습니다. NestJS 서버리스 애플리케이션 및 이러한 애플리케이션에 대처하는 방법을 알아보세요.

Lazy-loading modules

기본적으로 모듈들은 eager 로드됩니다. 애플리케이션이 시작되자마자 모든 모듈이 필요하든 필요하지 않든 즉시 로드됩니다. 대부분의 애플리케이션에서는 괜찮지만 시작 지연 시간(또는 "콜드 스타트")가 중요한 서버리스 환경에서 실행되는 앱, worker들의 경우 병목현상이 발생할 수 있습니다.

Lazy loading은 특정 서버리스 함수 호출에 필요한 모듈만 로드하여 부트스트랩 시간을 줄이는 데 도움이 될 수 있습니다. 또한 서버리스 함수가 "warm"되면 다른 모듈을 비동기식으로 로드하여 후속 호출에 대한 부트스트랩 시간을 더욱 단축할 수 있습니다. (known as: deferred modules registration).

HINT: Angular에 익숙하다면 들어본 적이 있을 것 입니다. 하지만 Angular에서와 기능적으로 다르므로 다른 기능으로 생각해야 합니다.

v8에서는 on-demand로 모듈을 로드하는 방법을 추가했습니다. (lazily). 자세히 보기

⚠️ 지연 로드 모듈 내부에 등록된 컨트롤러, 리졸버, 게이트웨이들은 예상한대로 동작하지 않을 수 있습니다. 마찬가지로 on-demand로 미들웨어 기능을 등록(MiddlewareConsumer 인터페이스를 구현해)할 수 없습니다.

Template literal types and ConfigService

타입스크립트 4.2 버전에서 사용할 수 있는 템플릿 리터럴 타입을 통해 다음과 같이 infer를 사용하여 점 표기법을 사용할 경우에도 중첩된 사용자 정의 구성 객체의 속성 유형을 유추할 수 있는 새로운 기능을 구현할 수 있습니다.

constructor(private configService: ConfigService<{ database: { host: string } }>) {
  const dbHost = this.configService.get('database.host', { infer: true });
  // typeof dbHost === "string"
}

이전에는 any로 입력되었을 것 입니다.

Support multiple event subscribers

v8에서는 @EventPattern Decorator를 이용해 하나의 마이크로서비스 내에서 여러 이벤트 구독자를 등록할 수 있습니다.

이것은 커뮤니티에서 가장 오래되고 오랫동안 기다려온 요청 중 하나였으며, 드디어 이번 주요 릴리스에 추가되었습니다!

Logger refactor/improvements

v8 이전에는 IoC 컨테이너에 등록된 커스텀 Logger 인스턴스를 사용할 때 인스턴스가 아직 생성되지 않았기 때문에 첫 번째 초기화 메시지, 오류를 놓치거나 기본 내장 로거로 기록됐습니다.

이 문제를 해결하기 위해 새로운 로그 버퍼링 기능을 도입했습니다.

const app = await NestFactory.create(ApplicationModule, {
  bufferLogs: true, // 👈
});
app.useLogger(new MyLogger());

위의 예시에서 커스텀 logger를 연결하고 응용프로그램 초기화 프로세스가 완료되거나 실패할 때까지 모든 로그가 버퍼링 되도록 bufferLogstrue로 설정했습니다.

초기화 과정이 실패하면, Nest는 에러 메세지를 출력하기 위해 원래 ConsoleLogger로 대체합니다.

autoFlushLogsfalse 로 설정하여 (default: true) Logger#flush() 함수를 이용해 수동으로 로그를 flush할 수 있습니다.

초기화 과정이 성공하면 버퍼에 입력된 로그들이 설정한 로그 인스턴스로 모두 출력됩니다.

Upgraded dependencies

Nest v8은 마침내 v7과 호환되지 않았던 Socket.io 4.0 및 NATS v2에 대한 지원을 제공합니다. 또한 Nest v8은 최신 버전의 RxJS(v7)를 사용합니다.

profile
안녕하세요!

0개의 댓글