[Spring MVC] Interceptor (Java 설정, Xml 설정)
Interceptor
Spring MVC에서 Interceptor란 스프링에 AOP개념을 Spring MVC에 적용한 것으로 등록한 특정 관심사(요청)의 호출 앞 뒤에 미리 설정해 놓은 코드를 호출하는 기법을 의미한다.
클라이언트가 요청을 서버로 보내면 서버에서 요청명에 매핑된 메서드의 호출 앞 뒤로 미리 만들어 놓은 코드를 호출하는 개념이다.
Interceptor는 웹 페이지에서 로그인 여부를 확인하는 등 여러 방면에서 사용되며 세팅 법은 Java 파일로 설정하는 방법과 Xml파일에 설정하는 방법 2가지가 있다.
두 세팅 방법은 Interceptor를 등록하는 방법만 차이가 있을 뿐 구현하는 방법은 같다.
Interceptor의 구현과 메서드
Interceptor의 구현 방법에는 HandlerInterceptor 인터페이스를 구현하거나 HnadlerInterceptorAdapter 클래스를 상속받는 방법 2가지가 있으며 스프링 4 버전까지는 두 구현 방법의 메서드가 추상 메서드여서 모두 구현해주어야 했지만 스프링 버전 5부터는 원하는 메서드만을 구현할 수 있다.
// HandlerInterceptor 인터페이스를 구현하는 방법
public class TestInterceptor1 implements HandlerInterceptor{
}
// HandlerInterceptorAdapter 클래스를 상속 받는 방법
public class TestInterceptor2 extends HandlerInterceptorAdapter{
}
Interceptor의 메서드는 크게 preHandle, postHandle, afterCompletion으로 나뉜다.
preHandle은 관심사가 호출되기 전에 먼저 호출되는 메서드이고, postHandle은 관심사가 호출된 이후에 호출되며, afterCompletion은 View 작업이 완료된 후 즉, 클라이언트에게 보여줄 JSP파일을 구성한 후에 작동하게 되는 메서드이다.
// 관심사로 지정한 Controller의 메서드가 호출되기 전에 호출
// false를 반환하면 요청 처리에 대한 진행이 중단
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("TestInterceptor1 - preHandle");
return false;
}
※ preHandle 메서드의 반환 값이 false를 리턴하게 되면 코드에 흐름이 중단되는 된다.
// 관심사로 지정한 Controller의 메서드가 호출되고 난 후에 호출
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("TestInterceptor1 - postHandle");
}
// View 처리까지 완료되면 호출.
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("TestInterceptor1 - afterCompletion");
}
postHandle 메서드와 afterCompletion은 관심사에 등록된 인터셉터가 많다면 코드가 역순으로 동작한다.
즉 test 1이라는 메서드가 동작할 때 interceptor1과 interceptor2라는 인터셉터가 작동하도록 설정했다면 test 1의 메서드가 호출된 후 interceptor2의 postHandle과 afterCompletion이 동작한 후 interceptor1의 postHandle과 afterCompletion이 동작하게 된다.
여러 인터셉터를 동일한 관심사에 설정해 놓고 System.out.println()으로 로그를 찍어보면 역순으로 동작한다는 것을 확인할 수 있다.
Interceptor 설정 (Java 파일)
Interceptor 설정을 Java 파일로 하기 위해선 자바 파일로된 스프링 설정 파일에서 addInterceptors 클래스를 오버라이딩해서 설정해야 한다.
그 후 인터셉터를 구현한 클래스를 등록하여 사용한다.
// Intercepter 등록
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addInterceptors(registry);
// 1. 인터셉터를 구현한 클래스의 객체를 생성
TestInterceptor1 inter1 = new TestInterceptor1();
// 2. 생성한 객체를 인터셉터로 등록
InterceptorRegistration reg1 = registry.addInterceptor(inter1);
// 3.관심사 등록
reg1.addPathPatterns("/test1");
}
우선 인터셉터를 구현한 클래스의 객체를 생성하고 IntercpetorRegistration 클래스를 이용하여 생성한 객체를 인터셉터로 등록한다.
그 후 등록할 인터셉터가 동작할 관심사(요청)을 설정해준다.
관심사를 설정할 때는 패턴을 제공하는데 아래와 같다.
- /* : 이름 하나를 의미하며 글자수, 글자 등 제한 없음
- /? : 글자하나를 의미
- /** : 하위 이름까지 포함하여 글자 수, 글자 등 제한 없음
예를 들어 모든 메서드에 인터셉터를 동작시키고 싶다면 addPathPatterns("/**")로 등록해주면 된다.
※ 만약 제외하고 싶은 요청명이 있다면 excludePathPatterns 메서드를 호출하여 제외할 요청명을 적어주면 된다.
Interceptor 설정 (Xml)
만약 Java 파일로 하는 설정이 아닌 Xml 파일의 설정이라면 아래를 참고하면 된다.
스프링 설정 Xml 파일에서 interceptors 태그를 이용하여 구현한 인터셉터 Bean을 등록한다.
<interceptors>
<!-- 인터셉터 1 -->
<interceptor>
<!-- 관심사(호출명) 등록 -->
<mapping path="/test1"/>
<beans:ref bean="등록해 놓은 Bean의 이름"/>
</interceptor>
<!-- 인터셉터 2 -->
<interceptor>
<mapping path="/test2"/>
<beans:bean class="Bean의 패키지포함 이름" />
</interceptor>
<interceptor>
<mapping path="/test2"/>
<beans:ref bean="inter1"/>
</interceptor>
<!-- 인터셉터 3 -->
<interceptor>
<mapping path="/**"/>
<exclude-mapping path="/*"/>
<beans:bean class="Bean의 패키지포함 이름" />
</interceptor>
</interceptors>
<interceptors> 태그 안에 인터셉터들을 등록할 수 있으며 <mapping> 태그에는 관심사(호출 명)를 등록하고,
인터셉터를 구현한 Bean은 <beans:ref> 태그 혹은 <beans:bean> 태그안에 등록할 수 있으며,
관심사(호출 명)을 등록할 때의 패턴은 자바 파일의 패턴과 동일하다.
Interceptor는 자바 설정 방식과 Xml 설정 방식이 인터셉터를 등록하는 방법만 차이가 있을 뿐 구현하는 방법을 동일하기 때문에 원하는 방법을 사용하면 된다.
본 포스팅은 필자가 공부한 내용을 정리한 포스팅으로 오류가 존재할 수 있습니다.
참고 : 인프런 - 만들면서 배우는 Spring MVC5