Interceptor는 Controller의 핸들러가
실행되기 전이나 후에 추가적인 작업을 원할때나
메소드의 코드가 중복되는 부분이 있을때 Interceptor를 사용한다.
로그인 여부 확인, 등급별 서비스 사용권한 등에 주로 사용하곤 한다.
--------Interceptor 구현--------
Interceptor는
HandlerInterceptor 인터페이스를 구현하거나
HandlerInterceptorAdapter를 상속받은 클래스를사용해서
메소드를 구현한다.(둘은 크차이가 없다. 원하는걸로 선택하여 사용하자)
크게 인터셉터에는 3가지의 메소드가 있다
1. PreHandle : Controller의 메소드가 호출되기 전 호출,
이 메소드가 false를 반환하면 코드의 흐름이 중단된다.(PreHandle은 실행된 후 코드흐름종료)
2. postHandle : Controller의 메소드의 수행이 완료되고 view 처리를 수행하기전에 호출된다.
3. afterCompletion : view처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.
먼저 간단하게 사용법부터 알아보자.
먼저 HandlerInterceptor를 상속받은 케이스로 알아볼텐데
상속받는 클래스를 만들어주자.
public class TestInterceptor1 implements HandlerInterceptor{
// 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 true;
}
//Contoroller의 메소드가 호출되고 난 후 호출된다.
@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");
}
}
그 다음 interceptor를 사용하기 위해서는
ServletAppContext에 인터셉터를 등록하는 과정을 거쳐야한다.
//Spring MVC 프로젝트에 관련된 설정을 하는 클래스
@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다
@EnableWebMvc
//스캔할 패키지를 지정한다
@ComponentScan("kr.co.softcampus.controller")
public class ServletAppContext implements WebMvcConfigurer{
//인터셉터 등록.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addInterceptors(registry);
TestInterceptor1 inter1 = new TestInterceptor1();//인터셉터객체만들기
InterceptorRegistration reg1 = registry.addInterceptor(inter1);//인터셉터등록
reg1.addPathPatterns("/test1");//주소세팅
//주소를 세팅해야 그곳에 접속시 인터셉터가 실행된다.
}
}
이렇게 한다면 test1에 접속시에 콘솔에
이렇게 우리가 syso로 찍은것이 나오게 된다.
(Test1은 @GetMapping 안에 syso를 찍은것이다)
그리고 인터셉터가 2개이면
preHandle은 순서대로 출력되고
나머지2개인 postHandle과 afterCompletion은 역순으로 출력된다.
1,4 / 1,4,1,4 가 아닌
1,4 / 4,1,4,1 이렇게 된다
여러개를 쓸때는 ServletAppContext에서
reg4.addPathPatterns("/test1","/test2");
이런식으로 ,로 여러개를 사용해도 되고 배열로 넣어도 된다.
하지만 주의할점이 있다.
아무리 쉼표,나 배열로 해도 실제 프로젝트에 들어가게 되면
많게는 수백개의 주소가 존재할텐데 예를 들어
test1~test100까지 있다고 한다면 이것을 일일이 다 지정해주는 것은 굉장히
번거로운 과정이 될것이다.
그렇기때문에
spring에서는 패턴을 지정해주고 있다.
바로 이렇게 이다.
주소가 /a/b/c/d 이렇게 있으면 /*나 /a/* 이렇게 한덩어리에 pattern을 쓸수있다.
/a/**하면 /a 하위에 모든것을 지징하는것이다.
예를 들어 ServletAppContext 에서 이렇게사용할 수 있다.
//인터셉터 등록.
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
TestInterceptor6 inter6 = new TestInterceptor6();
InterceptorRegistration reg6 = registry.addInterceptor(inter6);
reg6.addPathPatterns("/**");
reg6.excludePathPatterns("/폴더이름/*");
}
이러면 **을 통해 모든경로에 인터셉터가 지정이 되면서
동시에 excludePathPatterns를 이용해서 특정폴더안에 있는 / *(모든것) 것만
인터셉터에서 제외되게 된다.
오늘은 스프링 인터셉터에 대해서 알아보았고
AOP개념을 적용해서 요청 주소를 감시하는 개념이라고 이해하면 된다.
주 사용법은 인터셉터가 요청흐름을 가로채서 원하는 처리를 할 수 있게 하는것이다.
사진과 코드에 핵심개념이 잘 녹아있으니
잘 살펴보자
Spring JDBC MyBatis 설정법 (0) | 2022.02.12 |
---|---|
스프링 예외처리 @ExceptionHandler, @ControllerAdvice 예제 (0) | 2022.02.07 |
스프링 유효성검사 properties error <form:form> (0) | 2022.02.02 |
스프링 Properties파일 Message로 등록하고 사용하기 예제 (0) | 2022.01.30 |
스프링 properties파일 예제 (이클립스 properties 에디터 설치) (0) | 2022.01.29 |
댓글 영역