๐ ๊ฐ์
Spring MVC๋ฅผ ๊ณต๋ถํ๋ฉด์ DispatcherServlet์ด ์ํํ๋ ์ ์ฒ๋ฆฌ, ํ์ฒ๋ฆฌ ๊ณผ์ ์ค Interceptor๋ผ๋ ๊ธฐ๋ฅ์ด ์์ด ์ฌ์ฉํด๋ณด์๋ค.
์ธํฐ์ ํฐ๋ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ์ํด์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ํํ๋ ์์ ์ด๋ค.
๋ฐ๋ผ์ Interceptor๋ Spring MVC, Dispatcher Servlet Container ๋ด๋ถ์์ ์ํ๋๋ ์์ ์ด๊ณ ์ด์๋ ๋์กฐ์ ์ผ๋ก Filter๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋ฐ์์ ์ํ๋๋ ์์ ์ด๋ค.
๋ํ Filter๋ java์์ ๊ด๋ฆฌ๋๋ ํด๋์ค์ด์ง๋ง Interceptor๋ Spring MVC์์ ๊ด๋ฆฌ๋๋ค.
๐ ๋ณธ๋ก
Interceptor๋ HandlerInterceptor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ๋ง๋ค ์ ์๋ค.
HandlerInterceptor
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()
preHandle์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ๊ฒฐ์ ๋ ํธ๋ค๋ฌ๋ฅผ ์คํ์ํค๊ธฐ ์ด์ ์ ์ํํ๋ ์์ ์ด๋ค.
์ฌ๊ธฐ์ ํธ๋ค๋ฌ๋ผ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ Spring Boot๋ก ๋ง๋๋ Controller์ ํด๋นํ๋ค.
postHandle()
postHandle์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์คํํ ํธ๋ค๋ฌ๊ฐ ์ํ๋ ํ์ ์ํํ๋ ์์ ์ด๋ค.
์ฆ, ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ชจ๋ ์คํ๋ ์ดํ์ ์คํ๋๋ฏ๋ก HttpServletResponse๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ค.
afterCompletion()
afterCompletion์ ๋ชจ๋ ์์ฒญ์ด ๋ง๋ฌด๋ฆฌ ๋๊ณ ๋ทฐ๊ฐ ๋ ๋๋ง๋ ์ดํ์(๋ทฐ ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋ค๋ฉด) ์ํํ๋ ์์ ์ด๋ค.
๊ฐ์ฅ ๋ง์ง๋ง์ ์ํ๋๋ ์์ ์ด๋ฉฐ ์ด์ ์ ํธ๋ค๋ฌ๋ฅผ ๋งคํํ๋ ๊ณผ์ ์์ HandlerExecutionChain์ด ์กด์ฌํ์ ๊ฒฝ์ฐ์ preHandle์ ๋ฆฌํด ๊ฐ์ด true ์๋ค๋ฉด ์คํ๋๋ค.
์ข ๊น๋ค๋ก์ด ์กฐ๊ฑด์ด ์๋ค.
LoggingInterceptor
์ธํฐ์ ํฐ๋ฅผ ํตํด ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ๋ํ ๋ก๊น ์์ ์ ์ํํ ์ ์๋ค.
public class LoggingInterceptor implements HandlerInterceptor {
private final static Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null) ip = request.getRemoteAddr();
logger.info("URL :" + request.getRequestURL());
logger.info("METHOD : "+ request.getMethod());
logger.info("QueryString : " + request.getQueryString());
logger.info("Client : " + request.getRemoteAddr());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null) ip = request.getRemoteAddr();
logger.info("URL :" + request.getRequestURL());
logger.info("METHOD : "+ request.getMethod());
logger.info("QueryString : " + request.getQueryString());
logger.info("Client : " + request.getRemoteAddr());
logger.info("Process Result : "+response.getStatus());
}
}
ํด๋น ์ธํฐ์ ํฐ๋ preHandle๊ณผ afterCompletion์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์์ฒญ๊ณผ ์๋ต์ ๋ํ ๋ก๊ทธ ์์ ์ ์ํํ๋ค.
๋ฐ๋ผ์ ๊ฐ ์ปจํธ๋กค๋ฌ๋ ๋ก๊ทธ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ด์ง๋ค.
์ฆ, ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๊ฐํธํ๊ฒ ๋ฌถ์ด๋ผ ์ ์๋ค.
ํฌ์ธํธ ์ปท ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ AOP๊ฐ ๋ณต์กํ๊ณ ์ด๋ ต๋ค๋ฉด ๊ฐํธํ๊ฒ ์ธํฐ์ ํฐ๋ฅผ ํตํด์๋ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋ฌถ์ด๋ผ ์ ์๋ค.
WebConfiguration
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor());
}
}
๋ง์ง๋ง์ผ๋ก ์ธํฐ์ ํฐ๋ฅผ ๋ฑ๋กํด์ฃผ์ด์ผ ํ๋ค.
WebMvcConfigurer๋ฅผ ๊ตฌํํ์ฌ addInterceptor๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ ์ด๋ค ์ปจํธ๋กค๋ฌ์๋ง ์ ์ฉ์ํค๊ฑฐ๋ ์ ์ธ์ํฌ ์๋ ์๋ค.
๊ฒฐ๊ณผ
์ฝ๊ฒ ๋ก๊ทธ ์์ ์ ์ํํ ์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.!
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Test] Mockito when()๊ณผ given() ์ฐจ์ด (0) | 2024.01.29 |
---|---|
[Spring Boot] ์คํ๋ง ๋ถํธ HTTPS ์ ์ฉ ๋ฐฉ๋ฒ (1) | 2024.01.26 |
[Spring Boot] application.yml profile ๊ธฐ๋ฅ (1) | 2024.01.25 |
[Spring Boot] ์คํ๋ง ๋ถํธ์์ Spring MVC๋ฅผ ์๋ ์ค์ ํ๋ ๊ณผ์ (0) | 2024.01.20 |
[Spring Core] ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ (0) | 2024.01.15 |