Nest.js는 현대적인 서버 사이드 애플리케이션을 구축하기 위해 설계된 강력한 프레임워크로, 다양한 아키텍처 패턴을 통해 개발자에게 유연성과 효율성을 제공합니다. 그 중 하나가 바로 인터셉터입니다. 인터셉터는 클라이언트의 요청과 서버의 응답 사이에서 동작하여, 특정 작업을 수행하거나 데이터를 변형하는 데 사용되는 중요한 기능입니다. 이번 포스트에서는 인터셉터의 개념, 기본 구조, 적용 방법, 그리고 실용적인 예제에 대해 자세히 알아보겠습니다.
인터셉터란 무엇인가?
인터셉터는 클라이언트의 요청이 컨트롤러에 도달하기 전에 또는 응답이 클라이언트에게 전달되기 전에 실행되는 기능으로, 다양한 상황에서 유용하게 활용될 수 있습니다. 인터셉터의 주요 기능은 다음과 같습니다:
- 로깅: 모든 요청이나 응답에 대한 정보를 기록하여 시스템의 동작을 모니터링하고 문제를 진단하는 데 도움을 줍니다.
- 변환: 데이터 형식을 변경하거나 추가적인 처리를 수행하여 클라이언트가 필요로 하는 정확한 형태의 데이터를 제공합니다.
- 보안 검사: 인증 및 권한 부여 관련 검사를 수행하여 애플리케이션의 안전성을 높입니다.
- 예외 처리: 발생할 수 있는 예외를 미리 잡아내어 적절히 처리함으로써 사용자 경험을 개선합니다.
기본 구조
Nest.js에서는 인터셉터를 클래스로 정의하고 @Injectable()
데코레이터와 함께 사용할 수 있습니다. 기본적으로 NestInterceptor
를 구현하며, intercept()
메서드를 오버라이드해야 합니다. 아래는 간단한 로깅 인터셉터의 예제입니다.
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();
console.log(`Request... ${request.method} ${request.url}`);
return next.handle().pipe(
tap(() => console.log(`Response...`)),
);
}
}
위 코드에서는 요청이 들어올 때 HTTP 메소드와 URL을 로그로 출력하고, 응답이 반환될 때도 로그를 남기는 간단한 로깅 인터셉터를 구현하였습니다. 이와 같은 방식으로 다양한 기능을 가진 인터셉터를 만들어 애플리케이션의 요구에 맞게 조정할 수 있습니다.
적용 방법
인터셉터는 글로벌하게 또는 개별적으로 적용할 수 있는 유연성을 제공합니다.
1. 글로벌 등록
애플리케이션 전체에 인터셉터를 적용하려면 main.ts
파일에서 설정할 수 있습니다. 이 방법은 모든 요청에 대해 동일한 로깅 또는 처리 로직을 적용하고자 할 때 유용합니다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggingInterceptor } from './logging.interceptor';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new LoggingInterceptor());
await app.listen(3000);
}
bootstrap();
2. 컨트롤러나 핸들러 수준 등록
특정 컨트롤러 또는 핸들러에만 인터셉터를 적용하려면 해당 클래스나 메서드 위에 @UseInterceptors()
데코레이터를 사용할 수 있습니다. 이 방법은 특정 기능이 필요한 경우에 유용하게 활용될 수 있습니다.
import { Controller, Get, UseInterceptors } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
@UseInterceptors(LoggingInterceptor)
findAll() {
return ['cat1', 'cat2'];
}
}
실용적인 예제
실제로 웹 애플리케이션에서 API 호출 시 사용자 활동을 추적하는 것은 매우 중요합니다. 이를 위해 로깅 인터셉터를 구현하면 각 사용자 행동(예: 로그인 시도)이나 오류 발생 시점을 쉽게 기록할 수 있어 문제 해결 및 성능 모니터링에 큰 도움이 됩니다. 또한, 데이터 변환 목적으로도 활용될 수 있는데, 예를 들어 API가 항상 일정한 형태의 데이터를 반환하도록 하기 위해 응답 데이터를 조정하는 방식으로 사용될 수 있습니다. 이러한 기능은 클라이언트와 서버 간의 데이터 일관성을 유지하는 데 기여합니다.
결론
인터셉터는 Nest.js 아키텍처 내에서 중요한 역할을 하며, 여러 가지 유용한 기능들을 제공해 줍니다. 이를 통해 우리는 더 나은 유지 관리성과 확장성을 가진 애플리케이션을 만들 수 있으며, 개발 과정에서도 효율성을 높일 수 있습니다. 인터셉터를 적절히 활용함으로써, 애플리케이션의 품질을 높이고, 사용자 경험을 개선하는 데 기여할 수 있습니다.
'프로그래밍 > Nest.js' 카테고리의 다른 글
Nest.js 컨트롤러: 웹 애플리케이션의 중추적 역할 (0) | 2025.03.17 |
---|---|
마이크로서비스 아키텍처와 Nest.js: 현대 소프트웨어 개발의 혁신 (0) | 2025.03.17 |
실시간 채팅 애플리케이션 구현: Nest.js로 쉽게 시작하기 (0) | 2025.03.17 |
Nest.js: 현대 애플리케이션 개발을 위한 최적의 선택 (0) | 2025.03.17 |
첫 번째 Nest.js 애플리케이션 만들기: 프로젝트 생성 (0) | 2025.03.16 |