Interceptors
Last updated
Was this helpful?
Last updated
Was this helpful?
μΈν°μ
ν°λ @Injectable()
λ°μ½λ μ΄ν°λ‘ μ£Όμμ΄ λ¬λ¦° ν΄λμ€μ
λλ€. μΈν°μ
ν°λ NestInterceptor
μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ ν©λλ€.
μΈν°μ ν°μλ Aspect Oriented Programming (AOP) κΈ°μ μμ μκ°μ μ»μ μ μ©ν κΈ°λ₯ μΈνΈκ° μμ΅λλ€. κ·Έλ€μ λ€μμ κ°λ₯νκ² ν©λλ€.
λ©μλ μ€ν μ /νμ μΆκ° λ‘μ§ λ°μΈλ©
ν¨μμμ λ°ν λ κ²°κ³Όλ₯Ό λ³ν
ν¨μμμ λ°μ λ μμΈλ₯Ό λ³ν
κΈ°λ³Έ κΈ°λ₯ νμ₯
νΉμ 쑰건μ λ°λΌ κΈ°λ₯μ μμ ν μ¬μ μ (μ : μΊμ± λͺ©μ )
κ° μΈν°μ
ν°λ λ κ°μ μΈμλ₯Όλ°λ intercept()
λ©μλλ₯Ό ꡬνν©λλ€. 첫 λ²μ§Έλ ExecutionContext
μΈμ€ν΄μ€μ
λλ€ (guardsμ μ νν κ°μ κ°μ²΄). ExecutionContext
λ ArgumentsHost
μμ μμλ°μ΅λλ€. μμΈ νν° μ±ν°μμ μμ ArgumentsHost
λ₯Ό 보μμ΅λλ€. μ¬κΈ°μ μ°λ¦¬λ μλ νΈλ€λ¬λ‘ μ λ¬λ μΈμλ₯Ό κ°μΈλ λνΌμ΄λ©° μμ© νλ‘κ·Έλ¨μ μ νμ λ°λΌ λ€λ₯Έ μΈμ λ°°μ΄μ ν¬ν¨νλ€λ κ²μ μμμ΅λλ€. μ΄ μ£Όμ μ λν μμΈν λ΄μ©μ μμΈ νν°λ₯Ό λ€μ μ°Έμ‘°νμμμ€.
ExecutionContext
λ ArgumentsHost
λ₯Ό νμ₯νμ¬ νμ¬ μ€ν νλ‘μΈμ€μ λν μΆκ° μ 보λ₯Ό μ 곡ν©λλ€. κ·Έ λͺ¨μ΅μ λ€μκ³Ό κ°μ΅λλ€.
getHandler()
λ©μλλ νΈμΆλ κ²½λ‘ νΈλ€λ¬μ λν μ°Έμ‘°λ₯Ό 리ν΄ν©λλ€. getClass()
λ©μλλ μ΄ νΉμ νΈλ€λ¬κ° μνλ Controller
ν΄λμ€μ μ νμ 리ν΄ν©λλ€. μλ₯Ό λ€μ΄, νμ¬ μ²λ¦¬ λ μμ²μ΄ CatsController
μcreate()
λ©μλλ‘ μμ λ POST
μμ²μΈ κ²½μ°, getHandler()
λ create()
λ©μλμ λν μ°Έμ‘°λ₯Ό 리ν΄νκ³ getClass()
λ CatsController
type (μΈμ€ν΄μ€ μλ)μ λ°νν©λλ€.
λ λ²μ§Έ μΈμλ CallHandler
μ
λλ€. CallHandler
μΈν°νμ΄μ€λ handle()
λ©μλλ₯Ό ꡬννλλ°, μΈν°μ
ν°μ μ΄λ μμ μμ κ²½λ‘ νΈλ€λ¬ λ©μλλ₯Ό νΈμΆνλ λ° μ¬μ©ν μ μμ΅λλ€. intercept()
λ©μλ ꡬνμμ handle()
λ©μλλ₯Ό νΈμΆνμ§ μμΌλ©΄ λΌμ°νΈ νΈλ€λ¬ λ©μλκ° μ ν μ€νλμ§ μμ΅λλ€.
μ΄ μ κ·Όλ²μ intercept()
λ©μλκ° ν¨κ³Όμ μΌλ‘ μμ²/μλ΅ μ€νΈλ¦Όμ λ©ννλ€λ κ²μ μλ―Έν©λλ€. κ²°κ³Όμ μΌλ‘ μ΅μ’
λΌμ°νΈ νΈλ€λ¬ μ€ν μ νμ 컀μ€ν
λ‘μ§μ ꡬνν μ μμ΅λλ€. handle()
μ νΈμΆνκΈ° μ μ μ€νλλ intercept()
λ©μλμ μ½λλ₯Ό μμ±ν μ μλ€λ κ²μ΄ λΆλͺ
νμ§λ§, λμ€μ μ΄λ»κ² λλμ§μ μ΄λ€ μν₯μ λ―ΈμΉ©λκΉ? handle()
λ©μλλ Observable
μ 리ν΄νλ―λ‘, κ°λ ₯ν RxJS μ°μ°μλ₯Ό μ¬μ©νμ¬ μλ΅μ μΆκ°λ‘ μ‘°μ ν μ μμ΅λλ€. Aspect Oriented Programming μ©μ΄λ₯Ό μ¬μ©νμ¬ λΌμ°νΈ νΈλ€λ¬μ νΈμΆ (μ¦, handle()
νΈμΆ)μ Pointcutμ΄λΌκ³ ν©λλ€. μΆκ° λ‘μ§μ΄ μ½μ
λ©λλ€.
μλ₯Ό λ€μ΄, λ€μ΄μ€λPOST/cats
μμ²μ κ³ λ €νμμμ€. μ΄ μμ²μ CatsController
μμ μ μλ create()
νΈλ€λ¬λ₯Ό λμμΌλ‘ν©λλ€. handle()
λ©μλλ₯Ό νΈμΆνμ§ μλ μΈν°μ
ν°κ° λμ€μ νΈμΆλλ©΄ create()
λ©μλκ° μ€νλμ§ μμ΅λλ€. handle()
μ΄ νΈμΆλκ³ (κ·Έλ¦¬κ³ κ·Έκ²μ Observable
μ΄ λ¦¬ν΄λλ©΄) create()
νΈλ€λ¬κ° νΈλ¦¬κ±°λ©λλ€. μλ΅ μ€νΈλ¦Όμ΄ Observable
μ ν΅ν΄ μμ λλ©΄ μΆκ° μμ
μ μ€νΈλ¦Όμμ μνν μ μμΌλ©° μ΅μ’
κ²°κ³Όλ νΈμΆμμκ² λ°νλ©λλ€.
μ°λ¦¬κ° μ΄ν΄λ³Ό 첫λ²μ§Έ μ¬μ© μ¬λ‘λ μΈν°μ
ν°λ₯Ό μ¬μ©νμ¬ μ¬μ©μ μνΈ μμ©μ κΈ°λ‘νλ κ²μ
λλ€ (μ: μ¬μ©μ νΈμΆ μ μ₯, λΉλκΈ° μ μΌλ‘ μ΄λ²€νΈ λμ€ν¨μΉ λλ νμ μ€ν¬ν κ³μ°). μ°λ¦¬λ μλμ κ°λ¨ν LoggingInterceptor
λ₯Ό 보μ¬μ€λλ€:
info ννΈ
NestInterceptor<T,R>
λT
κ°Observable<T>
(μλ΅ μ€νΈλ¦Όμ μ§μ)μ μ νμ λνλ΄κ³R
μObservable<R>
μ μν΄ λ©νλ κ°μ μ νμΈ μΌλ° μΈν°νμ΄μ€μ λλ€.warning μλ¦Ό 컨νΈλ‘€λ¬, νλ‘ λ°μ΄λ, κ°λ λ±κ³Ό κ°μ μΈν°μ ν°λ
μμ±μ
λ₯Ό ν΅ν΄ μ’ μμ±μ μ£Όμ ν μ μμ΅λλ€.
handle()
μ RxJS Observable
μ λ°ννλ―λ‘ μ€νΈλ¦Όμ μ‘°μνλ λ° μ¬μ©ν μ μλ μ°μ°μλ₯Ό λ€μνκ² μ νν μ μμ΅λλ€. μμ μμ μμ μ°λ¦¬λ tap()
μ°μ°μλ₯Ό μ¬μ©νλλ°, μ΄λ κ΄μ°° κ°λ₯ μ€νΈλ¦Όμ΄ μ μμ μΌλ‘ μ’
λ£λκ±°λ μμΈμ μΌλ‘ μ’
λ£λ λ μ΅λͺ
λ‘κΉ
κΈ°λ₯μ νΈμΆνμ§λ§ μλ΅μ£ΌκΈ°λ₯Ό λ°©ν΄νμ§λ μμ΅λλ€.
μΈν°μ
ν°λ₯Ό μ€μ νκΈ° μν΄ @nestjs/common
ν¨ν€μ§μμ κ°μ Έμ¨ @UseInterceptors()
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©ν©λλ€. pipes λ° guardsμ κ°μ΄ μΈν°μ
ν°λ 컨νΈλ‘€λ¬ λ²μ, λ°©λ² λ²μ λλ μ μ λ²μ μΌ μ μμ΅λλ€.
info ννΈ
@UseInterceptors()
λ°μ½λ μ΄ν°λ@nestjs/common
ν¨ν€μ§μμ κ°μ Έμ΅λλ€.
μμ ꡬμ±μ μ¬μ©νμ¬ CatsController
μ μ μλ κ° κ²½λ‘ νΈλ€λ¬λ LoggingInterceptor
λ₯Ό μ¬μ©ν©λλ€. λκ΅°κ° GET /cats
μλ ν¬μΈνΈλ₯Ό νΈμΆνλ©΄ νμ€ μΆλ ₯μ λ€μ μΆλ ₯μ΄ νμλ©λλ€.
μΈμ€ν΄μ€ λμ LoggingInterceptor
μ νμ μ λ¬νμ¬ νλ μ μν¬μ μΈμ€ν΄μ€νμ μ’
μμ± μ£Όμ
μ κ°λ₯νκ² ν©λλ€. νμ΄ν, κ°λ λ° μμΈ νν°μ λ§μ°¬κ°μ§λ‘ λ΄λΆ μΈμ€ν΄μ€λ μ λ¬ν μ μμ΅λλ€.
μΈκΈν λ°μ κ°μ΄, μμ ꡬμ±μ μΈν°μ ν°λ₯Όμ΄ 컨νΈλ‘€λ¬κ° μ μΈν λͺ¨λ νΈλ€λ¬μ μ°κ²°ν©λλ€. μΈν°μ ν°μ λ²μλ₯Ό λ¨μΌ λ°©λ²μΌλ‘ μ ννλ €λ©΄ λ©μλ μμ€μμ λ°μ½λ μ΄ν°λ₯Ό μ μ©νλ©΄λ©λλ€.
μ μ μΈν°μ
ν°λ₯Ό μ€μ νκΈ° μν΄ Nest μ ν리μΌμ΄μ
μΈμ€ν΄μ€μ useGlobalInterceptors()
λ©μλλ₯Ό μ¬μ©ν©λλ€.
μ μ μΈν°μ
ν°λ λͺ¨λ 컨νΈλ‘€λ¬μ λͺ¨λ κ²½λ‘ νΈλ€λ¬μ λν΄ μ 체 μ ν리μΌμ΄μ
μμ μ¬μ©λ©λλ€. μμ‘΄μ± μ£Όμ
μ κ΄μ μμ, λͺ¨λ μΈλΆμμ λ±λ‘λ μ μ μΈν°μ
ν° (μμ μμμμ κ°μ΄ useGlobalInterceptors()
λ‘)λ μμ‘΄μ±μ΄ μ£Όμ
λ μ μμ΅λλ€. μ΄λ λͺ¨λμ 컨ν
μ€νΈ μΈλΆμμ μνλκΈ° λλ¬Έμ
λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ€μ ꡬμ±μ μ¬μ©νμ¬ λͺ¨λ λͺ¨λμμ μ§μ μΈν°μ
ν°λ₯Ό μ€μ ν μ μμ΅λλ€.
info ννΈ μΈν°μ ν°μ λν μμ‘΄μ± μ£Όμ μ μννκΈ° μν΄μ΄ μ κ·Όλ²μ μ¬μ©ν λ, μ΄ κ΅¬μ±μ΄ μ¬μ©λλ λͺ¨λμ κ΄κ³μμ΄, μΈν°μ ν°λ μ€μ λ‘λ μ μμ μ λλ€. μ΄λμμ ν΄μΌ ν©λκΉ? μΈν°μ ν° (μ μμμ
LoggingInterceptor
)κ° μ μλ λͺ¨λμ μ ννμμμ€. λν 컀μ€ν νλ‘ λ°μ΄λ λ±λ‘μ λ€λ£¨λ μ μΌν λ°©λ²μuseClass
κ° μλλλ€. μ¬κΈ°μ λν΄ μμΈν μμ보μμμ€.
μ°λ¦¬λ handle()
μ΄ Observable
μ λ°ννλ€λ κ²μ μ΄λ―Έ μκ³ μμ΅λλ€. μ΄ μ€νΈλ¦Όμλ κ²½λ‘ μ²λ¦¬κΈ°μ λ°ν κ°μ΄ ν¬ν¨λμ΄ μμΌλ―λ‘ RxJSμ map()
μ°μ°μλ₯Ό μ¬μ©νμ¬ μ½κ² λ³κ²½ν μ μμ΅λλ€.
warning κ²½κ³ μλ΅ λ§€ν κΈ°λ₯μ λΌμ΄λΈλ¬λ¦¬ λ³ μλ΅ μ λ΅μμ μλνμ§ μμ΅λλ€ (
@Res()
κ°μ²΄λ₯Ό μ§μ μ¬μ©νλ κ²μ κΈμ§λ¨).
νλ‘μΈμ€λ₯Ό μμ°νκΈ° μν΄ μ¬μν λ°©μμΌλ‘ κ° μλ΅μ μμ νλ TransformInterceptor
λ₯Ό λ§λ€μ΄ λ΄
μλ€. RxJSμ map()
μ°μ°μλ₯Ό μ¬μ©νμ¬ μλ΅ κ°μ²΄λ₯Ό μλ‘ μμ±λ κ°μ²΄μ data
μμ±μ ν λΉνμ¬ μ κ°μ²΄λ₯Ό ν΄λΌμ΄μΈνΈμ λ°νν©λλ€.
info ννΈ Nest μΈν°μ ν°λ λκΈ° λ° λΉλκΈ°
intercept()
λ©μλμ ν¨κ» μλν©λλ€. νμν κ²½μ° λ¨μν λ©μλλ₯ΌλΉλκΈ°
λ‘ μ ν ν μ μμ΅λλ€.
μμ ꡬμ±μμ λκ΅°κ°κ° GET /cats
μλ ν¬μΈνΈλ₯Ό νΈμΆνλ©΄ μλ΅μ λ€μκ³Ό κ°μ΅λλ€ (λΌμ°νΈ νΈλ€λ¬κ° λΉ λ°°μ΄[]
μ 리ν΄νλ€κ³ κ°μ ).
μΈν°μ
ν°λ μ 체 μ ν리μΌμ΄μ
μμ λ°μνλ μꡬ μ¬νμ λν μ¬μ¬μ© κ°λ₯ν μ루μ
μ μμ±νλ λ° ν° κ°μΉκ° μμ΅λλ€. μλ₯Ό λ€μ΄, κ°κ°μ null
κ°μ λΉ λ¬Έμμ΄ ''
λ‘ λ³νν΄μΌ νλ€κ³ μμν΄λ³΄μμμ€. ν μ€μ μ½λλ₯Ό μ¬μ©νμ¬ μΈν°μ
ν°λ₯Ό μ μμ μΌλ‘ λ°μΈλ©νμ¬ λ±λ‘λ κ° νΈλ€λ¬μμ μλμΌλ‘ μ¬μ©ν μ μμ΅λλ€.
λ λ€λ₯Έ ν₯λ―Έλ‘μ΄ μ¬μ© μ¬λ‘λ RxJS μcatchError()
μ°μ°μλ₯Ό μ¬μ©νμ¬ λ°μλ μμΈλ₯Ό 무μνλ κ²μ
λλ€.
νΈλ€λ¬ νΈμΆμ μμ ν λ§κ³ λμ λ€λ₯Έ κ°μ λ°ννλ €λ λͺκ°μ§ μ΄μ κ° μμ΅λλ€. λͺ λ°±ν μλ μλ΅ μκ°μ κ°μ νκΈ° μν΄ μΊμλ₯Ό ꡬννλ κ²μ λλ€. μΊμμμ μλ΅μ λ°ννλ κ°λ¨ν μΊμ μΈν°μ ν°λ₯Ό μ΄ν΄ λ³΄κ² μ΅λλ€. μ€μ μμμ μ°λ¦¬λ TTL, μΊμ 무ν¨ν, μΊμ ν¬κΈ° λ±κ³Ό κ°μ λ€λ₯Έ μμλ₯Ό κ³ λ €νκ³ μΆμ§λ§ μ΄ λ Όμμ λ²μλ₯Ό λ²μ΄λ©λλ€. μ¬κΈ°μμλ κΈ°λ³Έ κ°λ μ 보μ¬μ£Όλ κΈ°λ³Έ μμ λ₯Ό μ 곡ν©λλ€.
μ°λ¦¬μ CacheInterceptor
λ νλ μ½λ©λ isCached
λ³μμ νλ μ½λ©λ μλ΅ []
μ κ°μ§κ³ μμ΅λλ€. μ¬κΈ°μ μ£Όλͺ©ν μ μ RxJS of()
μ°μ°μμ μν΄ μμ±λ μλ‘μ΄ μ€νΈλ¦Όμ λ°ννλ―λ‘ κ²½λ‘ νΈλ€λ¬λ μ ν νΈμΆλμ§ μμ΅λλ€. λκ΅°κ° CacheInterceptor
λ₯Ό μ¬μ©νλ μλ ν¬μΈνΈλ₯Ό νΈμΆνλ©΄ μλ΅ (νλ μ½λ©λ λΉ λ°°μ΄)μ΄ μ¦μ 리ν΄λ©λλ€. μΌλ°μ μΈ μ루μ
μ λ§λ€κΈ° μν΄ Reflector
λ₯Ό νμ©νκ³ μ¬μ©μ μ μ λ°μ½λ μ΄ν°λ₯Ό λ§λ€ μ μμ΅λλ€. Reflector
λ guards μ±ν°μ μ μ€λͺ
λμ΄ μμ΅λλ€.
RxJS μ°μ°μλ₯Ό μ¬μ©νμ¬ μ€νΈλ¦Όμ μ‘°μν μ μμΌλ―λ‘ λ§μ κΈ°λ₯μ΄ μ 곡λ©λλ€. λ€λ₯Έ μΌλ°μ μΈ μ¬μ© μ¬λ‘λ₯Ό κ³ λ €ν΄ λ΄ μλ€. κ²½λ‘ μμ²μμ μκ° μ΄κ³Όλ₯Ό μ²λ¦¬νλ€κ³ κ°μ ν΄ λ³΄μμμ€. μΌμ μκ° νμ μλ ν¬μΈνΈκ° μ무κ²λ 리ν΄νμ§ μμΌλ©΄ μ€λ₯ μλ΅μΌλ‘ μ’ λ£νλ €κ³ ν©λλ€. λ€μκ³Ό κ°μ ꡬμ±μΌλ‘ κ°λ₯ν©λλ€.
5 μ΄ νμ μμ² μ²λ¦¬κ° μ·¨μλ©λλ€.