요청이 컨트롤러에 도달하기까지 — Guard, Interceptor, Pipe, Filter (5편)
NestJS에서 HTTP 요청 하나가 컨트롤러 메서드에 도달하기까지 거치는 6단계를 소스코드로 추적합니다. Middleware, Guard, Interceptor, Pipe, ExceptionFilter — 각 레이어가 왜 존재하고 어떤 순서로 실행되는지 RouterExecutionContext 소스를 통해 확인합니다.
NestJS에서 HTTP 요청 하나가 컨트롤러 메서드에 도달하기까지 거치는 6단계를 소스코드로 추적합니다. Middleware, Guard, Interceptor, Pipe, ExceptionFilter — 각 레이어가 왜 존재하고 어떤 순서로 실행되는지 RouterExecutionContext 소스를 통해 확인합니다.
NestJS 앱은 하나의 거대한 provider 목록이 아니라, @Module()로 나뉜 여러 모듈의 조합입니다. @Module() 데코레이터가 메타데이터를 저장하고, DependenciesScanner가 모듈 그래프를 구축하는 전 과정을 소스코드에서 추적합니다.
@Injectable()이 메타데이터를 저장하는 것과 실제로 인스턴스를 생성해서 주입하는 것은 다른 문제입니다. NestContainer, InstanceLoader, Injector — 세 클래스가 협력하여 의존성을 해결하는 과정을 NestJS 소스코드에서 직접 추적합니다.
@Injectable() 하나 붙이면 DI가 된다는 건 알지만, 이 데코레이터가 정확히 무슨 일을 하는 걸까요? NestJS 소스코드와 TypeScript 컴파일러 출력을 직접 추적하며, 데코레이터가 '실행'이 아니라 '등록'이라는 사실을 확인합니다.
NestJS로 서버를 만들 때마다 실행하는 NestFactory.create(AppModule) 한 줄. 이 한 줄이 내부에서 DI 컨테이너 생성, 모듈 스캔, 인스턴스 로딩, Express 바인딩까지 5단계를 거친다는 사실을 NestJS 소스코드를 직접 추적하며 확인합니다.
영상 파일에서 텍스트를 추출하는 로컬 STT 파이프라인을 구축한 경험입니다. ffmpeg가 오디오를 왜 16kHz 모노 PCM으로 변환하는지, whisper-cpp가 Python 없이 어떻게 동작하는지, VAD가 STT 품질을 어떻게 개선하는지 하나씩 따라가봅니다.
PHP-FPM의 멀티프로세스 모델과 Node.js의 싱글스레드 이벤트루프는 요청을 완전히 다른 방식으로 처리합니다. 5년간 PHP로 결제 시스템을 개발하고 Node.js로 전환한 경험을 바탕으로, 두 런타임의 동작원리와 구조적 차이를 정리했습니다.
Redis를 캐시로만 쓰다가 면접에서 "싱글 스레드인데 왜 빠른가?"라는 질문에 막힌 경험이 있습니다. 싱글 스레드 모델, 자료구조별 시간복잡도, RDB/AOF 영속성, 메모리 관리, Sentinel과 Cluster까지 — Redis 내부 원리를 한 글에 정리했습니다.
이커머스 플랫폼에서 대량 주문 취소를 처리하며 Redis를 메시지 브로커(Bull Queue)와 분산 락(RedLock)으로 활용한 경험입니다. concurrency 설정, 중복 방지, 실패 처리, Redis 장애 대응까지 — 실전에서 배운 것들을 정리했습니다.