인터셉터(Interceptors)
NestJS에서 제공하는 강력한 기능 중 하나로, AOP(Aspect-Oriented Programming)의 개념을 활용합니다.
컨트롤러 핸들러의 실행 전후 또는 예외 발생 시점에 특정 로직을 주입할 수 있게 해주고, 이를 통해 코드의 재사용성을 높이고, 애플리케이션의 관심사를 효과적으로 분리할 수 있게 해주죠.
인터셉터는 아래와 같은 작업을 처리할 때 사용합니다.
- 메서드 실행 전후에 추가 로직 실행
- 함수 실행 결과 변환
- 예외 맵핑
- 기타 컨트롤러 레벨에서의 공통 작업 처리
어떤 상황에서 쓰면 좋은가?
메서드의 실행 시간을 로깅(Logging)하여 성능 모니터링에 활용할 수 있고,
API의 응답 형태를 일관되게 맞추거나, 반환되는 데이터를 사용자에게 보여주기 전에 가공할 때 사용할 수 있고,
특정 조건 하에 요청을 처리하거나 거부할 때 사용할 수 있는데 권한 검증(Authorization)은 주로 가드(Guards)를 사용하는 것이 더 좋죠.
인터셉터의 장점
공통적으로 사용되는 로직을 인터셉터로 분리함으로써, 여러 컨트롤러나 서비스 간에 코드를 재사용할 수 있고,
비즈니스 로직과는 별개의 관심사(로깅, 데이터 변환 등)를 인터셉터로 분리함으로써, 코드의 가독성과 유지보수성을 높일 수 있어요.
즉, 코드의 재사용성 측면과 가독성과 유지보수성을 높일 수 있다는 데 있죠.
인터셉터 사용 예시
그럼 이제 인터셉터를 어떻게 사용하는 지 살펴보죠.
메서드 실행 전후의 시간을 로깅 할 때
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> {
console.log('Before...');
const now = Date.now();
return next
.handle()
.pipe(
tap(() => console.log(`After... ${Date.now() - now}ms`))
);
}
}
LoggingInterceptor이 메서드 실행 전후의 시간을 로깅해주는데 이렇게 하면 요청 처리 시간을 모니터링할 수 있으며, 성능 최적화에 필요한 데이터를 제공받을 수 있어요.
응답 데이터 변환 인터셉터 예시
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class TransformResponseInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
map(data => ({
success: true,
data,
}))
);
}
}
이 예시에서는 인터셉터를 사용하여 서버에서 클라이언트로의 응답 데이터를 일정한 형식으로 변환해줍니다.
위와 같이 모든 응답을 { data: ... } 형태로 감싸고자 할 때 유용하게 사용할 수 있죠.
HTTP 핸들러가 반환하는 모든 응답에 success: true를 추가하고, 원래의 데이터는 data 필드 안에 넣어줍니다. 이 방법을 사용함으로써 클라이언트는 응답의 성공 여부를 쉽게 판단할 수 있으며, 응답 데이터의 구조를 일관되게 유지할 수 있죠.
인터셉터 사용 시 주의할 점
성능 저하
인터셉터 내에서 복잡한 로직을 처리하게 되면 성능 저하를 일으킬 수 있으므로, 가능한 한 가볍게 유지해야 합니다.
컨텍스트 인식
인터셉터는 다양한 컨텍스트(HTTP, WebSocket)에서 실행될 수 있어 특정 컨텍스트에만 종속적인 로직을 작성할 때는 주의가 필요합니다.
오류 처리
인터셉터에서 발생하는 오류는 애플리케이션 전체에 영향을 줄 수 있으므로, 오류 처리에 신중해야 합니다.
지금까지 NestJS의 인터셉터에 대해 알아보았습니다. 인터셉터는 NestJS 애플리케이션의 유연성과 재사용성을 크게 향상시킬 수 있는 강력한 도구이지만 위에서 언급한 주의사항을 고려하여 적절하게 사용하시면서 자신의 애플리케이션에 맞는 최적의 방법을 찾는 것이 가장 중요합니다.
'프로그래밍(Basic) > NestJS' 카테고리의 다른 글
[바미] NestJS - 예외 필터(Exception Filters) (0) | 2024.03.07 |
---|---|
[바미] NestJS - 가드(Guards) (0) | 2024.03.06 |
[바미] NestJS - 데코레이터(Custom decorators) (0) | 2024.03.02 |
[바미] NestJS를 사용하여 REST API 구현하기 (0) | 2024.03.01 |
[바미] Nest 모듈(Module) 이해하기 (0) | 2024.02.27 |