PostIT

[Spring/Java]HandlerInterceptorAdapter, Pre,Post, afterCompletion Handler 본문

Spring/Etc

[Spring/Java]HandlerInterceptorAdapter, Pre,Post, afterCompletion Handler

shun10114 2016. 10. 31. 11:05
https://gs.saro.me/#!m=elec&jn=810

서론
최근에 서버와 클라이언트 양쪽에 템플릿 엔진이 있는 것들을 찾아보다가 스프링 부트에 기본적으로 있는 mustache 가 있다는 것을 알았습니다.
- mustache : https://gs.saro.me/#!m=elec&jn=796
문제는 i18n이나 시큐리티, session 같은 경우 타임리프나 JSTL 처럼 사용할만한 방법이 없어 찾아보던 중 HandlerInterceptorAdapter를 사용해 보았습니다.
- 물론 모델이 매번 넣어주는 방법도 있겠지만 유지보수도 안좋고 자원도 심하게 망가짐으로...


WebMvcConfigurerAdapter
- http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/handler/HandlerInterceptorAdapter.html
preHandle
- DispatcherServlet 이 컨트롤을 호출하기 전에 호출.
- false 가 리턴된경우 더 이상 전파가 중지되며 현재 상태로 종료됨
(preHandle 가 일종의 서블릿처럼 쓰이고 더이상 전파가 안된다고 보면됨 : 컨트롤에 가지않음)
postHandle
- 컨틀롤러가 불린 후 불립니다.
- 때문에 ModelAndView 객체를 가지고 있으면 추가적으로 작업할 수 있습니다.
afterCompletion
- DispatcherServlet 의 모든 작업이 끝나고 전달될 때 불립니다.
- postHandle 와 달리 실행도중 오류가 나더라도 반환이 됩니다.
좀 더 정확히 preHandle true 리턴 이 후 부터 컨트롤, 호스트, 렌더등... 최종 필터를 통해 나가기 전까지 오류여부에 상관없이 반환됩니다.
(일반적으로 오류가 없다면 가장 마지막에 반환됩니다.)
- 때문에 파라미터는 Exception 을 포함합니다.'

예제 : HandlerInterceptorAdapter
- postHandle 를 이용하여 message를 매칭시키는 예제를 사용해 보도록 하겠습니다.

  1. @Component
  2. public class MessageInterceptor extends HandlerInterceptorAdapter
  3. {
  4. @Autowired
  5. MessageSource messageSource;
  6. @Autowired
  7. LocaleResolver localeResolver;
  8. // 필자가 필요한건 ModelAndView 가 만들어진 후.
  9. @Override
  10. public void postHandle
  11. (
  12. HttpServletRequest request, HttpServletResponse response,
  13. Object handler, ModelAndView modelAndView
  14. ) throws Exception
  15. {
  16. // 객체가 있는지 확인한다.
  17. if (modelAndView != null)
  18. {
  19. final Locale locale = localeResolver.resolveLocale(req);
  20. modelAndView.addObject("message", new Mustache.Lambda()
  21. {
  22. // 예를들어 "message" 로 입력한 경우 message 로시작된것들을 찾는다.
  23. // mustache 기준으로 {{message.*}} 로 되어있는 것을 찾는다.
  24. public void execute(Template.Fragment frag, Writer out) throws IOException
  25. {
  26. // frag.execute()는 찾는 값을 가져온다.
  27. // 예를들어 message.abc 를 찾았다면, 기준점으로 뒤에있는 abc 를 반환한다.
  28. // messageSource 아래 별도 설명 i18n 문서 참고.
  29. out.write(messageSource.getMessage(frag.execute(), null, locale));
  30. }
  31. });
  32. }
  33.  
  34. super.postHandle(request, response, handler, modelAndView);
  35. }
  36. }
위 예제는 뷰안에 위치한 "message" 하위의 모든 attr을 찾아 frag.execute() 를 통해 attr의 이름을 확인 하고 out.write 를 통해 값을 써주게 됩니다.
i18n / messageSource / localeResolver 는 아래 문서를 참고해주세요.
https://gs.saro.me/#!m=elec&jn=798


예제 : WebMvcConfigurerAdapter
따로 설명이 필요없을 것 같습니다.
작성한 MessageInterceptor 를 포함하여 줍니다.
  1. @Configuration
  2. public class WebMvcConfig extends WebMvcConfigurerAdapter
  3. {
  4. @Autowired
  5. MessageInterceptor messageInterceptor;
  6.  
  7. @Override
  8. public void addInterceptors(InterceptorRegistry registry)
  9. {
  10. registry.addInterceptor(messageInterceptor);
  11. }
  12. }



Comments