데코레이터란?
데코레이터는 클래스, 메서드, 속성, 파라미터에 대해 메타데이터를 정의하거나 동작을 변경하기 위해 사용하는 특수한 타입스크립트 기능입니다. NestJS에서는 데코레이터를 활용하여 코드의 재사용성을 높이고, 직관적이고 선언적인 방식으로 기능을 정의할 수 있습니다.
주요 특징:
- 타입스크립트의 메타프로그래밍: 데코레이터는 컴파일 단계에서 동작하며, 코드에 메타데이터를 추가하거나 수정할 수 있습니다.
- NestJS의 핵심 요소: NestJS에서 컨트롤러(
@Controller
), 서비스(@Injectable
), 모듈(@Module
) 등을 정의할 때 필수적으로 사용됩니다. - 사용자 정의 가능: 기본 제공 데코레이터 외에도 사용자 정의 데코레이터를 만들어 특정 로직을 쉽게 재사용할 수 있습니다.
NestJS에서 데코레이터의 종류
- 클래스 데코레이터
- 클래스에 메타데이터를 추가하거나 동작을 변경합니다.
- 예:
@Controller
,@Injectable
,@Module
- 메서드 데코레이터
- 메서드에 적용되어 추가 동작을 정의합니다.
- 예:
@Get
,@Post
,@Put
- 속성 데코레이터
- 클래스 속성에 메타데이터를 추가하거나 동작을 변경합니다.
- 예:
@Inject
,@Optional
- 파라미터 데코레이터
- 메서드 파라미터에 메타데이터를 추가하거나 동작을 변경합니다.
- 예:
@Body
,@Query
,@Param
,@Headers
@User
데코레이터의 역할
@User
데코레이터는 NestJS의 파라미터 데코레이터로, HTTP 요청 객체에서 사용자 정보를 추출하고 이를 간편하게 사용할 수 있도록 만든 커스텀 데코레이터입니다.
코드 분석:
export const User = createParamDecorator((data, context: ExecutionContext) => {
const req = context.switchToHttp().getRequest();
// HTTP 요청 객체 가져오기const user = req.user;
// 요청 객체에서 사용자 정보 추출
if (!user) {
// 사용자 정보가 없으면 예외 처리
throw new InternalServerErrorException('User 데코레이터는 AccessTokenGuard와 함께 사용해야합니다.');
}
return user;// 사용자 정보 반환
});
createParamDecorator
:- NestJS에서 제공하는 유틸리티 함수로, 커스텀 파라미터 데코레이터를 생성할 때 사용합니다.
context
를 통해 요청 객체, 응답 객체 등 ExecutionContext 관련 정보를 다룰 수 있습니다.
context.switchToHttp().getRequest()
:ExecutionContext
객체를 HTTP 문맥으로 전환하여 요청 객체(req
)를 가져옵니다.
req.user
:AccessTokenGuard
를 통해 요청 객체에 추가된 사용자 정보를 가져옵니다.- Guard가 동작하지 않으면 사용자 정보가 없으므로 예외를 발생시킵니다.
- 사용 목적:
- 컨트롤러 메서드에서 요청 객체에서 사용자 정보를 직접 추출하는 반복적인 작업을 제거하고 간결하게 처리할 수 있습니다.
예시
@User
데코레이터를 사용하지 않을 경우:
@Post()
@UseGuards(AccessTokenGuard)
createPost(@Body('title') title: string, @Body('content') content: string, @Req() req) {
const user = req.user;
if (!user) {
throw new UnauthorizedException();
}
return this.postService.createPost(user.id, title, content);
}
@User
데코레이터를 사용할 경우:
@Post()
@UseGuards(AccessTokenGuard)
createPost(@User() user: UsersModel, @Body('title') title: string, @Body('content') content: string) {
return this.postService.createPost(user.id, title, content);
}
장점:
- 요청 객체에서 사용자 정보를 추출하는 코드가 컨트롤러 메서드에서 사라져 가독성이 향상됩니다.
- 사용자 정보가 없을 때 발생할 예외 처리 로직을 데코레이터에 캡슐화하여 중복 코드를 줄입니다.
데코레이터의 장점
- 코드 재사용성: 공통 로직을 데코레이터로 추상화하여 여러 컨트롤러 메서드에서 재사용할 수 있습니다.
- 가독성 향상: 컨트롤러 메서드에서 반복적인 로직을 제거해 더 간결하게 작성할 수 있습니다.
- 유지보수 용이성: 데코레이터의 동작을 변경하면 이를 사용하는 모든 메서드에 즉시 반영됩니다.
- NestJS 생태계와의 통합: Guard, Interceptor, Pipe와 함께 사용하여 강력한 요청 처리 파이프라인을 구축할 수 있습니다.
결론
@User
데코레이터는 요청 객체에서 사용자 정보를 간편하게 가져오도록 설계된 커스텀 데코레이터입니다. 이를 활용하면 코드의 간결성과 재사용성을 높이고, Guard와의 연계를 통해 보안성과 효율성을 강화할 수 있습니다. NestJS에서 데코레이터는 이처럼 다양한 컴포넌트와 통합적으로 작동하여 더 모듈화되고 유지보수 가능한 애플리케이션을 개발할 수 있도록 도와줍니다.
'NestJS' 카테고리의 다른 글
NestJS Class-transfomer (0) | 2024.11.18 |
---|---|
NestJS DTO,Validation (0) | 2024.11.18 |
NestJS Guard (0) | 2024.11.16 |
NestJS 핫리로드 트러블슈팅 (1) | 2024.11.16 |
NestJS Pipe (0) | 2024.11.15 |