πŸ›‘οΈ μ„œλΈ”λ¦Ώ ν•„ν„° vs μŠ€ν”„λ§ 인터셉터, μ–Έμ œ μ–΄λ–€ κ±Έ 써야 ν• κΉŒ?

도두맨·2025λ…„ 5μ›” 28일

곡뢀

λͺ©λ‘ 보기
11/23

μ‘°μ‹œμ™€ 쿀의 ν…Œμ½”ν†‘: μ„œλΈ”λ¦Ώ ν•„ν„° & μŠ€ν”„λ§ 인터셉터 λ°œν‘œλ₯Ό 보고 μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
싀무와 ν•™μŠ΅μ—μ„œ 필터와 μΈν„°μ…‰ν„°μ˜ 차이, μ μ ˆν•œ μ‚¬μš© μ‹œμ μ— λŒ€ν•œ 감을 μž‘λŠ” 데 도움이 λ©λ‹ˆλ‹€.


🧩 곡톡 κ΄€μ‹¬μ‚¬μ˜ 뢄리

μž₯λ°”κ΅¬λ‹ˆμ— λ¬Όν’ˆμ„ μΆ”κ°€ν•˜λŠ” addCart(), μž₯λ°”κ΅¬λ‹ˆμ˜ λ¬Όν’ˆμ„ μ‘°νšŒν•˜λŠ” getCarts() 같은 κΈ°λŠ₯은 둜그인이 ν•„μˆ˜μž…λ‹ˆλ‹€.
β†’ λͺ¨λ“  λ©”μ„œλ“œμ— μΈμ¦λ‘œμ§μ„ λ°˜λ³΅ν•΄μ•Ό ν•˜λ‚˜μš”?

μ•„λ‹ˆμš”!
이런 λ°˜λ³΅λ˜λŠ” 뢀뢄을 **곡톡 관심사(Cross-cutting concern)**라고 ν•˜λ©°, 이λ₯Ό ν•œ 곳에 λͺ¨μ•„ μ²˜λ¦¬ν•˜λ©΄ μ½”λ“œκ°€ 훨씬 κΉ”λ”ν•΄μ§‘λ‹ˆλ‹€.


πŸ§ͺ ν•„ν„°(Filter)

πŸ’‘ ν•„ν„° 등둝 방법

1. @Component

  • 전체 URL에 적용됨
  • URL νŒ¨ν„΄ μ§€μ • λΆˆκ°€ ❌

2. @WebFilter + @ServletComponentScan

@WebFilter(urlPatterns = "/api/*")
public class MyFilter implements Filter { ... }
@SpringBootApplication
@ServletComponentScan
public class App {}

@ServletComponentScan: μ›Ή ν•„ν„°, μ›Ή μ„œλΈ”λ¦Ώ, μ›Ή λ¦¬μŠ€λ„ˆ 같이 μ„œλΈ”λ¦Ώ 객체λ₯Ό μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ μœ„μ— μ˜¬λ¦¬λŠ” λ™μž‘μ„ μ‹œμΌœμ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜

  • ν•„ν„° URL μ§€μ • κ°€λŠ₯
  • μŠ€ν”„λ§ 빈이 μ•„λ‹Œ μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆμ— 등둝됨
  • @Order μ‚¬μš© λΆˆκ°€ ❌

3. FilterRegistrationBean μ‚¬μš© (ꢌμž₯)

@Bean
public FilterRegistrationBean<MyFilter> loggingFilter() {
    FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
    registration.setFilter(new MyFilter());
    registration.setOrder(1);
    registration.addUrlPatterns("/api/*");
    return registration;
}
  • setFilter: ν•„ν„° 등둝
  • setOrder: μˆœμ„œ μ§€μ •
  • addUrlPatterns: URL μ§€μ •
  • μœ μ—°ν•˜κ³  λͺ…μ‹œμ  βœ…

βš™οΈ μ„œλΈ”λ¦Ώ ν•„ν„° λ™μž‘ 방식

  • ν•„ν„° 체인은 ApplicationFilterChain으둜 싀행됨
  • λ‚΄λΆ€μ μœΌλ‘œ doFilter() β†’ internalDoFilter() 호좜

  • n: 총 λ“±λ‘λœ ν•„ν„°μ˜ 개수. 필터듀은 Array둜 관리
  • pos: λ°°μ—΄μ˜ 인덱슀
  • filterConfig: ν•„ν„° 정보λ₯Ό κ°€μ§€κ³  μžˆλŠ” filterConfig λ°°μ—΄


πŸŒ€ μŠ€ν”„λ§ 인터셉터(Interceptor)

βœ… μ—­ν• 

컨트둀러 μ‹€ν–‰ μ „/후에 λ™μž‘ν•˜λŠ” μŠ€ν”„λ§ μ „μš© μ»΄ν¬λ„ŒνŠΈ
인증, 인가, λ‘œκΉ…, μ˜ˆμ™Έ 핸듀링 λ“± ν™œμš© κ°€λŠ₯


βš™οΈ 제곡 λ©”μ„œλ“œ

λ©”μ„œλ“œμ„€λͺ…
preHandle컨트둀러 μ‹€ν–‰ μ „ 호좜
postHandle컨트둀러 μ‹€ν–‰ ν›„, λ·° λ Œλ”λ§ μ „
afterCompletionλ·°κΉŒμ§€ λ Œλ”λ§ ν›„ λ§ˆμ§€λ§‰ 처리

λͺ¨λ‘ λ””ν΄νŠΈ λ©”μ„œλ“œμ΄λ―€λ‘œ ν•„μš”ν•œ κ²ƒλ§Œ μ˜€λ²„λΌμ΄λ“œν•˜λ©΄ 됨


πŸ”§ 등둝 방법

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/auth/**");
    }
}
  • addInterceptors: 인터셉터 μΆ”κ°€, λ“±λ‘λœ μˆœμ„œλŒ€λ‘œ 싀행됨
  • addPathPatterns: URI κ·œμΉ™μ„ μ„€μ •
  • excludePathPatterns: 인터셉터λ₯Ό μ μš©μ‹œν‚€μ§€ μ•Šμ„ URIλ₯Ό μ„€μ •

🧭 인터셉터 λ™μž‘ μˆœμ„œ

[Filter] β†’ DispatcherServlet
β†’ getHandler (ν•Έλ“€λŸ¬ & 인터셉터 λͺ©λ‘ 확보)
β†’ preHandle 순차 μ‹€ν–‰
β†’ Controller μ‹€ν–‰
β†’ postHandle μ—­μˆœ μ‹€ν–‰
β†’ ViewResolver 호좜
β†’ afterCompletion μ—­μˆœ μ‹€ν–‰

μΈν„°μ…‰ν„°λŠ” μŠ€ν”„λ§ μ»¨ν…μŠ€νŠΈ μ•ˆμ—μ„œ 컨트둀러λ₯Ό κΈ°μ€€μœΌλ‘œ μ „ν›„λ₯Ό 감쌈
기본적으둜 μŠ€ν”„λ§μ΄ μ œκ³΅ν•˜λŠ” ν•Έλ“€λŸ¬ 체인 μ•ˆμ—μ„œ 싀행됨


πŸ” ν•„ν„° vs 인터셉터 차이점 정리

ν•­λͺ©ν•„터인터셉터
기술 κΈ°λ°˜μžλ°” EE μ„œλΈ”λ¦Ώ μŠ€νŽ™μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬
등둝 λŒ€μƒμ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆμŠ€ν”„λ§ 빈
μ‹€ν–‰ μœ„μΉ˜DispatcherServlet 이전DispatcherServlet 이후
μ˜ˆμ™Έ μ²˜λ¦¬μŠ€ν”„λ§ MVC μ˜ˆμ™Έ 처리 체인 μ™ΈλΆ€ (μ˜ˆμ™Έ ν•Έλ“€λŸ¬ λ™μž‘ λΆˆκ°€)μŠ€ν”„λ§ MVC μ˜ˆμ™Έ 처리 체인 λ‚΄λΆ€ (μž‘μ•„μ„œ 처리 κ°€λŠ₯)
request/response ꡐ체가λŠ₯λΆˆκ°€
μˆœμ„œ μ§€μ •FilterRegistrationBean으둜 κ°€λŠ₯registry.order() λ“±μœΌλ‘œ κ°€λŠ₯

πŸ€” μ–Έμ œ ν•„ν„°, μ–Έμ œ 인터셉터?

βœ… ν•„ν„° μΆ”μ²œ 상황

  • λ‘œκΉ…, 인코딩, CORS, HTTP Method override λ“± μ›Ή μ „λ°˜μ˜ μš”μ²­ 처리
  • μ„œλΈ”λ¦Ώ κΈ°μ€€ μ „μ²˜λ¦¬
  • λ³΄μ•ˆ κ΄€λ ¨ 헀더 μ„€μ • λ“±

βœ… 인터셉터 μΆ”μ²œ 상황

  • 인증/인가
  • 둜그인 μ—¬λΆ€ 검증
  • μš”μ²­ attribute μΆ”κ°€
  • μŠ€ν”„λ§ MVC λ™μž‘κ³Ό λ°€μ ‘ν•œ κΈ°λŠ₯

μ›Ή μ „λ°˜ β†’ ν•„ν„°
μŠ€ν”„λ§ μ»¨ν…μŠ€νŠΈ λ‚΄λΆ€μ˜ 둜직 β†’ 인터셉터


🧠 마무리

μŠ€ν”„λ§μ˜ λ°œμ „μœΌλ‘œ 필터도 μŠ€ν”„λ§ 빈으둜 등둝할 수 있게 λ˜μ—ˆμ§€λ§Œ,
λ‘˜μ˜ μ±…μž„κ³Ό κ΄€μ‹¬μ‚¬λŠ” μ—¬μ „νžˆ κ΅¬λΆ„λ˜μ–΄μ•Ό ν•œλ‹€.

기쀀을 λͺ…ν™•ν•˜κ²Œ μ •ν•˜κ³  μ‚¬μš©ν•˜μž!


πŸŽ₯ 좜처

πŸ“Ί μ‘°μ‹œ, 쿀의 ν…Œμ½”ν†‘: μ„œλΈ”λ¦Ώ ν•„ν„° & μŠ€ν”„λ§ 인터셉터

0개의 λŒ“κΈ€