Framework/Spring Framework

필터와 μΈν„°μ…‰ν„°μ˜ 차이

ν”„λ‘œκ·Έλž˜λ¨Έ μ˜€μ›” 2024. 3. 4.

필터와 μΈν„°μ…‰ν„°λŠ” λ‘˜ λ‹€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μš”μ²­κ³Ό 응닡을 μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. μžλ°” 필터와 μŠ€ν”„λ§ μΈν„°μ…‰ν„°λŠ” λͺ¨λ‘ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ΄ μ»¨νŠΈλ‘€λŸ¬μ— λ„λ‹¬ν•˜κΈ° μ „μ΄λ‚˜ 응닡이 ν΄λΌμ΄μ–ΈνŠΈμ— λ„λ‹¬ν•˜κΈ° 전에 κ°€λ‘œμ±„μ„œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

λ˜ν•œ λ‘˜ λͺ¨λ‘ μš”μ²­μ— λŒ€ν•΄ 사전 처리(pre-processing)와 사후 처리(post-processing)λ₯Ό ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, μš”μ²­ 둜그λ₯Ό κΈ°λ‘ν•˜κ±°λ‚˜ 응닡 헀더λ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.

필터와 μΈν„°μ…‰ν„°λŠ” λͺ¨λ‘ 체인(chain)의 ν˜•νƒœλ‘œ μ—¬λŸ¬ κ°œκ°€ μ—°μ†μ μœΌλ‘œ 싀행될 수 μžˆλ‹€. ν•˜λ‚˜μ˜ ν•„ν„°λ‚˜ 인터셉터가 λ‹€μŒ ν•„ν„°λ‚˜ 인터셉터λ₯Ό ν˜ΈμΆœν•˜λ„λ‘ 섀계할 수 μžˆλ‹€.

μ΄λ ‡κ²Œ 필터와 μΈν„°μ…‰ν„°λŠ” λͺ¨λ‘ μš”μ²­κ³Ό 응닡을 κ°€λ‘œμ±„μ„œ μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ, κ·Έ λ™μž‘ 방식과 μ μš©λ˜λŠ” 계측이 λ‹€λ₯΄λ‹€.

 

 

ν•„ν„° (Filter)

ν•„ν„°(Filter)λŠ” μžλ°” μ„œλΈ”λ¦Ώ μŠ€νŽ™μ˜ μΌλΆ€λ‘œ, μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆμ—μ„œ μš”μ²­κ³Ό 응닡을 κ°€λ‘œμ±„μ–΄ μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. ν•„ν„°λŠ” 주둜 μ„œλΈ”λ¦Ώ μš”μ²­ μ „μ²˜λ¦¬ 및 응닡 ν›„μ²˜λ¦¬ μž‘μ—…μ— μ‚¬μš©λœλ‹€. 

μ£Όμš” νŠΉμ§•

  1. μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ 레벨:
    • ν•„ν„°λŠ” μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ λ ˆλ²¨μ—μ„œ λ™μž‘ν•œλ‹€. λͺ¨λ“  μ„œλΈ”λ¦Ώ μš”μ²­μ— λŒ€ν•΄ 적용될 수 μžˆλ‹€.
  2. μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 적용:
    • νŠΉμ • URL νŒ¨ν„΄μ— λ§€ν•‘λ˜μ–΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ—μ„œ μš”μ²­κ³Ό 응닡을 κ°€λ‘œμ±Œ 수 μžˆλ‹€.
  3. μ£Όμš” μ‚¬μš© 사둀:
    • 인증 및 인가, λ‘œκΉ…, μ••μΆ•, 인코딩 μ„€μ • λ“±.
  4. μ„€μ • 방법:
    • web.xml νŒŒμΌμ„ μ‚¬μš©ν•˜κ±°λ‚˜, @WebFilter μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ„€μ •ν•  수 μžˆλ‹€.
    • μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œλŠ” FilterRegistrationBean을 톡해 μ„€μ •ν•  수 μžˆλ‹€.

μ˜ˆμ‹œ

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ν•„ν„° μ΄ˆκΈ°ν™” 둜직
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // μš”μ²­ μ „ 처리
        System.out.println("Filter: Before processing request");

        chain.doFilter(request, response);

        // 응닡 ν›„ 처리
        System.out.println("Filter: After processing response");
    }

    @Override
    public void destroy() {
        // ν•„ν„° μ’…λ£Œ 둜직
    }
}

 

 

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

인터셉터(Interceptor)λŠ” μŠ€ν”„λ§ MVC의 μΌλΆ€λ‘œ, λ””μŠ€νŒ¨μ²˜ μ„œλΈ”λ¦Ώκ³Ό 컨트둀러 μ‚¬μ΄μ—μ„œ μš”μ²­κ³Ό 응닡을 κ°€λ‘œμ±„μ–΄ μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. μΈν„°μ…‰ν„°λŠ” 주둜 컨트둀러 μ „ν›„λ‘œ μΆ”κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.

μ£Όμš” νŠΉμ§•

  1. μŠ€ν”„λ§ MVC 레벨:
    • μΈν„°μ…‰ν„°λŠ” μŠ€ν”„λ§ MVC κ³„μΈ΅μ—μ„œ λ™μž‘ν•˜λ©°, λ””μŠ€νŒ¨μ²˜ μ„œλΈ”λ¦Ώκ³Ό 컨트둀러 μ‚¬μ΄μ—μ„œ μš”μ²­μ„ κ°€λ‘œμ±ˆλ‹€.
  2. μ„Έλ°€ν•œ μš”μ²­ 처리:
    • νŠΉμ • 컨트둀러 λ˜λŠ” νŠΉμ • λ©”μ„œλ“œμ— λŒ€ν•œ μš”μ²­μ„ κ°€λ‘œμ±„μ–΄ μ²˜λ¦¬ν•  수 μžˆλ‹€.
  3. μ£Όμš” μ‚¬μš© 사둀:
    • 인증 및 인가, λ‘œκΉ…, μ„Έμ…˜ 체크, 곡톡 처리 둜직 λ“±.
  4. μ„€μ • 방법:
    • HandlerInterceptor μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³ , WebMvcConfigurerλ₯Ό 톡해 μ„€μ •ν•œλ‹€.

μ˜ˆμ‹œ

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 컨트둀러 호좜 μ „ 처리
        System.out.println("Interceptor: Before processing request");
        return true; // true λ°˜ν™˜ μ‹œ λ‹€μŒ 인터셉터 λ˜λŠ” 컨트둀러둜 μ§„ν–‰
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 컨트둀러 호좜 ν›„ 처리
        System.out.println("Interceptor: After processing request");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // μš”μ²­ μ™„λ£Œ ν›„ 처리 (μ˜ˆμ™Έ λ°œμƒ μ‹œμ—λ„ 호좜됨)
        System.out.println("Interceptor: After request completion");
    }
}


@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
    }
}

 

 

 

μ£Όμš” 차이점 μš”μ•½

νŠΉμ§•  ν•„ν„° (Filter) 인터셉터 (Interceptor)
적용 레벨 μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ 레벨 μŠ€ν”„λ§ MVC 레벨
μ£Όμš” λͺ©μ  μš”μ²­ μ „μ²˜λ¦¬ 및 응닡 ν›„μ²˜λ¦¬ (인증, λ‘œκΉ…, 인코딩 μ„€μ • λ“±) 컨트둀러 μ „ν›„μ˜ μΆ”κ°€ μž‘μ—… (인증, λ‘œκΉ…, μ„Έμ…˜ 체크 λ“±)
μ„€μ • 방법 web.xml λ˜λŠ” @WebFilter, FilterRegistrationBean HandlerInterceptor κ΅¬ν˜„ 및 WebMvcConfigurer μ„€μ •
μ£Όμš” μ‚¬μš© 사둀 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ—μ„œ μš”μ²­κ³Ό 응닡을 κ°€λ‘œμ±” νŠΉμ • 컨트둀러 λ˜λŠ” λ©”μ„œλ“œμ— λŒ€ν•œ μš”μ²­κ³Ό 응닡을 κ°€λ‘œμ±”
κ΅¬ν˜„ μΈν„°νŽ˜μ΄μŠ€ javax.servlet.Filter org.springframework.web.servlet.HandlerInterceptor

 

 

ν•„ν„°(Filter)

  • 적용 레벨: μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ 레벨.
  • μ£Όμš” λͺ©μ : μš”μ²­ μ „μ²˜λ¦¬ 및 응닡 ν›„μ²˜λ¦¬ (예: 인증, 인가, λ‘œκΉ…, 인코딩 μ„€μ • λ“±).
  • μ„€μ • 방법: web.xml 파일, @WebFilter μ• λ…Έν…Œμ΄μ…˜, λ˜λŠ” μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ FilterRegistrationBean μ‚¬μš©.
  • μ£Όμš” μ‚¬μš© 사둀: λͺ¨λ“  μ„œλΈ”λ¦Ώ μš”μ²­μ— λŒ€ν•œ 곡톡 처리.

인터셉터(Interceptor)

  • 적용 레벨: μŠ€ν”„λ§ MVC 레벨.
  • μ£Όμš” λͺ©μ : 컨트둀러 호좜 μ „ν›„μ˜ μΆ”κ°€ μž‘μ—… (예: 인증, 인가, λ‘œκΉ…, μ„Έμ…˜ 체크 λ“±).
  • μ„€μ • 방법: HandlerInterceptor μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³ , WebMvcConfigurerλ₯Ό 톡해 μ„€μ •.
  • μ£Όμš” μ‚¬μš© 사둀: νŠΉμ • 컨트둀러 λ˜λŠ” λ©”μ„œλ“œμ— λŒ€ν•œ 곡톡 처리.

λŒ“κΈ€