클라이언트가 NestJS 서버로 HTTP 요청을 보내면, 이 요청은 컨트롤러의 라우트 핸들러에 도달하기 전과 후에 여러 단계를 거치게 됩니다.
NestJS는 이 과정을 세밀하게 제어할 수 있도록 5가지 주요 구성 요소를 제공합니다.
실행 순서:
true 또는 false 반환)ExecutionContext를 통해 다음에 실행될 컨트롤러와 메서드의 정보에 접근할 수 있어 훨씬 정교한 권한 제어가 가능합니다.CanActivate 인터페이스)import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
// 요청 헤더에서 토큰을 확인하는 로직 (예시)
const hasToken = request.headers.authorization !== undefined;
// true를 반환하면 요청 통과, false면 403 Forbidden 에러 발생
return hasToken;
}
}
// 컨트롤러에 적용
@UseGuards(AuthGuard)
@Controller('users')
export class UsersController { ... }
{ data: ... })으로 일괄 포장합니다.RxJS의 Observable을 사용하여 비동기 스트림을 강력하게 제어합니다.import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { map } from 'rxjs/operators';
@Injectable()
export class TransformInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
// next.handle()은 컨트롤러의 라우트 핸들러를 실행함
return next.handle().pipe(
// 컨트롤러가 반환한 데이터(data)를 가로채서 새로운 객체 형태로 변환
map(data => ({
success: true,
data: data,
})),
);
}
}
@RestControllerAdvice와 동일한 역할입니다.{ statusCode: 400, message: "...", timestamp: "..." })import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';
@Catch(HttpException) // HttpException 타입의 에러만 가로챔
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus();
// 커스텀 에러 응답 포맷 정의
response.status(status).json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
message: exception.message,
});
}
}
ExecutionContext를 활용하여 요청의 인증 및 인가(권한 제어)를 수행합니다.