์์ํ๊ธฐ์ ์์
ํํฐ๋ ์๋ธ๋ฆฟ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๊ณ , ์ธํฐ์ ํฐ๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ด๋ฅผ ์๊ณ ๊ณต๋ถ๋ฅผ ์์ํด๋ณด๋๋ก ํ์.
์๋ธ๋ฆฟ ํํฐ
ํํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ๋ฑ๊ณผ ๊ฐ์, ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ณตํต์ ์ผ๋ก ๊ด์ฌ์ด ์๋ ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ด๋ค.
์คํ๋ง AOP๋ก๋ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ์น๊ณผ ๊ด๋ จ๋ ๊ณตํต ๊ด์ฌ์ฌ๋ ํํฐ ๋๋ ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์น๊ณผ ๊ด๋ จ๋ ๋ก์ง์ ์ฒ๋ฆฌํ ๋์๋ HTTP์ ์ ๋ณด๊ฐ ํ์ํ๋ฐ, ํํฐ๋ ์ธํฐ์ ํฐ๋ HttpServletRequest, HttpServletResponse๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํํฐ์ ํ๋ฆ
Http ์์ฒญ -> WAS -> ํํฐ -> (๋์คํจ์ฒ)์๋ธ๋ฆฟ -> ์ปจํธ๋กค๋ฌ
ํํฐ๋ฅผ ํธ์ถํ ๋ค์์ ์๋ธ๋ฆฟ์ด ํธ์ถ๋๊ธฐ ๋๋ฌธ์, ์์ฒญ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ฅ ๋ฑ์ ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ํํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค.
ํํฐ์ ์ ํ
Http ์์ฒญ -> WAS -> ํํฐ -> ์๋ธ๋ฆฟ -> ์ปจํธ๋กค๋ฌ //์ ์ ํ๋ฆ
Http ์์ฒญ -> WAS -> ํํฐ (์ข ๋ฃ) //์ ์ ํ์ง ์์ ์์ฒญ์ด๋ผ ํ๋จ๋ ๊ฒฝ์ฐ, ์๋ธ๋ฆฟ ํธ์ถ X
ํํฐ ์ฒด์ธ
Http ์์ฒญ -> WAS -> ํํฐ1 -> ํํฐ2 -> ํํฐ3 -> ์๋ธ๋ฆฟ -> ์ปจํธ๋กค๋ฌ
ํํฐ๋ ์ฒด์ธ์ผ๋ก ๊ตฌ์ฑ๋์ด, ์ค๊ฐ์ ํํฐ๋ฅผ ์์ ๋กญ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค.
ํํฐ ์ธํฐํ์ด์ค
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
1. init : ํํฐ ์ด๊ธฐํ ๋ฉ์๋, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์์ฑ๋ ๋ ํธ์ถ๋๋ค.
2. doFilter : ๊ณ ๊ฐ์ ์์ฒญ์ด ์ฌ ๋ ๋ง๋ค ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ํํฐ์ ๋ก์ง์ ์์ฑํ๋ค.
3. destroy : ํํฐ ์ข ๋ฃ ๋ฉ์๋, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋ ํธ์ถ๋๋ค.
(์ฐธ๊ณ ๋ก ํํฐ๋ฅผ ๋ฑ๋กํ๋ฉด, ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํํฐ๋ฅผ ์ฑ๊ธํค ๊ฐ์ฒด๋ก ์์ฑํ๊ณ ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์ฃผ์ํด์ผ ํ๋ค.)
ํํฐ ๋ฑ๋ก
ํํฐ๋ฅผ ๋ฑ๋กํ ๋์๋ FilterRegistrationBean์ ์ฌ์ฉํ์ฌ ๋ฑ๋กํ๋ค.
@Bean
public FilterRegistrationBean filter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new ๋ฑ๋กํ ํํฐ);
filterRegistrationBean.setOrder(์์, ๋ฒํธ๊ฐ ๋ฎ์์๋ก ๋จผ์ ์คํ);
filterRegistrationBean.addUrlPatterns("์ ์ฉํ URL");
return filterRegistrationBean;
}
์คํ๋ง ์ธํฐ์ ํฐ
์คํ๋ง ์ธํฐ์ ํฐ๋ ํํฐ์ ๋น์ทํ ๊ธฐ๋ฅ์ ์ํํ๋ค.
๊ทธ๋ฌ๋ ์ ์ฉ๋๋ ์์์ ๋ฒ์, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ํํฐ์ ๋ค๋ฅธ๋ฐ, ์ง๊ธ๋ถํฐ ์์๋ณด์.
์ธํฐ์ ํฐ์ ํ๋ฆ
Http ์์ฒญ -> WAS -> ํํฐ -> ๋์คํจ์ฒ ์๋ธ๋ฆฟ -> ์คํ๋ง ์ธํฐ์ ํฐ -> ์ปจํธ๋กค๋ฌ
์คํ๋ง ์ธํฐ์ ํฐ๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ๊ณผ ์ปจํธ๋กค๋ฌ ์ฌ์ด์์ ์ปจํธ๋กค๋ฌ ํธ์ถ ์ง์ ์ ํธ์ถ๋๋ค.
์คํ๋ง ์ธํฐ์ ํฐ๋ ์คํ๋ง MVC๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋์คํจ์ฒ ์๋ธ๋ฆฟ ์ดํ์ ๋ฑ์ฅํ๊ฒ ๋๋ค.
์ธํฐ์ ํฐ์ ์ ํ
Http ์์ฒญ -> WAS -> ํํฐ -> ์๋ธ๋ฆฟ -> ์คํ๋ง ์ธํฐ์ ํฐ -> ์ปจํธ๋กค๋ฌ //์ ์ ํ๋ฆ
Http ์์ฒญ -> WAS -> ํํฐ -> ์๋ธ๋ฆฟ -> ์คํ๋ง ์ธํฐ์ ํฐ (์ข ๋ฃ)//์ ์ ํ์ง ์์ ์์ฒญ์ด๋ผ ํ๋จ๋ ๊ฒฝ์ฐ, ์ปจํธ๋กค๋ฌ ํธ์ถ X
์ธํฐ์ ํฐ์ ์ฒด์ธ
Http ์์ฒญ -> WAS -> ํํฐ -> ์๋ธ๋ฆฟ -> ์ธํฐ์ ํฐ1 -> ์ธํฐ์ ํฐ2 -> ์ปจํธ๋กค๋ฌ
์คํ๋ง ์ธํฐ์ ํฐ ์ธํฐํ์ด์ค
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 {
}
}
- preHandle : ์ปจํธ๋กค๋ฌ ํธ์ถ ์ ์ ํธ์ถ
- postHandle : ์ปจํธ๋กค๋ฌ ํธ์ถ ํ์ ํธ์ถ
- afterCompletion : ์์ฒญ ์๋ฃ ์ดํ
์ธํฐ์ ํฐ์ ๊ฒฝ์ฐ ์ด๋ค ์ปจํธ๋กค๋ฌ(handler)๋ฅผ ํธ์ถํ๋์ง์ ๋ํ ์ ๋ณด๋ ๋ฐ์ ์ ์๋ค.
์ธํฐ์ ํฐ ์์ธ ๋ฐ์ ์
์ปจํธ๋กค๋ฌ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ปจํธ๋กค๋ฌ ํธ์ถ ํ์ ํธ์ถ๋๋ postHandle์ ํธ์ถ๋์ง ์๋๋ค.
afterCompletion์ ์์ธ๊ฐ ๋ฐ์ํด๋ ํธ์ถ๋๋๋ฐ, ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ๋์ง ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ๋ก๊ทธ๋ก ์ถ๋ ฅํ ์ ์๋ค.
์ธํฐ์ ํฐ ๋ฑ๋ก
์ธํฐ์ ํฐ๋ WebMvcConfigurer์ ๊ตฌํํ ํ, addInterceptors๋ฅผ Overrideํ์ฌ ๋ฑ๋กํด์ฃผ๋ฉด ๋๋ค.
@Configuration
public String WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**","/*.ico");
}
}
๐ Reference