์คํ๋ง ์ธํฐ์ ํฐ(Interceptor)
by rlaehddnd0422์คํ๋ง ์ธํฐ์ ํฐ
์๋ฐ ํ์ค์คํ์ด ์ ๊ณตํ๋ ์๋ธ๋ฆฟ ํํฐ์ฒ๋ผ ์น๊ณผ ๊ด๋ จ๋ ๊ณตํต ๊ด์ฌ์ฌํญ์ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ธฐ์ ์ ๋๋ค.
์ธํฐ์ ํฐ ํน์ง
- ์ธํฐ์ ํฐ๋ ์๋ธ๋ฆฟ ํํฐ์ ํ๋ฆ๊ณผ ๋น์ทํ ํ๋ฆ์ ๊ฐ์ ธ๊ฐ๋๋ค.
ํํฐ : HTTP Request โถ๏ธ WAS โถ๏ธ ํํฐ โถ๏ธ ์๋ธ๋ฆฟ( ํ๋ก ํธ ์ปจํธ๋กค๋ฌ, ๋์คํจ์ณ ์๋ธ๋ฆฟ ) โถ๏ธ ์ปจํธ๋กค๋ฌ
์ธํฐ์ ํฐ : HTTP Request โถ๏ธ WAS โถ๏ธ ์๋ธ๋ฆฟ โถ๏ธ ์คํ๋ง ์ธํฐ์ ํฐ โถ๏ธ ์ปจํธ๋กค๋ฌ
- ์คํ๋ง ์ธํฐ์ ํฐ์๋ URL ํจํด์ ์ ์ฉํ ์ ์๋๋ฐ, ์๋ธ๋ฆฟ URL ํจํด๊ณผ ๋ค๋ฅด๊ณ , ๋งค์ฐ ์ ๋ฐํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
- ์ธํฐ์ ํฐ ๋ํ ์ฒด์ธ์ผ๋ก ๊ตฌ์ฑ๋์ด ์ค๊ฐ์ ์ธํฐ์ ํฐ๋ฅผ ์์ ๋กญ๊ฒ ์ถ๊ฐ ๊ฐ๋ฅ (ex)๋ก๊ทธ ์์ฒญ ์ธํฐ์ ํฐ -> ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ์ธํฐ์ ํฐ)
์๋ธ๋ฆฟ ํํฐ vs ์คํ๋ง ์ธํฐ์ ํฐ
- ํํฐ๋ ์๋ธ๋ฆฟ์ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ ๊ณผ ํ์ ๋ถ๊ฐ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ธํฐ์ ํฐ๋ ์๋ธ๋ฆฟ์ ์์ฒญ์ด ์ ๋ฌ๋๊ณ ๋์ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ๊ณผ ํธ์ถํ๊ณ ๋ ํ์ ์์ฒญ์ ๋ํ ๋ถ๊ฐ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์คํ๋ง ์ธํฐ์ ํฐ ์ธํฐํ์ด์ค
์คํ๋ง์ ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด 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()์ ๋ฆฌํด๊ฐ์ด true์ด๋ฉด ๋ค์์ผ๋ก ์งํ, false๋ฉด ๋ ์ด์ ์งํํ์ง ์์ต๋๋ค.
postHandle()
- ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ) ํธ์ถ ํ์ ํธ์ถ๋ฉ๋๋ค. ( ์๋ฐํ ๋งํ๋ฉด ํธ๋ค๋ฌ ์ด๋ํฐ ํธ์ถ ํ)
- ์ปจํธ๋กค๋ฌ์์ ์์ธ ๋ฐ์ ์์๋ ์คํ๋์ง ์๊ณ afterCompletion์ผ๋ก ๋์ด๊ฐ๋๋ค.
- ํ๋ผ๋ฏธํฐ๋ก ModelAndView๊ฐ ๋์ด์ค๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ด๋ ๋ทฐ์ ์ถ๊ฐ์์ ์ ํ ์ ์์ต๋๋ค.
afterCompletion()
- ๋ทฐ๊ฐ ๋ ๋๋ง ๋ ์ดํ ํธ์ถ๋ฉ๋๋ค.
- ํญ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ Exception์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ปจํธ๋กค๋ฌ์์ ์ด๋ค Exception์ด ๋ฐ์ํ๋์ง ๋ก๊ทธ๋ก ์ถ๋ ฅํ ์๋ ์๊ณ , Exception์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์คํ๋ง ์ธํฐ์ ํฐ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
- WebMvcConfigurer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค ๋ด๋ถ์์ addInterceptors(InterceptorRegistry registry)๋ฅผ Overrideํฉ๋๋ค.
- ์ด ๋ registry์ ๋ฉ์๋๋ฅผ ํตํด ์ธํฐ์ ํธ๋ฅผ ์ถ๊ฐ, ์ ์ฉ์์, ์ ์ฉ URL ํจํด, ์์ธ URL ํจํด์ ์ง์ ํ ์ ์์ต๋๋ค.
registry.addInteceptor(์ถ๊ฐํ ์ธํฐ์
ํฐ)
.order(์ ์ฉ ์์)
.addPatterns("์ ์ฉํ URL ํจํด")
.excludePathPatterns("์ ์ฉํ์ง ์์ ์์ธ URL ํจํด")
๋ก๊ทธ์์ฒญ์ ๋ํ ์ธํฐ์ ํฐ
@Slf4j
public class LogInterceptor implements HandlerInterceptor {
- HandlerInterceptor ์ธํฐํ์ด์ค ๊ตฌํ
public static final String LOG_ID = "logId";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception
{
log.info("------------------------------");
String requestURI = request.getRequestURI();
String uuid = UUID.randomUUID().toString();
request.setAttribute(LOG_ID,uuid);
if (handler instanceof HandlerMethod)
{
HandlerMethod hm = (HandlerMethod) handler;
Method method = hm.getMethod();
log.info("Method {}",method);
}
log.info("REQUEST [{}][{}][{}]", uuid, requestURI, handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception
{
log.info("postHandle [{}]", modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception
{
String requestURI = request.getRequestURI();
String logId = (String)request.getAttribute(LOG_ID);
log.info("RESPONSE [{}][{}]", logId, requestURI);
// ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ์์ธ ๋๊ฒจ ๋ฐ์์ ๊ฒฝ์ฐ
if (ex != null) {
log.error("afterCompletion error!!", ex);
}
log.info("------------------------------");
}
preHandle()
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception
{
log.info("------------------------------");
String requestURI = request.getRequestURI();
String uuid = UUID.randomUUID().toString();
request.setAttribute(LOG_ID,uuid);
if (handler instanceof HandlerMethod)
{
HandlerMethod hm = (HandlerMethod) handler;
Method method = hm.getMethod();
log.info("handler {}, Method {}",handler,method);
}
log.info("REQUEST [{}][{}][{}]", uuid, requestURI, handler);
return true;
}
- ํํฐ์์๋ ์ง์ญ๋ณ์๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ์ง๋ง, ์ธํฐ์ ํฐ๋ ํธ์ถ ์์ ์ด ์์ ํ ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์, preHandle์์ ์ง์ ํ ๊ฐ์ postHandle, afterCompletion์์ ํจ๊ป ์ฌ์ฉํ๋ ค๋ฉด ์ด๋๊ฐ์ ๋ด์๋์ด์ผ ํฉ๋๋ค. LogInterceptror๋ ์ฑ๊ธํค์ฒ๋ผ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํํ๊ธฐ ๋๋ฌธ์ request์ ๋ด์๋์์ต๋๋ค.
- HandlerMethod : ์คํ๋ง์์ @Controller๋ @RequestMapping์ ํ์ฉํ ํธ๋ค๋ฌ ๋งคํ์ ์ฃผ๋ก ์ฌ์ฉํ๋๋ฐ ์ด ๊ฒฝ์ฐ ํธ๋ค๋ฌ ์ ๋ณด๋ก HandlerMethod๊ฐ ๋์ด์ต๋๋ค.
- ResourceHttpRequestHandler : @Controller๊ฐ ์๋ ์ ์ ๋ฆฌ์์ค๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ ResourceHttpRequestHandler๊ฐ ํธ๋ค๋ฌ ์ ๋ณด๋ก ๋์ด์ต๋๋ค.
์ธํฐ์ ํฐ ์ ์ฉ
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**","/*.ico","/error");
๋ก๊ทธ์ธ ์ธ์ฆ ์ฒดํฌ ์ธํฐ์ ํฐ
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(false);
if(session==null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null)
{
response.sendRedirect("/login?redirectURL" + request.getRequestURI());
return false;
}
return true;
}
}
preHandle์์ ์ธ์ ์ ํตํด ์ธ์ ์ ์ป์ด ์ธ์ ์ด ์์ ์กด์ฌํ์ง ์๊ฑฐ๋ ๋ก๊ทธ์ธ ๋ฉค๋ฒ์ ๋ํ ์ธ์ ์ด ์์ผ๋ฉด ๋ฆฌ๋ค์ด๋ ์
+ redirectURL์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ ๋ก๊ทธ์ธ ์ดํ ์ฒ์์ ์์ฒญํ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ์ค์
- true : ์ปจํธ๋กค๋ฌ ํธ์ถ
- false: ์ปจํธ๋กค๋ฌ ํธ์ถํ์ง ์๊ณ ์ข ๋ฃ
์ธํฐ์ ํฐ ์ ์ฉ
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**","/*.ico","/error");
registry.addInterceptor(new LoginCheckInterceptor())
.order(2)
.addPathPatterns("/**")
.excludePathPatterns("/","/login","/logout","/members/add","/css/**","/*.ico","/error");
}
<์ ๋ฆฌ>
- ์๋ธ๋ฆฟ ํํฐ์ ์คํ๋ง ์ธํฐ์ ํฐ๋ ์น๊ณผ ๊ด๋ จ๋ ๊ณตํต ๊ด์ฌ์ฌ๋ฅผ ํด๊ฒฐํ๋๋ฐ ํจ๊ณผ์ ์ ๋๋ค.
- ๊ฐ๋ฐ์ ์ ์ฅ์์๋ ์คํ๋ง ์ธํฐ์ ํฐ๊ฐ ํํฐ๋ณด๋ค ํจ์ฌ ํธ๋ฆฌํ๋ฏ๋ก ์คํ๋ง ์ธํฐ์ ํฐ๋ฅผ ์ฐ๋ ๊ฒ์ ์ ํธํฉ์๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://blog.naver.com/PostView.naver?blogId=sosow0212&logNo=222869514885&navType=by
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring - ์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ ( Exception ) (0) | 2023.03.28 |
---|---|
ArgumentResolver ํ์ฉ (0) | 2023.03.24 |
Servlet Filter(์๋ธ๋ฆฟ ํํฐ) (0) | 2023.03.24 |
๋ก๊ทธ์ธ ์ฒ๋ฆฌ - ์ฟ ํค, ์ธ์ (0) | 2023.03.23 |
Bean Validation - ๊ฒ์ฆ ์ด๋ ธํ ์ด์ ์ฌ์ฉ (0) | 2023.03.22 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422