Spring MVC 핸들러 인터셉터
Spring Web MVC
백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글
핸들러 인터셉터
핸들러 인터셉터는 핸들러 매핑에 설정할 수 있는 인터셉터이다.
HandlerMapping의 역할은 어떤 요청을 처리할 핸들러를 찾아주는 역할을 담당한다.
핸들러 매핑에 인터셉터를 등록하면 핸들러 매핑이 찾아주는 핸들러에 핸들러 인터셉터들을 적용해준다.
핸들러 인터셉터를 사용하면 특정 핸들러를 실행하기 전,후로 어떠한 처리가 가능하다.
preHandle : 전처리를 담당하는 메소드
boolean preHandle(request, response, handler)
핸들러를 실행하기 전에 호출
핸들러에 대한 정보를 사용할 수 있기 때문에 서블릿 필터에 비해 보다 세밀한 로직을 구현할 수 있음
리턴값으로 계속 다음 인터셉터 또는 핸들러로 요청,응답을 전달할지(true) 응답 처리가 이곳에서 끝났는지 (false)를 반환 여기서 false를 반환하면 afterCompletion까지 가지 않음.
postHandle : 후처리를 담당하는 메소드
void postHandle(request,response, modelAndView)
핸들러 실행이 끝나고 아직 뷰를 렌더링 하기 이전에 호출
뷰에 전달할 추가적이거나 여러 핸들러에 공통적인 모델 정보를 담는데 사용할 수 있다.
이 메소드는 prehandler 인터셉터의 역순으로 호출된다. (가령 prehandle이 2개가 존재하고 1번이 먼저 실행되고 2번이 실행되면, postHandle과 afterCompletion은 2번이 실행되고 1번이 실행된다.)
비동기적인 요청 처리 시에는 preHandle과 afterCompletion이 호출되지 않는다. 대신 다른 핸들러가 호출된다. 이후 다루게 될 예정
afterCompletion : 뷰 랜더링까지 완전히 끝난 후 처리하는 메소드
void afterCompletion(request, response, handler, ex)
요청 처리가 완전히 끝난 뒤(뷰 렌더링이 모두 끝난 뒤)에 호출
preHandle에서 true를 리턴한 경우에만 호출
이 메소드는 postHandle과 마찬가지로 역순으로 호출
비동기적인 요청 처리시에는 호출되지 않음
VS 서블릿 필터
서블릿 보다 구체적인 처리가 가능하다.
서블릿은 보다 일반적인 용도의 기능을 구현하는데 사용하는게 좋다.
Spring MVC의 로직에 특화된 경우라면 인터셉터를 사용하는게 낫다.
Reference
인프런 백기선님의 스프링 Web MVC