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๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ธ๋ฆฟ ํํฐ๋ฅผ ๊ผญ ์ฌ์ฉํด์ผํ๋ ์ํฉ์ด ์๋๋ผ๋ฉด ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ๋
๊ฒ์ด ๋ ํธ๋ฆฌํ๋ค.