Filter์™€ Interceptor์˜ ์ฐจ์ด ๐Ÿค”

chisaeยท2024๋…„ 5์›” 22์ผ

๋„์ ์ด๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
12/12
post-thumbnail

์•ˆ๋…•ํ•˜์„ธ์š”, ์˜ค๋Š˜์€ Filter์™€ Interceptor์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค, ์ตœ๊ทผ ํฌ์ŠคํŒ… ํ•œ ๊ธ€๋“ค ์ค‘์—์„œ AOP ๊ธฐ์ˆ ์„ ์ ์šฉํ•ด์„œ ArgumentResolver๋ž‘ Interceptor๋ฅผ ๋งŒ๋“ ์ ์ด ์žˆ๋Š”๋ฐ์š”, ๊ทผ๋ฐ ๊ณผ๊ฑฐ ํ”„๋กœ์ ํŠธ์—์„œ OAuth2.0์œผ๋กœ ๋กœ๊ทธ์ธ ํ•˜๋Š” ๊ณผ์ •์—์„œ Filter๋„ ์‚ฌ์šฉํ•œ ์ ์ด ์žˆ๋Š”๋ฐ, ๊ทธ๋•Œ๋Š” ๊ตฌํ˜„์ด ์‹œ๊ธ‰ํ•œ ์ƒํ™ฉ์ด์—ˆ๋Š”์ง€๋ผ ์ œ๋Œ€๋กœ ์ฐจ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ๋งŒ๋“ค์ง€๋Š” ์•Š์•„์„œ.. ์ด๋ฒˆ ๊ธฐํšŒ์— ์ œ๋Œ€๋กœ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค ~ !



๊ธฐ์กด์— ์•Œ๊ณ  ์žˆ๋˜ ์ฐจ์ด์ 

์ผ๋‹จ Filter์™€ Interceptor๊ฐ€ ์ฐจ์ด์ ์ด ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋ผ๋Š” ์‚ฌ์‹ค์€ ์•Œ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค, ํ•˜์ง€๋งŒ ๋‘ ๊ธฐ๋Šฅ์˜ ์ฐจ์ด์ ์„ ์•„์ฃผ ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด ๋ฌธ์ œ์ธ๋ฐ์š”, ์ง€๊ธˆ๋ถ€ํ„ฐ ์ €๊ฐ€ ์–ด๋А์ •๋„ ๊นŒ์ง€ ์•Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋‘ ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜๊ฒŒ ์š”์ฒญ๊ณผ ์‘๋‹ต ์‚ฌ์ด์— ๋™์ž‘ํ•œ๋‹ค
  • Spring Context ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š”์ง€, ์™ธ๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š”์ง€ ์ฐจ์ด์ด๋‹ค
  • ์ฆ‰ ์‚ฌ์šฉ๋˜๋Š” ์˜์—ญ์ด ๋‹ค๋ฅด๋‹ค.
๊ทผ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์˜์—ญ์ด ๊ตณ์ด ์™œ ๋‹ค๋ฅธ๊ฑธ๊นŒ?
 -> ๊ทธ๊ฑฐ์— ๋Œ€ํ•ด์„œ ์ง€๊ธˆ๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.



Filter๋ž€?

๊ฐœ๋…

ํ•„ํ„ฐ๋Š” Servlet API์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ, Servlet Container ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๋ฉฐ ์š”์ฒญ์˜ ์ „์ฒ˜๋ฆฌ ๋ฐ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค, ์ฆ‰ DispatcherServlet์— ์š”์ฒญ์ด ์ „๋‹ฌ๋˜๊ธฐ ์ „ํ›„์— URI ํŒจํ„ด์— ๋งž๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ
  • ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค
  • ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค
  • ๋ณด์•ˆ, ๋กœ๊น… ๋“ฑ์˜ ๊ณตํ†ต ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ DispatcherServlet์€ Spring Context์—์„œ ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ์กด์žฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ธ๋ฐ, Filter๋Š” ์ด๋Ÿฌํ•œ DispatcherServlet ์ „ํ›„์— ๋™์ž‘ํ•˜๊ธฐ์— Spring Context ์™ธ๋ถ€์—์„œ ๋™์ž‘ํ•œ๋‹ค, ์ด๋•Œ Filter๋Š” Servelt Container ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ ์ž์„ธํ•œ ๊ณผ์ •์€ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ๋” ์ž์„ธํ•œ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๋ฉ”์„œ๋“œ

  • init()
    : Filter ๊ฐ์ฒด๊ฐ€ ์ตœ์ดˆ๋กœ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์ฃผ๋กœ ํ•„์š”ํ•œ ์ž์›์„ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์„ค์ •์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    public void init(FilterConfig filterConfig) throws ServletException {
           System.out.println("CustomFilter initialized");
    }
  • doFilter()
    : ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์‹ค์ œ ํ•„ํ„ฐ๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค, ๋ชจ๋“  HTTP ์š”์ฒญ์ด ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉฐ, ์š”์ฒญ ์ „์ฒ˜๋ฆฌ๋‚˜ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ์—ฌ๊ธฐ์„œ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    public void doFilter(
       ServletRequest request, 
       ServletResponse response, 
       FilterChain chain
    ) throws IOException, ServletException {
           // ์š”์ฒญ ์ „์ฒ˜๋ฆฌ ์ž‘์—… ์ˆ˜ํ–‰
           System.out.println("Before doFilter() in Filter");
    
           // ๋‹ค์Œ ํ•„ํ„ฐ๋กœ ์š”์ฒญ ์ „๋‹ฌ
           chain.doFilter(request, response);
    
           // ์‘๋‹ต ํ›„์ฒ˜๋ฆฌ ์ž‘์—… ์ˆ˜ํ–‰
           System.out.println("After doFilter() in Filter");
    }
    
  • destroy()
    : Filter ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ์—์„œ ์‚ฌ์šฉํ•œ ์ž์›์„ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ•ด์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    public void destroy() {
           // ํ•„ํ„ฐ ํ•ด์ œ ์ž‘์—… ์ˆ˜ํ–‰
           System.out.println("CustomFilter destroyed");
    }



Interceptor๋ž€?

๊ฐœ๋…

์ธํ„ฐ์…‰ํ„ฐ๋Š” Spring MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ, DispatcherServlet์ด Controller๋กœ ์š”์ฒญ์„ ์ „๋‹ฌ ๋ฐ ์‘๋‹ต์„ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ DispatcherServlet์ด HandlerMapping์„ ํ†ตํ•˜์—ฌ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋„๋ก ์š”์ฒญํ•˜๋Š”๋ฐ ๊ทธ ๊ณผ์ •์—์„œ Interceptor๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ Interceptor๋ฅผ ๊ฑฐ์ณ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ
  • ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค
  • ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค
  • ์ธ์ฆ(๋กœ๊ทธ์ธ ์ฒดํฌ), ๊ถŒํ•œ ๊ฒ€์‚ฌ, ๋กœ๊น… ๋“ฑ์˜ ๊ณตํ†ต ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋™์ž‘ํ•˜๋ฉฐ ์š”์ฒญ -> Filter -> DispatcherServlet -> HandlerMapping -> Interceptor(PreHandle) -> HandlerAdapter -> Controller -> Service -> Repository -> Interceptor(postHandle) -> ์‘๋‹ต ์ˆœ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค, ์•„๋ž˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด ๋™์ž‘์„ ๋” ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋ฉ”์„œ๋“œ

  • preHandle()
    : ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋Œ€ํ•œ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ฆ์ด๋‚˜ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์š”์ฒญ์„ ํ—ˆ์šฉ ๋˜๋Š” ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    public boolean preHandle(
        HttpServletRequest request, 
        HttpServletResponse response,
        Object handler
    ) throws Exception {
           // ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ์ „์— ์‹คํ–‰๋  ์ž‘์—… ์ˆ˜ํ–‰
           System.out.println("Before preHandle() in Interceptor");
           return true; // ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ํ—ˆ์šฉ
    }
  • postHandle()
    : ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ํ›„, View๊ฐ€ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ View๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ์šฉ๋„๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
     public void postHandle(
         HttpServletRequest request, 
         HttpServletResponse response, 
         Object handler, ModelAndView modelAndView
     ) throws Exception {
           // ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ํ›„, View๊ฐ€ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์‹คํ–‰๋  ์ž‘์—… ์ˆ˜ํ–‰
           System.out.println("After postHandle() in Interceptor");
    }
  • afterCompletion()
    : View๊ฐ€ ๋ Œ๋”๋ง๋œ ํ›„์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ๋กœ๊น… ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์šฉ๋„๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
    public void afterCompletion(
          HttpServletRequest request, 
          HttpServletResponse response, 
          Object handler, Exception ex
    ) throws Exception {
           // ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ํ›„, View๊ฐ€ ๋ Œ๋”๋ง๋œ ํ›„์— ์‹คํ–‰๋  ์ž‘์—… ์ˆ˜ํ–‰
           System.out.println("After afterCompletion() in Interceptor");
    }



์ฐจ์ด์ 

๊ตณ์ด ์™œ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ?

์šฐ์„  Filter์™€ Interceptor๋ฅผ ๋‚˜๋ˆ„๋Š” ์ด์œ ๋Š” ๊ฐ์ž์˜ ์—ญํ• ๊ณผ ์ฑ…์ž„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ธ๋ฐ์š”, ๊ตฌ์ฒด์ ์ธ ์ด์œ ๋กœ๋Š” ์•„๋ž˜ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ์ ์šฉ ์‹œ์ 
    • Filter
      : Servlet API์˜ ์ผ๋ถ€๋กœ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์ด DispatcherServlet์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์ „์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์‘๋‹ต์ด ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Interceptor
      : Spring MVC์˜ ์ผ๋ถ€๋กœ, DispatcherServlet์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ Controller์˜ ์‹คํ–‰ ์ „ํ›„์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์šฉ ๋ฒ”์œ„
    • Filter
      : URL ํŒจํ„ด์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ธ์ฆ, ์ธ์ฝ”๋”ฉ ์„ค์ •, ๋กœ๊น… ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Interceptor
      : ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ „ํ›„์— ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๋ชฉ์ 
    • Filter
      : ๋ณด์•ˆ, ๋กœ๊น…, ๊ณตํ†ต ํ—ค๋” ์ถ”๊ฐ€, ์ธ์ฝ”๋”ฉ ์„ค์ • ๋“ฑ ์ „์—ญ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Interceptor
      : ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ฒ€์‚ฌ, ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ „ํ›„ ์ฒ˜๋ฆฌ, ๋ทฐ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋“ฑ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์„ธ๋ถ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๊ทธ๋ฆผ์„ ํ†ตํ•˜์—ฌ ๋” ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



์˜ค๋Š˜์€ ์ด๋ ‡๊ฒŒ Filter์™€ Interceptor์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”, ์ •๋ฆฌํ•˜์ž๋ฉด Filter๋Š” ๋งค์šฐ ํฐ, ์ „์—ญ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, Filter์—์„œ ๋ชจ๋“  ๊ฒ€์ฆ์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Interceptor๋ฅผ ํ†ตํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ๋ถ€๊ฐ€์ž‘์—…์„ ์ด์–ด์„œ ํ•ด์คŒ์œผ๋กœ์จ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค๊ณ  ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, Filter์™€ Interceptor๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ˆ˜์ค€์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์˜ ๋ฌธ์ œ

  • ๐Ÿ’ก Filter์™€ Interceptor์˜ ๋™์ž‘ ์œ„์น˜๋Š” ์–ด๋””์—์„œ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š”๊ฐ€์š”?
    : ๐Ÿ“™ Filter๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ ๋™์ž‘ํ•˜์—ฌ DispatcherServlet์— ์š”์ฒญ์ด ๋„๋‹ฌํ•˜๊ธฐ ์ „ํ›„์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Interceptor๋Š” Spring MVC์˜ ์ผ๋ถ€๋กœ DispatcherServlet์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ Controller์˜ ์‹คํ–‰ ์ „ํ›„์— ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก Filter์™€ Interceptor์˜ ์ฃผ์š” ์‚ฌ์šฉ ๋ชฉ์ ์„ ๊ฐ๊ฐ ์„ค๋ช…ํ•˜์„ธ์š”.
    • Filter
      : ๋ณด์•ˆ, ๋กœ๊น…, ๊ณตํ†ต ํ—ค๋” ์ถ”๊ฐ€, ์ธ์ฝ”๋”ฉ ์„ค์ • ๋“ฑ ์ „์—ญ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Interceptor
      : ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ฒ€์‚ฌ, ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ „ํ›„ ์ฒ˜๋ฆฌ, ๋ทฐ ๋ชจ๋ธ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋“ฑ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์„ธ๋ถ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก Filter์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ์™€ ๊ทธ ์—ญํ• ์„ ์„ค๋ช…ํ•˜์„ธ์š”.
    • init()
      : Filter ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋ฉฐ, ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • doFilter()
      : ์‹ค์ œ ํ•„ํ„ฐ๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋ชจ๋“  HTTP ์š”์ฒญ์ด ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์š”์ฒญ ์ „์ฒ˜๋ฆฌ ๋ฐ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • destroy()
      : Filter ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ, ์ž์› ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก Interceptor์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ์™€ ๊ทธ ์—ญํ• ์„ ์„ค๋ช…ํ•˜์„ธ์š”.
    • preHandle()
      : ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ, ์š”์ฒญ์— ๋Œ€ํ•œ ์ „์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • postHandle()
      : ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ํ›„, View๊ฐ€ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ, ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ View๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • afterCompletion()
      : View๊ฐ€ ๋ Œ๋”๋ง๋œ ํ›„์— ํ˜ธ์ถœ๋˜๋ฉฐ, ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก Filter์™€ Interceptor๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ๋‚˜์š”?
    : Filter๋Š” ์ „์—ญ์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Interceptor๋Š” ์„ธ๋ถ€์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ „ํ›„์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.





์ฐธ๊ณ 
https://mangkyu.tistory.com/173
https://docs.spring.io/spring-security/site/docs/5.3.2.RELEASE/reference/html5/#servlet-architecture

profile
์ดˆ๋ณด ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€