--- id: P-REINFORCE-AUTO-4808EA category: "10_Wiki/πŸ’‘ Topics/Software Engineering" confidence_score: 0.95 tags: [auto-reinforced] last_reinforced: 2026-05-03 github_commit: "[P-Reinforce] Continuous Worker - Middleware & Interceptors" --- # [[Middleware & Interceptors|Middleware & Interceptors]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) 미듀웨어(Middleware)와 인터셉터(Interceptor)λŠ” λ‘œκΉ…, 인증, 캐싱, μ˜ˆμ™Έ μ²˜λ¦¬μ™€ 같이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 κ³΅ν†΅μœΌλ‘œ μš”κ΅¬λ˜λŠ” νš‘λ‹¨ 관심사(Cross-Cutting Concerns)λ₯Ό μΊ‘μŠν™”ν•˜κ³  쀑앙 μ§‘μ€‘ν™”ν•˜λŠ” ꡬ쑰적 μ»΄ν¬λ„ŒνŠΈμ΄λ‹€ [1]. ν”„λ ˆμž„μ›Œν¬μ— 따라 μ²˜λ¦¬λ˜λŠ” 계측이 λ‹€λ₯΄λ©°, λ―Έλ“€μ›¨μ–΄λŠ” 주둜 μ„œλΈ”λ¦Ώμ΄λ‚˜ HTTP μš”μ²­/응닡 νŒŒμ΄ν”„λΌμΈ μ „λ°˜μ—μ„œ λ™μž‘ν•˜κ³ , 인터셉터와 AOPλŠ” ν”„λ ˆμž„μ›Œν¬μ˜ νŠΉμ • λͺ¨λΈμ΄λ‚˜ λ©”μ„œλ“œ μ‹€ν–‰ μ „ν›„μ—μ„œ μ„Έλ°€ν•œ 흐름 μ œμ–΄λ₯Ό μ œκ³΅ν•œλ‹€ [2-6]. 이λ₯Ό 톡해 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 μ˜€μ—Όμ„ λ°©μ§€ν•˜κ³  μ‹œμŠ€ν…œμ˜ μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν™•μž₯성을 높인닀 [1, 7]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **ν”„λ ˆμž„μ›Œν¬λ³„ νš‘λ‹¨ 관심사 처리 λ©”μ»€λ‹ˆμ¦˜ 뢄리** * **Spring Boot (닀측적 μ œμ–΄)**: μš”μ²­ 처리 νŒŒμ΄ν”„λΌμΈμ˜ κΉŠμ΄μ— 따라 μ„Έ κ°€μ§€ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•œλ‹€ [2, 8]. * **Filters (ν•„ν„°)**: μ„œλΈ”λ¦Ώ κ³„μΈ΅μ—μ„œ λ™μž‘ν•˜λ©° Spring MVC 도달 μ „ν›„μ˜ λͺ¨λ“  HTTP μš”μ²­(정적 λ¦¬μ†ŒμŠ€ 포함)을 κ°€λ‘œμ±„μ–΄ CORS, μ••μΆ•, 인증, μ „μ—­ λ‘œκΉ… 등을 μ²˜λ¦¬ν•œλ‹€ [3, 8]. * **Interceptors (인터셉터)**: Spring MVC κ³„μΈ΅μ—μ„œ 컨트둀러 μ‹€ν–‰ 전후에 μž‘λ™ν•˜μ—¬ μš”μ²­ μˆ˜μ •, μ§€ν‘œ μˆ˜μ§‘, κΆŒν•œ λΆ€μ—¬ 등을 μˆ˜ν–‰ν•œλ‹€ [4, 8]. * **AOP (관점 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°)**: ν”„λ ˆμž„μ›Œν¬ λ‚΄ μ–΄λ– ν•œ Spring Bean 객체의 λ©”μ„œλ“œ(컨트둀러, μ„œλΉ„μŠ€, 리포지토리)에 λŒ€ν•΄μ„œλ„ μ‹€ν–‰ μ „, ν›„, μ£Όλ³€(around)을 κ°€λ‘œμ±„μ–΄ λ‘œκΉ…, 캐싱, νŠΈλžœμž­μ…˜ 등을 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μˆ˜μ • 없이 μ²˜λ¦¬ν•œλ‹€ [5, 8]. * **Express.js 및 NestJS**: * **Express.js**: `req, res, next` ꡬ쑰λ₯Ό κ°€μ§„ λ‹¨μˆœν•˜κ³  μœ μ—°ν•œ 미듀웨어 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜μ§€λ§Œ, ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ 컀질수둝 μ•„ν‚€ν…μ²˜μ  일관성을 μœ μ§€ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 단점이 μžˆλ‹€ [9, 10]. * **NestJS**: Express 기반 μœ„μ— κ΅¬μΆ•λ˜μ–΄ κΈ°μ‘΄ 미듀웨어λ₯Ό 지원할 뿐만 μ•„λ‹ˆλΌ, Guard, Interceptor, Pipe, Middleware λ“± κ΅¬μ‘°ν™”λœ νŒŒμ΄ν”„λΌμΈμ„ λ„μž…ν–ˆλ‹€ [6, 11]. 특히 NestJS의 μΈν„°μ…‰ν„°λŠ” RxJS μŠ€νŠΈλ¦Όμ„ ν™œμš©ν•˜μ—¬ 비동기 흐름을 μœ μ—°ν•˜κ²Œ μ œμ–΄ν•  수 μžˆλ‹€ [6]. * **Django**: 미듀웨어와 λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹¨μˆœν•˜κ³  직관적인 쀑앙 집쀑식 흐름 μ œμ–΄λ₯Ό μ§€μ›ν•œλ‹€ [6]. κ·ΈλŸ¬λ‚˜ λͺ¨λΈμ˜ 생λͺ…μ£ΌκΈ° μ΄λ²€νŠΈμ— λ°˜μ‘ν•˜λŠ” Signals(μ‹œκ·Έλ„) λ˜ν•œ νš‘λ‹¨ 관심사 μ²˜λ¦¬μ— μ“°μ΄λŠ”λ°, μ΄λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œ μ§€μ–‘ν•΄μ•Ό ν•  νŒ¨ν„΄μœΌλ‘œ μ–ΈκΈ‰λœλ‹€ [12, 13]. * **클린 μ•„ν‚€ν…μ²˜ ν™˜κ²½μ˜ 적용** * MediatR 기반 νŒŒμ΄ν”„λΌμΈ 등을 ν™œμš©ν•˜μ—¬ λ‘œκΉ…, μœ νš¨μ„± 검사, 캐싱을 인프라 λ ˆμ΄μ–΄μ˜ νŒŒμ΄ν”„λΌμΈ λ™μž‘(Pipeline Behavior)으둜 κ΅¬ν˜„ν•¨μœΌλ‘œμ¨, 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 νš‘λ‹¨ 관심사λ₯Ό μ™„λ²½νžˆ λ””μ»€ν”Œλ§(Decoupling)ν•  수 μžˆλ‹€ [7, 14, 15]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) * **μΆ”μƒν™”λ‘œ μΈν•œ 디버깅 λ‚œμ΄λ„ 증가 ("Magic" Behavior)**: Spring Boot의 AOPλ‚˜ 일뢀 Aspect μ§€ν–₯ 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ λŸ°νƒ€μž„μ— λ‘œμ§μ„ μ‚½μž…ν•˜λŠ” 방식은 μ½”λ“œλ₯Ό κΉ”λ”ν•˜κ²Œ μœ μ§€ν•΄μ£Όμ§€λ§Œ, μ½”λ“œμƒμ— λͺ…μ‹œμ μΈ 호좜이 λ‚˜νƒ€λ‚˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šμ€ λ™μž‘μ΄ λ°œμƒν•  경우 좔적 및 디버깅을 맀우 μ–΄λ ΅κ²Œ λ§Œλ“ λ‹€ [16, 17]. * **μ„±λŠ₯ μ˜€λ²„ν—€λ“œ (Runtime Cost)**: Castle.DynamicProxy λ“±κ³Ό 같이 λŸ°νƒ€μž„μ— ν”„λ‘μ‹œ 래퍼(Proxy Wrapper)λ₯Ό μƒμ„±ν•˜μ—¬ λ©”μ„œλ“œ ν˜ΈμΆœμ„ κ°€λ‘œμ±„λŠ” 방식은 μ„±λŠ₯ μ €ν•˜ λΉ„μš©μ„ λ™λ°˜ν•  수 있으며, 극단적인 μ„±λŠ₯ μ΅œμ ν™”κ°€ ν•„μš”ν•œ ν™˜κ²½μ—μ„œλŠ” 뢀담이 될 수 μžˆλ‹€ [18]. * **Django Signals의 λΆ€μž‘μš© (Side Effects)**: νš‘λ‹¨ 관심사λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 이벀트λ₯Ό μ•”μ‹œμ μœΌλ‘œ μ‹€ν–‰μ‹œν‚€λŠ” Django의 μ‹œκ·Έλ„ νŒ¨ν„΄μ€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 혼재될 μœ„ν—˜μ΄ 크며, μ‹€ν–‰ 흐름을 뢈투λͺ…ν•˜κ²Œ λ§Œλ“€κ³  예츑 λΆˆκ°€λŠ₯ν•œ λΆ€μˆ˜ 효과λ₯Ό μ΄ˆλž˜ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±μ„ 크게 λ–¨μ–΄λœ¨λ¦°λ‹€ [12, 13]. λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œλŠ” 이λ₯Ό ν”Όν•˜κ³  λͺ…μ‹œμ μΈ μ„œλΉ„μŠ€ λ ˆμ΄μ–΄ ν˜ΈμΆœμ„ ꢌμž₯ν•œλ‹€ [13]. ## πŸ”— 지식 μ—°κ²° (Graph) ### Related Concepts #### [μ•„ν‚€ν…μ²˜/기반 기술] - [[Cross-Cutting Concerns]] - μ—°κ²° 이유: 미듀웨어와 인터셉터가 μ‹œμŠ€ν…œμ—μ„œ ꡬ쑰적으둜 λΆ„λ¦¬ν•˜μ—¬ ν•΄κ²°ν•˜κ³ μž ν•˜λŠ” 핡심 μš”κ΅¬μ‚¬ν•­μ΄μž 철학이닀 [1]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 외에 λ‘œκΉ…, 인증, μ—λŸ¬ 핸듀링 등을 μ‹œμŠ€ν…œ μ „μ—­μ—μ„œ μ–΄λ–»κ²Œ λͺ¨λ“ˆν™”ν• μ§€ 이해할 수 μžˆλ‹€. - [[AOP (Aspect-Oriented Programming)]] - μ—°κ²° 이유: Spring Boot λ“±μ—μ„œ λ©”μ„œλ“œ 레벨의 νš‘λ‹¨ 관심사λ₯Ό μ£Όμž…ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€ [5]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 객체 μ§€ν–₯ 섀계λ₯Ό λ„˜μ–΄ μ½”λ“œμ˜ μ‚°μž¬(Scattering)와 μ–½νž˜(Tangling)을 λ°©μ§€ν•˜λŠ” 원리λ₯Ό 배울 수 μžˆλ‹€. #### [κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[Spring Boot]] - μ—°κ²° 이유: Filter, Interceptor, AOPλΌλŠ” 각기 λ‹€λ₯Έ 깊이의 νš‘λ‹¨ 관심사 처리 νŒŒμ΄ν”„λΌμΈμ„ κ°€μž₯ λͺ…ν™•ν•˜κ²Œ κ΅¬ν˜„ 및 λΆ„λ₯˜ν•˜κ³  μžˆλŠ” λ°±μ—”λ“œ ν”„λ ˆμž„μ›Œν¬μ΄λ‹€ [2, 8]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ„œλΈ”λ¦Ώ μ˜μ—­κ³Ό ν”„λ ˆμž„μ›Œν¬ 컨트둀러, λ‚΄λΆ€ μ„œλΉ„μŠ€ 빈(Bean) 계측 κ°„μ˜ 물리적/논리적 λ™μž‘ 차이λ₯Ό νŒŒμ•…ν•  수 μžˆλ‹€. - [[NestJS]] - μ—°κ²° 이유: Express의 λ‹¨μˆœ 미듀웨어 ꡬ쑰의 ν•œκ³„λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ Guard, Interceptor, Pipe λ“±μ˜ ꡬ쑰적 νŒ¨ν„΄μ„ κ°•μ œν•œλ‹€ [6, 11]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: Node.js μƒνƒœκ³„μ—μ„œ μ—”ν„°ν”„λΌμ΄μ¦ˆ κΈ‰μ˜ νŒŒμ΄ν”„λΌμΈ μ•„ν‚€ν…μ²˜κ°€ μ–΄λ–»κ²Œ κ΅¬μΆ•λ˜λŠ”μ§€ ν•™μŠ΅ν•  수 μžˆλ‹€. - [[Django Signals]] - μ—°κ²° 이유: Djangoμ—μ„œ 이벀트 기반으둜 νš‘λ‹¨ 관심사λ₯Ό μ²˜λ¦¬ν•˜λŠ” μˆ˜λ‹¨μ΄λ‚˜ λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ•ˆν‹° νŒ¨ν„΄μœΌλ‘œ κΌ½νžŒλ‹€ [12, 13]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ•”μ‹œμ (Implicit) 둜직 싀행이 μ΄ˆλž˜ν•˜λŠ” 디버깅 λ¬Έμ œμ™€ λΆ€μˆ˜ 효과의 μœ„ν—˜μ„±μ„ 이해할 수 μžˆλ‹€. ### Deeper Research Questions - Spring Boot의 Filter, Interceptor, AOPλŠ” ꡬ체적으둜 μ–΄λ–€ 라이프사이클 μˆœμ„œλ‘œ μ‹€ν–‰λ˜λ©°, 각각이 λ°œμƒμ‹œν‚€λŠ” μ„±λŠ₯ μ˜€λ²„ν—€λ“œμ—λŠ” μ–΄λ–€ 차이가 μžˆλŠ”κ°€? - NestJS의 Interceptorμ—μ„œ RxJS μŠ€νŠΈλ¦Όμ„ ν™œμš©ν•  λ•Œ, 일반적인 Express λ―Έλ“€μ›¨μ–΄λ‚˜ Promise 기반 μ²˜λ¦¬μ™€ λΉ„κ΅ν•˜μ—¬ μ–΄λ–€ 비동기적 이점을 얻을 수 μžˆλŠ”κ°€? - 클린 μ•„ν‚€ν…μ²˜ ν™˜κ²½μ—μ„œ 미듀웨어(λ˜λŠ” Pipeline Behavior)κ°€ ν”„λ ˆμž„μ›Œν¬ 의쑴적인 'μž…λ ₯ μœ νš¨μ„± 검사'와 도메인 의쑴적인 'λΉ„μ¦ˆλ‹ˆμŠ€ λ£° μœ νš¨μ„± 검사'λ₯Ό μ–΄λ–»κ²Œ λΆ„λ¦¬ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ”κ°€? - λŸ°νƒ€μž„ ν”„λ‘μ‹œ 생성에 λ”°λ₯Έ μ„±λŠ₯ μ €ν•˜(Runtime cost)λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ 컴파일 νƒ€μž„(Compile-Time)μ΄λ‚˜ 링크 νƒ€μž„(Link-Time)에 AOPλ₯Ό μœ„λΉ™(Weaving)ν•˜λŠ” 기술적 μ›λ¦¬λŠ” 무엇인가? - λŒ€κ·œλͺ¨ Django ν”„λ‘œμ νŠΈμ—μ„œ μ‹œκ·Έλ„(Signals)의 λΆ€μˆ˜ 효과λ₯Ό ν”Όν•˜λ©΄μ„œλ„ 이벀트 기반의 νš‘λ‹¨ 관심사λ₯Ό λͺ…μ‹œμ μ΄κ³  μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν˜„λŒ€μ μΈ λŒ€μ•ˆ μ•„ν‚€ν…μ²˜λŠ” 무엇인가? ### Practical Application Contexts - **Implementation:** λΉ„μ¦ˆλ‹ˆμŠ€ 컨트둀러 νŒŒμΌλ§ˆλ‹€ 둜그 μž‘μ„± 및 토큰 검증 μ½”λ“œλ₯Ό λΆ™μ—¬λ„£λŠ” λŒ€μ‹ , 단일 미듀웨어, ν•„ν„° λ˜λŠ” 인터셉터 클래슀λ₯Ό μž‘μ„±ν•˜μ—¬ μ „μ—­μ μœΌλ‘œ ν˜Ήμ€ νŠΉμ • λΌμš°νŠΈμ—λ§Œ μ£Όμž…ν•˜λ„λ‘ κ΅¬ν˜„ν•œλ‹€. - **System Design:** μ•„ν‚€ν…μ²˜ 섀계 μ‹œ, λ‘œκΉ… 등은 μ΅œμ™Έκ³½ μ„œλΈ”λ¦Ώ ν•„ν„°λ‚˜ 미듀웨어에 λ°°μΉ˜ν•˜κ³ , μ‚¬μš©μž κΆŒν•œ λΆ€μ—¬λ‚˜ νŠΈλžœμž­μ…˜ κ΄€λ¦¬λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 μΈμ ‘ν•œ ν”„λ ˆμž„μ›Œν¬ 인터셉터 λ˜λŠ” AOP μ˜μ—­μ— κ³„μΈ΅μ μœΌλ‘œ λ°°μΉ˜ν•˜μ—¬ 응집도λ₯Ό 높인닀. - **Operation / Maintenance:** 쀑앙 μ§‘μ€‘ν™”λœ μ˜ˆμ™Έ 처리 및 λ‘œκΉ… 미듀웨어λ₯Ό κ΅¬μΆ•ν•¨μœΌλ‘œμ¨, ν”„λ‘œλ•μ…˜ 운영 쀑 μ—λŸ¬ λ°œμƒ μ‹œ 둜그 ν˜•μ‹μ„ μΌκ΄€λ˜κ²Œ μœ μ§€ν•˜κ³  μ‹œμŠ€ν…œ 이슈λ₯Ό λΉ λ₯΄κ²Œ 좔적/뢄석할 수 μžˆλ‹€. - **Learning Path:** λ‹¨μˆœν•œ ν•¨μˆ˜ ν˜•νƒœμΈ Express.js λ―Έλ“€μ›¨μ–΄μ˜ μž‘λ™ 원리λ₯Ό λ¨Όμ € ν•™μŠ΅ν•œ ν›„, 계측적 κΆŒν•œ 검사와 λ°˜ν™˜ κ°’ λ³€ν˜•μ„ μ²˜λ¦¬ν•˜λŠ” NestJS의 Guard 및 Interceptor둜 지식을 ν™•μž₯ν•΄ λ‚˜κ°„λ‹€. - **My Project Relevance:** ν˜„μž¬ μœ μ§€λ³΄μˆ˜ 쀑인 ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ λͺ¨λΈμ΄λ‚˜ 컨트둀러 내뢀에 캐싱, μ—λŸ¬ 좔적 μ½”λ“œκ°€ ν•˜λ“œμ½”λ”©λ˜μ–΄ μžˆλ‹€λ©΄, 이λ₯Ό λ³„λ„μ˜ 인터셉터/AOP 둜직으둜 μΆ”μΆœν•˜μ—¬ λ¦¬νŒ©ν† λ§ν•˜λŠ” μž‘μ—…μ˜ κ·Όκ±°κ°€ λœλ‹€. ### Adjacent Topics - [[Clean Architecture]] - ν™•μž₯ λ°©ν–₯: 인프라와 도메인을 μ™„λ²½νžˆ λΆ„λ¦¬ν•˜λ €λŠ” μ² ν•™ μ•ˆμ—μ„œ, 미듀웨어 λ ˆμ΄μ–΄κ°€ 기술 쒅속성을 μ–΄λ–»κ²Œ μ™ΈλΆ€λ‘œ λ°€μ–΄λ‚΄λŠ”μ§€ ν™•μž₯ν•˜μ—¬ νƒκ΅¬ν•œλ‹€. - [[Event-Driven Architecture]] - ν™•μž₯ λ°©ν–₯: νš‘λ‹¨ 관심사 둜직(특히 λ‘œκΉ…, μ•Œλ¦Ό λ“±)을 λ―Έλ“€μ›¨μ–΄μ˜ 동기적 νŒŒμ΄ν”„λΌμΈμ—μ„œ λ²—μ–΄λ‚˜ λ©”μ‹œμ§€ 큐 등을 ν™œμš©ν•œ 비동기 이벀트 λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μ•„ν‚€ν…μ²˜λ‘œ 지식을 ν™•μž₯ν•œλ‹€. --- *Last updated: 2026-05-03* --- *Last updated: 2026-05-03* - Raw Source: 00_Raw/2026-05-03/Middleware & Interceptors.md ---