πŸ€” κ°€λ“œ(Guards)와 인터셉터(Interceptors)의 μ°¨μ΄λŠ”?

Daehyeon YunΒ·2024λ…„ 8μ›” 7일

NestJS 의 κ°€λ“œμ™€ 인터셉터에 λŒ€ν•΄ κ³΅λΆ€ν•˜λ˜ 쀑 문뜩 μ–΄λ–€ 생각이 λ“€μ—ˆλ‹€.

κ°€λ“œμ™€ 인터셉터 λͺ¨λ‘ NestJSμ—μ„œ μš”μ²­κ³Ό 응닡을 μ²˜λ¦¬ν•˜κΈ° 전에 μ‹€ν–‰λ˜λŠ”, 마치 미듀웨어가 μ•„λ‹Œκ°€? λ‘˜ λ‹€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ 쀑간에 κ°€λ‘œμ±Œ 수 μžˆμœΌλ‹ˆ λ™μΌν•œ κ°œλ… μ•„λ‹Œκ°€?

μ΄λŸ¬ν•œ μ΄μœ κ°€ κΆκΈˆν•΄ GPT μ„ μƒλ‹˜κ³Ό ꡬ글링을 μ—΄μ‹¬νžˆ μ§„ν–‰ν•΄ κ°€λ“œμ™€ μΈν„°μ…‰ν„°μ˜ 차이점을 μ •λ¦¬ν•˜μ˜€λ‹€.


πŸ˜²Β κ°€λ“œ(Guards)와 인터셉터(Interceptors)의 λͺ©μ κ³Ό κΈ°λŠ₯은 μ—„μ—°νžˆ λ‹€λ₯΄λ‹€!

κ°€λ“œ(Guards) 와 인터셉터(Interceptors) λŠ” NestJS μ—μ„œ μš”μ²­κ³Ό 응닡 을 μ²˜λ¦¬ν•˜κΈ° 전에 μ‹€ν–‰λ˜λŠ” 미듀웨어 와 같은 역할을 μˆ˜ν–‰ν•˜μ§€λ§Œ, 이 λ‘˜μ˜ λͺ©μ κ³Ό κΈ°λŠ₯은 λ‹€λ₯΄λ‹€. λ‘˜ λ‹€ λͺ¨λ‘ μš”μ²­μ„ κ°€λ‘œμ±Œ 수 μžˆλ‹€ λŠ” 곡톡점은 μžˆμ§€λ§Œ 각각의 μ—­ν• κ³Ό μ±…μž„ 은 λͺ…ν™•νžˆ κ΅¬λΆ„λœλ‹€.


πŸ’‘Β κ°€λ“œ(Guards)의 μ—­ν• 

β†’ κ°€λ“œ(Guards) λŠ” κΆŒν•œ λΆ€μ—¬ 및 인증 , μš”μ²­ μ°¨λ‹¨μ˜ κΈ°λŠ₯ 을 μˆ˜ν–‰ν•œλ‹€.

즉, μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° 전에 μ‚¬μš©μžμ˜ 인증 μƒνƒœ , κΆŒν•œ 등을 ν™•μΈν•˜μ—¬ μš”μ²­μ„ ν—ˆμš©ν•  것인지 μ—¬λΆ€λ₯Ό νŒλ‹¨ν•œλ‹€.
λ˜λŠ” μš”μ²­μ„ κ±°λΆ€ν•  수 있으며 κ±°λΆ€ν•  μ‹œ ν•΄λ‹Ή μš”μ²­μ€ 더 이상 μ²˜λ¦¬λ˜μ§€ μ•Šκ³  응닡이 μ¦‰μ‹œ λ°˜ν™˜λœλ‹€.

β†’ κ°€λ“œ(Guards) λŠ” 주둜 true , false λ₯Ό λ°˜ν™˜ν•˜μ—¬ μš”μ²­μ„ μŠΉμΈν•˜κ±°λ‚˜ κ±°λΆ€ν•œλ‹€.

β†’ κ°€λ“œ(Guards) λŠ” 주둜 λ³΄μ•ˆκ³Ό κ΄€λ ¨λœ 둜직(μ˜ˆμ‹œ : 인증 및 κΆŒν•œ 검사) 에 μ§‘μ€‘ν•œλ‹€.

canActivate(context: ExecutionContext): boolean{
	const request = context.switchToHttp().getRequest(); // μš”μ²­ 정보 κ°€μ Έμ˜€κΈ°
	return request.user ? true : false; // 인증된 μ‚¬μš©μžμΈμ§€ 체크
}

πŸ’‘μΈν„°μ…‰ν„°(Interceptors)의 μ—­ν• 

β†’ 인터셉터(Interceptors) λŠ” μš”μ²­ 및 응닡 λ³€ν™˜/μ‘°μž‘ , λ‘œκΉ…, 캐싱, μ„±λŠ₯ μΈ‘μ • λ“± 을 μˆ˜ν–‰ν•œλ‹€.

즉, μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μ „μ΄λ‚˜ 응닡을 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•˜κΈ° μ „ 에 데이터λ₯Ό μ‘°μž‘ν•˜κ±°λ‚˜ λ³€ν™˜ ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
λ˜ν•œ 인터셉터(Interceptors)λŠ” μš”μ²­μ΄λ‚˜ μ‘λ‹΅λΏλ§Œ μ•„λ‹ˆλΌ λ‹€μ–‘ν•œ λΆ€κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.

β†’ 인터셉터(Interceptors)λŠ” μš”μ²­ λ°μ΄ν„°μ˜ ν˜•μ‹μ„ λ³€ν™˜ν•˜κ±°λ‚˜ , 응닡 데이터λ₯Ό μ‘°μž‘ν•  수 μžˆλ‹€.

β†’ 인터셉터(Interceptors)λŠ” λ³΄μ•ˆ 외에도 λ‹€μ–‘ν•œ λΆ€κ°€ μž‘μ—…μ„ μ§„ν–‰ν•œλ‹€.

intercept(context: ExecutionContext, next: CallHandler): Observable<any>{
	// 응닡 데이터λ₯Ό { data: μ›λž˜ 응닡 } ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•œλ‹€.
	return next.handle().pipe(map(data => ({ data })));
}

πŸ’‘Β μ£Όμš” 차이점을 μš”μ•½ν•΄λ³΄μž!

β†’ κ°€λ“œ(Guards) λŠ” 주둜 λ³΄μ•ˆ 에 μ΄ˆμ μ„ λ§žμΆ”λ©°, μš”μ²­μ΄ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠμœΌλ©΄ μš”μ²­μ„ 차단 ν•  수 μžˆλ‹€.

β†’ 인터셉터(Interceptors) λŠ” 주둜 데이터 λ³€ν™˜ 및 μΆ”κ°€ 둜직 μ‹€ν–‰ 에 μ΄ˆμ μ„ λ§žμΆ”λ©°, μš”μ²­μ„ μ°¨λ‹¨ν•˜μ§€ μ•Šκ³  흐름을 μ œμ–΄ν•œλ‹€.

πŸ€”Β κ·Έλ ‡λ‹€λ©΄ κ°€λ“œμ™€ μΈν„°μ…‰ν„°λŠ” μ–΄λ–€ μœ„μΉ˜μ™€ νƒ€μ΄λ°μ—μ„œ μ‹€ν–‰λ˜λ‚˜?

  • κ°€λ“œ(Guards) λŠ” 컨트둀러 λ‚˜ 라우트 ν•Έλ“€λŸ¬ 에 μ ‘κ·Όν•˜κΈ° 전에 μ‹€ν–‰λ˜λ©° μš”μ²­μ˜ 진행을 막을 수 μžˆλ‹€.
  • 인터셉터(Interceptors) λŠ” ν•Έλ“€λŸ¬ κ°€ μ‹€ν–‰λœ 후에도 μž‘λ™ν•˜λ©°, 응닡 데이터λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ μΆ”κ°€ λ‘œμ§μ„ μ μš©ν•  수 μžˆλ‹€.
profile
μ—΄μ‹¬νžˆ μ‚΄μ•„μ•Όμ§€

0개의 λŒ“κΈ€