ํฌ์ŠคํŠธ

Interceptor

Interceptor

๐Ÿ”Ž Interceptor

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋„ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ๊ฐ™์ด ์›น๊ณผ ๊ด€๋ จ๋œ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ํšจ๊ณผ์ ์œผ๋กœ

ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๊ฐ€ ์„œ๋ธ”๋ฆฟ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋ผ๋ฉด,

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๋‘˜๋‹ค ์›น๊ณผ ๊ด€๋ จ๋œ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„

์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ์ ์šฉ๋˜๋Š” ์ˆœ์„œ์™€ ๋ฒ”์œ„, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค.


Spring Interceptor

1. ์ธํ„ฐ์…‰ํ„ฐ์˜ ํ๋ฆ„

HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ โ†’ (Dispatcher)์„œ๋ธ”๋ฆฟ โ†’ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ โ†’ ์ปจํŠธ๋กค๋Ÿฌ

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” Dispatcher Servlet๊ณผ ์ปจํŠธ๋กค๋Ÿฌ ์‚ฌ์ด์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค.

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง MVC๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ Dispatcher Servlet ์ดํ›„์—

๋“ฑ์žฅํ•œ๋‹ค. ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ์—๋„ URL ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์„œ๋ธ”๋ฆฟ URL ํŒจํ„ด๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ,

๋งค์šฐ ์ •๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.


2. ์ธํ„ฐ์…‰ํ„ฐ์˜ ์ œํ•œ

HTTP ์š”์ฒญ โ†’ WAS โ†’ ํ•„ํ„ฐ โ†’ (Dispatcher)์„œ๋ธ”๋ฆฟ โ†’ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ (์ฐจ๋‹จ)

์ธํ„ฐ์…‰ํ„ฐ์—์„œ ์ ์ ˆํ•˜์ง€ ์•Š์€ ์š”์ฒญ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋ฉด ๊ฑฐ๊ธฐ์—์„œ ๋์„ ๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ธฐ์— ๋”ฑ ์ข‹๋‹ค.


3. ์ธํ„ฐ์…‰ํ„ฐ ์ฒด์ธ

HTTP ์š”์ฒญ -> WAS -> ํ•„ํ„ฐ -> ์„œ๋ธ”๋ฆฟ -> ์ธํ„ฐ์…‰ํ„ฐ1 -> ์ธํ„ฐ์…‰ํ„ฐ2 -> ์ปจํŠธ๋กค๋Ÿฌ

์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์ฒด์ธ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ์ค‘๊ฐ„์— ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.


โœ“ 2022.04.19 ์ถ”๊ฐ€ โœ“

์˜ค๋Š˜์€ ํ”„๋กœ์ ํŠธ ๊ณผ์ •์—์„œ Dispather Servlet์—์„œ ๋ฐœ์ƒํ•˜๋Š” PageNotFound๋ฅผ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ

์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

๊ฐ€์žฅ ๋จผ์ € RestControllerAdvice๋ฅผ ์ ์šฉ ํ–ˆ์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.

์™œ์ธ์ง€ ํ™•์ธํ•ด๋ณด๋‹ˆ ์• ์ดˆ์— Page Not Found๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ถ€๋ฅด๊ธฐ์ „์— handler๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„

HandlerAdapter๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— nohandlerfoundexception๋กœ ์ธํ•ด์„œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜์˜€๊ธฐ ๋•Œ๋ฌธ!!!

๋”ฐ๋ผ์„œ Servlet๊ณผ Controller ์‚ฌ์ด์—์„œ ํ˜ธ์ถœ๋˜๋Š” Interceptor๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๊ฒŸ๋‹ค ์‹ถ์—ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
public class PageNotFoundInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (response.getStatus() == 404) {
            response.getWriter().print("Page Not Found");
            return false;
            }
        return true;
    }
}


4. HandlerInterceptor Interface

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public interface HandlerInterceptor {
	
	// ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler) throws Exception {
		return true;
	}

 	// ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ํ›„
	default void postHandle(HttpServletRequest request, HttpServletResponse response, 
            Object handler, @Nullable ModelAndView modelAndView) throws Exception {
	}

	// ์š”์ฒญ ์™„๋ฃŒ ํ›„
	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
            Object handler, @Nullable Exception ex) throws Exception {
	}

} 

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํ•˜๊ฒŒ doFilter() ํ•˜๋‚˜๋งŒ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ธํ„ฐ์…‰ํ„ฐ๋Š”

์ปจํŠธ๋กค๋Ÿฌ โ€œํ˜ธ์ถœ ์ „โ€, โ€œํ˜ธ์ถœ ํ›„โ€, โ€œ์š”์ฒญ ์™„๋ฃŒ ์ดํ›„โ€์™€ ๊ฐ™์ด ๋‹จ๊ณ„์ ์œผ๋กœ ์ž˜ ์„ธ๋ถ„ํ™” ๋˜์–ด ์žˆ๋‹ค.

๋˜ํ•œ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ request, response๋งŒ ์ œ๊ณตํ–ˆ์ง€๋งŒ,

์ธํ„ฐ์…‰ํ„ฐ๋Š” ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”์ง€ ํ˜ธ์ถœ ์ •๋ณด๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค modelAndView๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ์‘๋‹ต ์ •๋ณด๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


5. ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ์˜ ํ˜ธ์ถœ ํ๋ฆ„

์ •์ƒ์ ์ธ ํ๋ฆ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • preHandle
    • ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ์ „์— ํ˜ธ์ถœ ๋œ๋‹ค. โ†’ ๋” ์ •ํ™•ํžˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
    • preHandle์˜ ์‘๋‹ต๊ฐ’์ด true์ผ ๊ฒฝ์šฐ ๋‹ค์Œ์œผ๋กœ ์ง„ํ–‰
    • false์ผ ๊ฒฝ์šฐ ๋”๋Š” ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.


  • postHandle
    • ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ํ›„์— ํ˜ธ์ถœ๋œ๋‹ค. โ†’ ๋” ์ •ํ™•ํžˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ํ˜ธ์ถœ ํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.


  • afterCompletion
    • ๋ทฐ๊ฐ€ ๋ Œ๋”๋ง ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.
    • ์‹คํŒจ ์„ฑ๊ณต์˜ ์—ฌ๋ถ€์— ๊ด€๋ จ์—†์ด ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ๋œ๋‹ค.


ํ•˜์ง€๋งŒ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ์—๋Š” postHandle ์€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

afterCompletion์€ ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ๋˜๋Š”๋ฐ, ์ด๋–„ ์˜ˆ์™ธ์ •๋ณด(ex)๋ฅผ ํฌํ•จํ•ด์„œ ํ˜ธ์ถœ๋œ๋‹ค.


6. Interceptor ๊ตฌํ˜„ํ•˜๊ธฐ.

โ’ˆ HandlerInterceptor๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•œ๋‹ค.

โ’‰ ์ธํ„ฐ์…‰ํ„ฐ ๋“ฑ๋ก

1
2
3
4
5
6
7
8
9
10
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns("/css/**", "/*.ico","/error");
}


์ถ”๊ฐ€. Handler ๋ฉ”์†Œ๋“œ

1
2
3
4
// ํ˜ธ์ถœํ•  ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
if (handler isinstanceof HandlerMethod) {
		HandlerMethod hm = (HandlerMethod) handler;
}

ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด๋Š” ์–ด๋–ค ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง„๋‹ค.

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ @Controller, @RequestMapping์„ ํ™œ์šฉํ•œ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

์ด ๊ฒฝ์šฐ ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด๋กœ HandlerMethod๊ฐ€ ๋„˜์–ด์˜จ๋‹ค.

๋งŒ์•ฝ @Controller๊ฐ€ ์•„๋‹ˆ๋ผ ์ •์  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ResourceHttpRequestHandler๊ฐ€

ํ•ธ๋“ค๋Ÿฌ ์ •๋ณด๋กœ ๋„˜์–ด๊ณ ๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.



์ •๋ฆฌ

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์™€ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋งŒ ๋‹ค๋ฅด๊ณ , ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋น„์Šทํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ณ , ๋” ์ •๊ตํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง MVC๊ตฌ์กฐ์— ํŠนํ™”๋œ ํ•„ํ„ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

์Šคํ”„๋ง MVC๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ฅผ ๊ผญ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”

๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•˜๋‹ค.


์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.