궁금증
controller를 보면 자동으로 object를 json으로 serialize 해준다고 한다.
어떻게 하는건지 궁금해졌다.
설명
import { ClassSerializerContextOptions } from './class-serializer.interfaces';
import { Observable } from 'rxjs';
import { CallHandler, ExecutionContext, NestInterceptor } from '../interfaces';
import { ClassTransformOptions } from '../interfaces/external/class-transform-options.interface';
import { TransformerPackage } from '../interfaces/external/transformer-package.interface';
export interface PlainLiteralObject {
[key: string]: any;
}
/**
* @publicApi
*/
export interface ClassSerializerInterceptorOptions extends ClassTransformOptions {
transformerPackage?: TransformerPackage;
}
/**
* @publicApi
*/
export declare class ClassSerializerInterceptor implements NestInterceptor {
protected readonly reflector: any;
protected readonly defaultOptions: ClassSerializerInterceptorOptions;
constructor(reflector: any, defaultOptions?: ClassSerializerInterceptorOptions);
intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
/**
* Serializes responses that are non-null objects nor streamable files.
*/
serialize(response: PlainLiteralObject | Array<PlainLiteralObject>, options: ClassSerializerContextOptions): PlainLiteralObject | Array<PlainLiteralObject>;
transformToPlain(plainOrClass: any, options: ClassSerializerContextOptions): PlainLiteralObject;
protected getContextOptions(context: ExecutionContext): ClassSerializerContextOptions | undefined;
}
해당 ClassSerializerInterceptor 미들웨어가 응답 객체를 serialize 해줍니다.
- Serialize: 주어진 객체를 serialize하여 JSON 형식으로 변환합니다.
- Transform to Plain Object: 클래스 형식의 객체를 plain literal object로 변환합니다.
따라서 위의 코드는 object를 serialize하여 JSON으로 변환하는 역할을 수행합니다.
요청 핸들러에서 반환된 객체를 이 인터셉터를 통해 처리하면 NestJS는 자동으로 이를 JSON으로 serialize하여 클라이언트에게 응답으로 보내줍니다.
ClassSerializerInterceptor는 보통 클래스나 모듈에서 @UseInterceptors(ClassSerializerInterceptor) 데코레이터를 사용하여 등록됩니다.
이를 통해 해당 클래스나 모듈에서 반환되는 모든 응답 객체에 대해 자동으로 serialize가 적용됩니다.
이를 통해 NestJS 애플리케이션에서 응답 객체의 serialize와 변환을 간단하게 처리할 수 있습니다.
이를 통해 클라이언트에게 반환되는 데이터의 형식을 편리하게 관리할 수 있습니다.
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { ClassSerializerInterceptor } from './class-serializer.interceptor';
@UseInterceptors(ClassSerializerInterceptor) // 이 부분이 인터셉터 등록을 담당하는 데코레이터입니다.
@Controller('cats')
export class CatsController {
@Get()
findAll() {
// ...
}
}
이렇게 불러와서 설정을 조금 바꿀수도 있습니다. 하지만 처음에는 바꿀필요 없이 바로 사용가능합니다.
'@nestjs/common'; 에서 다 자동으로 가져오게 됩니다.
import { Controller, Get, Req, Res } from '@nestjs/common';
@Controller('dog')
export class DogController {
constructor(private readonly dogService: DogService) {}
@Post()
create(@Body() createDogDto: CreateDogDto) {
return this.dogService.create(createDogDto);
}
@Get()
findAll() {
return this.dogService.findAll();
}
데코레이터로 등록이 되어있기 때문에 직접 serizlise 할 필요없이 위 모듈을 불러와서 바로 json 객체로 변환됩니다.
요약
NestJS는 데코레이터를 활용하여 응용 프로그램을 구성하고 기능을 추가하는 데 매우 중요한 역할을 합니다.
데코레이터를 사용하여 컨트롤러, 모듈, 서비스 등의 구성 요소를 정의하고 이들 간의 의존성을 주입하며, 라우팅과 요청 처리를 관리하고 다양한 기능을 적용할 수 있습니다.
NestJS는 데코레이터를 통해 응답 데이터를 직렬화하거나 역직렬화하는 기능을 제공합니다.
따라서 NestJS에서 데코레이터는 전체 애플리케이션 아키텍처를 정의하고 제어하는 데 매우 중요한 역할을 하므로 이를 잘 이해해야한다는 것을 알게 되었습니다.
'JaveScript > NestJS' 카테고리의 다른 글
Middleware (0) | 2024.06.11 |
---|---|
@Module() (0) | 2024.06.10 |
Provider (0) | 2024.06.09 |
@Body() 데코레이터 (1) | 2024.06.08 |
main.ts (0) | 2024.06.04 |