NestJS 공식문서의 Controller 개념 공부 5번째 포스트로, Controller의 Sub-Domain Routing, Scopes, Asynchronicity 주제로 작성한다.
@Controller
데코레이터는 요청의 HTTP 호스트가 특정 값과 일치하도록 요구하는 host
옵션을 받을 수 있다.
@Controller({ host: 'admin.example.com' })
export class AdminController {
@Get()
index(): string {
return 'Admin page';
}
}
라우트 경로와 유사하게, host
옵션도 토큰을 사용하여 호스트 이름에서 동적 값을 캡처할 수 있다. 아래 예제에서 @Controller
데코레이터의 호스트 파라미터 토큰이 동적 값을 캡처한다. 이런 방식으로 선언된 호스트 파라미터는 @HostParam()
데코레이터를 사용하여 접근할 수 있고, 이 데코레이터는 메서드 정의에 추가되어야 한다.
@Controller({ host: ':account.example.com' }) // :account 호스트 파라미터
export class AdminController {
@Get()
getInfo(@HostParam('account') account: string) {
return account;
}
}
Nest에서는 들어오는 요청 간에 거의 모든 것들이 공유된다. 공유되는 것들은 데이터베이스 연결 풀, 전역 상태의 싱글톤 서비스 등이 있다. Node.js는 모든 요청을 별도의 스레드에서 처리하므로 요청/응답 멀티스레드 비저장 모델(request/response multi-threaded stateless model)을 따르지 않는다. 따라서, 애플리케이션에서 싱글톤 인스턴스를 사용하는 것은 안전하다.
하지만 컨트롤러의 요청-기반 수명이 원하는 동작, 예를 들어 GraphQL 애플리케이션의 요청 별 캐싱, 요청 추적 또는 다중 테넌시가 될 수 있는 엣지케이스들이 존재한다. 스코프를 제어하는 방법은 여기에서 확인한다.
데이터 추출은 대부분 비동기식이다. 따라서 Nest는 async
함수를 지원하고 async
함수와 잘 동작한다.
모든 async 함수는 Promise
를 반환해야 한다. 이것은 Nest가 자체적으로 해결 가능한 지연 값을 반환할 수 있음을 의미한다. 아래 예제를 보자.
@Get()
async findAll(): Promise<any[]> {
return [];
}
위 코드는 유효하다. Nest 라우트 핸들러는 RxJS obsevable streams을 리턴할 수 있기 때문에 훨씬 강력하다. Nest는 아래의 소스를 자동으로 구독하고 스트림이 완료되면 마지막으로 방출된 값을 취한다.
@Get()
findAll(): Observable<any[]> {
return of([]);
}
위의 두 방법 모두 동작하며 요구사항에 맞게 사용하면 된다.