상세 컨텐츠

본문 제목

스프링 Interceptor

Spring

by shika 2022. 2. 6. 23:50

본문

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개념을 적용해서 요청 주소를 감시하는 개념이라고 이해하면 된다.

주 사용법은 인터셉터가 요청흐름을 가로채서 원하는 처리를 할 수 있게 하는것이다.

 

사진과 코드에 핵심개념이 잘 녹아있으니 

잘 살펴보자

관련글 더보기

댓글 영역