NestJS 환경에 맞는 Custom Decorator 만들기
송현지 · 토스 · 토스 기술 블로그
소개
NestJS에서 데코레이터를 만들기 위해서는 NestJS의 DI와 메타 프로그래밍 환경 등을 고려해야 합니다. 어떻게 하면 이러한 NestJS 환경에 맞는 데코레이터를 만들 수 있을지 고민해보았습니다.
AI 핵심 요약
메서드 데코레이터 안에서 NestJS Provider에 접근하기 어렵고, 메서드를 덮어쓰는 일반 데코레이터가 NestJS 메타데이터를 끊을 수 있다는 문제가 출발점입니다. 글에서는 SetMetadata로 클래스와 메서드에 표식을 남긴 뒤 DiscoveryService와 MetadataScanner로 대상을 찾아 모듈 초기화 시점에 처리하는 방식을 설명하고, 이를 반복 가능한 AOP 구조로 정리한 @toss/nestjs-aop의 설계를 소개합니다. 또한 데코레이터 실행 순서 때문에 Cron 같은 메타데이터 기반 기능이 깨질 수 있음을 보이고, 래퍼 함수의 프로토타입을 원본 메서드에 연결해 메타데이터를 유지하는 방법을 제시합니다. NestJS에서는 DI와 메타데이터 수명·프로토타입을 함께 고려해 데코레이터를 설계해야 한다는 점이 핵심입니다.
- 데코레이터에서 NestJS Provider를 사용해야 한다면 메서드 실행 시점에 직접 주입을 기대하기보다, 메타데이터로 대상을 표시하고 모듈 초기화 단계에서 인스턴스를 찾아 처리할 수 있습니다.
- DiscoveryService로 Provider를 조회하고 MetadataScanner로 메서드를 순회하면 특정 메타데이터가 붙은 메서드만 골라낼 수 있습니다.
- 메서드 데코레이터는 아래에서 위 순서로 실행되므로, 메서드를 교체하는 데코레이터가 NestJS의 메타데이터를 잃게 만들 수 있습니다.
- 래퍼 함수의 프로토타입을 원본 메서드에 연결하면 원본 메서드에 등록된 메타데이터를 조회할 수 있습니다.
비슷한 학습 자료
토스ㅣSLASH 24 - 웹뷰로 시작되는 Nest.js 프레임워크로 똑똑하게 서류 스크래핑하기
SLASH · YouTube
쓰기 쉬운 Toss Front SDK
이주함 · 토스 기술 블로그
자료구조를 활용한 복잡한 프론트엔드 컴포넌트 제작하기
박건영 · 토스 기술 블로그
Next.js 그만 쓰세요! 면접관이 진짜 원하는 것!? | EP.8 모닥불
토스 프론트엔드 챕터 · 토스 기술 블로그
환경 고민없이 개발하기
김동현 · 토스 기술 블로그
토스 프론트엔드 챕터를 소개합니다!
박서진 · 토스 기술 블로그