NestJS는 데코레이터를 활용하여 애플리케이션의 다양한 부분을 설정하고 제어하는 기능을 제공합니다. 데코레이터는 클래스, 메서드, 프로퍼티, 매개변수 등의 앞에 @ 기호를 붙여 사용합니다. NestJS에서는 많은 데코레이터가 제공되며, 각각의 데코레이터는 특정 목적을 가지고 있습니다. 이제 몇 가지 주요한 데코레이터를 소개하고 사용법과 목적에 대해 상세히 설명하겠습니다.
@Module(): @Module()
데코레이터는 NestJS에서 모듈을 정의할 때 사용됩니다. 애플리케이션은 최소한 하나 이상의 모듈을 가지며, @Module()
데코레이터로 각 모듈을 구성합니다. 모듈은 컨트롤러, 서비스, 프로바이더 등을 그룹화하는 데 사용되며, imports
, controllers
, providers
, exports
등의 속성을 정의하여 모듈 간에 의존성을 관리할 수 있습니다.
@Module({
imports: [OtherModule],
controllers: [AppController],
providers: [AppService],
exports: [AppService],
})
export class AppModule {}
@Controller(): @Controller()
데코레이터는 NestJS 컨트롤러를 정의할 때 사용됩니다. 컨트롤러는 HTTP 요청과 응답을 처리하는 역할을 담당하며, @Controller()
데코레이터는 해당 컨트롤러의 엔드포인트를 정의합니다.
@Controller('users')
export class UserController {}
@Injectable(): @Injectable()
데코레이터는 서비스 클래스를 정의할 때 사용됩니다. 서비스는 비즈니스 로직을 수행하고 컨트롤러에서 사용되며, 의존성 주입을 위해 @Injectable()
데코레이터를 사용해야 합니다.
@Injectable()
export class UserService {}
@Inject(): @Inject()
데코레이터는 의존성 주입(Dependency Injection)을 위해 사용됩니다. @Inject()
데코레이터를 사용하여 프로바이더를 주입받을 수 있습니다.
@Injectable()
export class UserService {
constructor(@Inject('USER_REPOSITORY') private userRepository: UserRepository) {}
}
@Get(), @Post(), @Put(), @Delete(): HTTP 요청 메서드를 정의하는 데 사용됩니다. 각각 GET, POST, PUT, DELETE 요청을 처리하는 핸들러 메서드를 데코레이터와 함께 사용합니다.
@Controller('users')
export class UserController {
@Get()
async getAllUsers() {}
@Post()
async createUser(@Body() userData: CreateUserDto) {}
}
@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) {}
@Res(), @Req(): Express의 response
객체와 request
객체에 접근할 때 사용됩니다.
@Get()
async getUsers(@Res() res: Response) {
res.send('Hello World!');
}
@UsePipes(): 파이프를 사용하여 데이터 유효성 검사나 변환을 수행할 때 사용됩니다.
@Post()
@UsePipes(ValidationPipe)
async createUser(@Body() userData: CreateUserDto) {}
@UseGuards(): 가드를 사용하여 요청을 인증하거나 권한 검사를 할 때 사용됩니다.
@Post()
@UseGuards(AuthGuard)
async createItem(@Body() itemData: CreateItemDto) {}
@UseInterceptors(): 인터셉터를 사용하여 요청 또는 응답을 변환하거나 조작할 때 사용됩니다.
@Get()
@UseInterceptors(CacheInterceptor)
async getUsers() {}
@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의 데코레이터를 적절히 활용하여 애플리케이션을 더욱 간결하고
유지보수가 용이한 구조로 설계할 수 있습니다.