Handler 전후의 공통 로깅과 응답 변환을 구현합니다.
Interceptor는 RxJS stream으로 Handler 실행 전후를 감싸며 응답 매핑, 시간 측정, cache 같은 횡단 관심사를 구현합니다.
업무 응답을 무조건 한 형식으로 감싸면 파일·stream·외부 webhook 계약과 충돌할 수 있어 적용 범위를 정합니다.
민감한 요청 body와 응답 전체를 일반 로그에 남기지 않습니다.
Interceptor에서 오류를 성공 응답으로 바꾸면 상태 코드와 관측이 왜곡됩니다.
로컬 프로젝트에서 확인해보세요응답 시간 durationMs를 meta에 추가하세요.
import "reflect-metadata";
import {
CallHandler,
Controller,
ExecutionContext,
Get,
Injectable,
Module,
NestInterceptor,
UseInterceptors,
} from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
import { map, Observable } from "rxjs";
@Injectable()
class EnvelopeInterceptor implements NestInterceptor {
intercept(_context: ExecutionContext, next: CallHandler): Observable<unknown> {
return next.handle().pipe(map((data) => ({ data, meta: { version: 1 } })));
}
}
@Controller()
@UseInterceptors(EnvelopeInterceptor)
class AppController {
@Get() home() {
return { title: "Interceptor" };
}
}
@Module({ controllers: [AppController], providers: [EnvelopeInterceptor] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4173, "0.0.0.0");
}
bootstrap();