nestjs decorator 데코레이터

agnusdei·2023년 7월 28일
0

NestJS는 데코레이터를 활용하여 애플리케이션의 다양한 부분을 설정하고 제어하는 기능을 제공합니다. 데코레이터는 클래스, 메서드, 프로퍼티, 매개변수 등의 앞에 @ 기호를 붙여 사용합니다. NestJS에서는 많은 데코레이터가 제공되며, 각각의 데코레이터는 특정 목적을 가지고 있습니다. 이제 몇 가지 주요한 데코레이터를 소개하고 사용법과 목적에 대해 상세히 설명하겠습니다.

  1. @Module(): @Module() 데코레이터는 NestJS에서 모듈을 정의할 때 사용됩니다. 애플리케이션은 최소한 하나 이상의 모듈을 가지며, @Module() 데코레이터로 각 모듈을 구성합니다. 모듈은 컨트롤러, 서비스, 프로바이더 등을 그룹화하는 데 사용되며, imports, controllers, providers, exports 등의 속성을 정의하여 모듈 간에 의존성을 관리할 수 있습니다.

    @Module({
      imports: [OtherModule],
      controllers: [AppController],
      providers: [AppService],
      exports: [AppService],
    })
    export class AppModule {}
  2. @Controller(): @Controller() 데코레이터는 NestJS 컨트롤러를 정의할 때 사용됩니다. 컨트롤러는 HTTP 요청과 응답을 처리하는 역할을 담당하며, @Controller() 데코레이터는 해당 컨트롤러의 엔드포인트를 정의합니다.

    @Controller('users')
    export class UserController {}
  3. @Injectable(): @Injectable() 데코레이터는 서비스 클래스를 정의할 때 사용됩니다. 서비스는 비즈니스 로직을 수행하고 컨트롤러에서 사용되며, 의존성 주입을 위해 @Injectable() 데코레이터를 사용해야 합니다.

    @Injectable()
    export class UserService {}
  4. @Inject(): @Inject() 데코레이터는 의존성 주입(Dependency Injection)을 위해 사용됩니다. @Inject() 데코레이터를 사용하여 프로바이더를 주입받을 수 있습니다.

    @Injectable()
    export class UserService {
      constructor(@Inject('USER_REPOSITORY') private userRepository: UserRepository) {}
    }
  5. @Get(), @Post(), @Put(), @Delete(): HTTP 요청 메서드를 정의하는 데 사용됩니다. 각각 GET, POST, PUT, DELETE 요청을 처리하는 핸들러 메서드를 데코레이터와 함께 사용합니다.

    @Controller('users')
    export class UserController {
      @Get()
      async getAllUsers() {}
    
      @Post()
      async createUser(@Body() userData: CreateUserDto) {}
    }
  6. @Param(), @Query(), @Body(), @Headers(): 각각 URL 파라미터, 쿼리 파라미터, 요청 바디, 헤더 값을 가져올 때 사용됩니다. 매개변수에 데코레이터를 사용하여 해당 값을 추출할 수 있습니다.

    @Get(':id')
    async getUser(@Param('id') id: string) {}
    
    @Get()
    async getUsers(@Query('name') name: string) {}
    
    @Post()
    async createUser(@Body() userData: CreateUserDto) {}
    
    @Get()
    async getHeaders(@Headers('authorization') token: string) {}
  7. @Res(), @Req(): Express의 response 객체와 request 객체에 접근할 때 사용됩니다.

    @Get()
    async getUsers(@Res() res: Response) {
      res.send('Hello World!');
    }
  8. @UsePipes(): 파이프를 사용하여 데이터 유효성 검사나 변환을 수행할 때 사용됩니다.

    @Post()
    @UsePipes(ValidationPipe)
    async createUser(@Body() userData: CreateUserDto) {}
  9. @UseGuards(): 가드를 사용하여 요청을 인증하거나 권한 검사를 할 때 사용됩니다.

    @Post()
    @UseGuards(AuthGuard)
    async createItem(@Body() itemData: CreateItemDto) {}
  10. @UseInterceptors(): 인터셉터를 사용하여 요청 또는 응답을 변환하거나 조작할 때 사용됩니다.

    @Get()
    @UseInterceptors(CacheInterceptor)
    async getUsers() {}
  11. @Header(), @Redirect(), @HttpCode(): HTTP 응답에 대한 헤더, 리다이렉션, 상태 코드를 정의할 때 사용됩니다.

    @Get()
    @Header('Cache-Control', 'none')
    async getUsers() {}
    
    @Get('docs')
    @Redirect('https://nestjs.com', 302)
    getDocs(@Query('version') version) {}
    
    @Post()
    @HttpCode(201)
    async createUser(@Body() userData: CreateUserDto) {}

이 외에도 다양한 데코레이터가 있으며, NestJS에서는 데코레이터를 통해 간편하고 직관적인 코드 작성과 의미 전달을 할 수 있습니다. NestJS의 데코레이터를 적절히 활용하여 애플리케이션을 더욱 간결하고

유지보수가 용이한 구조로 설계할 수 있습니다.

0개의 댓글