Nest.js는 현대적인 웹 애플리케이션 개발을 위한 강력한 프레임워크로, 다양한 기능을 제공하여 개발자들이 효율적으로 작업할 수 있도록 돕습니다. 그 중에서도 인터셉터는 요청과 응답을 가로채어 처리할 수 있는 매우 유용한 도구입니다. 이번 포스트에서는 커스텀 인터셉터의 개념과 활용 방법에 대해 깊이 있게 알아보겠습니다.
1. 인터셉터란 무엇인가?
인터셉터는 HTTP 요청이 컨트롤러에 도달하기 전에 또는 응답이 클라이언트에게 반환되기 전에 실행되는 코드로, 요청과 응답의 흐름을 제어하는 역할을 합니다. 이들은 다음과 같은 다양한 용도로 활용될 수 있습니다:
- 로깅: 요청 및 응답 정보를 기록하여 디버깅이나 모니터링에 도움을 주며, 시스템의 상태를 파악하는 데 중요한 역할을 합니다.
- 응답 변환: API 응답 형식을 일관되게 유지하거나 특정 형태로 변경하여 클라이언트가 데이터를 보다 쉽게 이해할 수 있도록 돕습니다.
- 예외 처리: 발생하는 예외를 잡아내어 사용자에게 더 나은 피드백을 제공하고, 시스템의 안정성을 높이는 데 기여합니다.
2. 커스텀 인터셉터 만들기
Nest.js에서는 @Injectable()
데코레이터와 함께 NestInterceptor
인터페이스를 구현하여 커스텀 인터셉터를 생성할 수 있습니다. 이를 통해 개발자는 자신만의 로직을 추가하여 애플리케이션의 요구에 맞는 기능을 구현할 수 있습니다.
예제 코드:
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const request = context.switchToHttp().getRequest();
const response = context.switchToHttp().getResponse();
console.log(`Incoming Request... Method: ${request.method}, URL: ${request.url}`);
return next.handle().pipe(
tap(() => console.log(`Response Status Code: ${response.statusCode}`))
);
}
}
위의 예제에서 LoggingInterceptor
는 모든 들어오는 요청과 해당 응답의 상태 코드를 로그로 기록하여, 개발자가 시스템의 동작을 쉽게 추적할 수 있도록 돕습니다.
3. 커스텀 인터셉터 등록하기
커스텀 인터셉터를 생성한 후에는 이를 애플리케이션에 등록해야 합니다. 이는 전역적으로 적용하거나 특정 컨트롤러 또는 경로에만 적용할 수 있어, 개발자가 원하는 방식으로 유연하게 설정할 수 있습니다.
전역 등록 방법:
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
@Module({
providers: [
{
provide: APP_INTERCEPTOR,
useClass: LoggingInterceptor,
},
],
})
export class AppModule {}
위와 같이 설정하면 모든 HTTP 요청에 대해 LoggingInterceptor
가 자동으로 작동하게 되어, 애플리케이션의 모든 요청과 응답을 일관되게 관리할 수 있습니다.
4. 실용적인 사용 사례
API 성능 측정
각 요청의 처리 시간을 측정하고 로그로 남겨 성능 문제를 파악하는 데 유용합니다. 이를 통해 개발자는 애플리케이션의 성능을 지속적으로 모니터링하고 개선할 수 있습니다.
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const startTime = Date.now();
return next.handle().pipe(
tap(() => {
const endTime = Date.now();
console.log(`Request processed in ${endTime - startTime}ms`);
})
);
}
데이터 포맷팅
API 응답 데이터를 통일된 형식으로 변환해 클라이언트가 쉽게 이해하도록 할 수 있습니다. 이를 통해 클라이언트와의 데이터 통신이 원활해지고, 사용자 경험이 향상됩니다.
return next.handle().pipe(
map(data => ({
statusCode: response.statusCode,
data,
message: "Success"
}))
);
결론
커스텀 인터셉터는 Nest.js 애플리케이션에서 매우 유용하며, 필요에 따라 다양한 방식으로 확장하고 조정할 수 있습니다. 이를 통해 보다 효율적이고 관리하기 쉬운 코드를 작성하고, 애플리케이션의 품질을 높이는 데 기여할 수 있습니다. 이러한 기능들은 개발자가 애플리케이션을 더욱 견고하고 신뢰성 있게 만드는 데 필수적인 요소로 작용합니다.
'프로그래밍 > Nest.js' 카테고리의 다른 글
데이터베이스 최적화: 애플리케이션 성능을 극대화하는 방법 (1) | 2025.03.25 |
---|---|
NestJS 전역 미들웨어: 애플리케이션의 품질을 높이는 필수 요소 (0) | 2025.03.25 |
고급 모듈 관리: Nest.js에서의 모듈 간 의존성 주입 (0) | 2025.03.25 |
Nest.js에서의 배포 및 운영: 모니터링과 로깅의 중요성 (0) | 2025.03.24 |
Nest.js에서의 커스텀 가드: 보안과 비즈니스 로직의 최전선 (0) | 2025.03.24 |