Interceptor
스프링 인터셉터
스프링 인터셉터(Spring Interceptor)란 요청이 처리되는 시점들을 간섭할 수 있도록 만들어진 AOP 객체를 말한다. 다음 클래스들을 제공한다.
Interface
HandlerInterceptor
Class
HandlerInterceptorAdapter
(비추천)
간섭이란 해당 시점의 진행 상황을 살펴보거나 변조할 수 있도록 가로채는 것을 말한다. 인터셉터를 통해 간섭할 수 있는 시점은 다음과 같다.
preHandle
: 요청이 핸들링(연결)되기 전. 즉, 컨트롤러 실행 전postHandle
: 요청이 핸들링(연결)된 후. 즉, 컨트롤러 실행 후afterCompletion
: 요청에 대한 처리가 최종적으로 완료된 후. 즉, View 생성 후afterConcurrentHandlingStarted: Servlet 3.0부터 가능한비동기 요청 처리방식의 경우postHandle,afterCompletion대신 실행 (비추천)
인터셉터 클래스 작성 및 등록
인터셉터 클래스 생성
인터셉터는 다음과 같이 생성한다.
인터셉터 등록
Spring boot에서는 인터셉터를 WebMvcConfigurer
클래스를 상속 받은 설정 클래스에 구현한다. WebMvcConfigurer
인터페이스를 상속받은 뒤 @Configuration
으로 설정 클래스임을 명시하면 제공되는 메소드를 통해 운영 설정을 수행할 수 있다.
생성된 인터셉터에 등록한 인터셉터를 주입한다.
주입된 인터셉터를 재정의한 설정 메소드에 추가한다.
완성된 코드는 다음과 같다.
제공되는 매개변수 InterceptorRegistry
에는 인터셉터와 관련된 정보, 기능들이 존재하며 이 중 addInterceptor 메소드를 이용하여 인터셉터를 추가한다. 또한 addPathPattern 메소드와 excludePathPattern 메소드를 통해 간섭할 대상 매핑을 설정하거나 제외시킬 수 있다.
Mapping url 작성규칙
Interceptor의 Mapping을 작성할 때에는 다음의 내용을 유의해야 한다.
와일드카드(*)를 사용할 수 있다.
와일드카드(*)의 개수가 1개인지 2개인지에 따라 의미가 달라진다.
1개인 경우는 현재 endpoint 내에서 어떤 글자가 와도 상관없다는 의미이다.
2개인 경우는 현재 endpoint와 하위 전체에서 어떤 글자가 와도 상관없다는 의미이다.
매핑 작성 예시(1)
위와 같이 path를 /member*
로 지정하면 엔드포인트(endpoint)는 /
로 설정된다.
따라서 다음 주소들이 매핑된다.
/member
/member_info
/memberlist
하위 엔드포인트 주소는 포함되지 않는다.
/member/info
/member/regist
/member/list
매핑 작성 예시(2)
위와 같이 path를 /member/*
로 지정하면 엔드포인트(endpoint)는 /member/
로 설정된다.
따라서 다음 주소들이 매핑된다.
/member/info
/member/regist
/member/list
다음 주소들은 매핑되지 않는다.
/member
/member_info
/memberlist
/member/list/1
/member/search/module
매핑 작성 예시(3)
위와 같이 path를 /member/**
로 지정하면 엔드포인트(end-point)는 /member/
로 설정된다.
**
는 /
를 포함할 수 있으므로 다음 주소들이 매핑된다.
/member/info
/member/regist
/member/list
/member/list/1
/member/find/id/test
다음 주소들은 매핑되지 않는다.
/member
/member_info
/memberlist
인터셉터 메소드 분석
인터셉터의 각각 메소드를 분석하여 어떠한 행위를 할 수 있는지 파악해본다.
preHandle
반환 형태
boolean
: 요청의 통과(continue) 여부를 반환할 수 있다.true
반환 시 통과 ,false
반환 시 차단된다.
매개 변수
HttpServletRequest
: 요청 정보를 가지고 있는 객체이다.HttpServletResponse
: 응답 정보를 가지고 있는 객체이다.Object
: 실행될 대상의 정보를 가지고 있는 객체이다.(일반적으로 컨트롤러의 매핑 메소드)
postHandle
반환 형태
void
: 이 메소드는 어떠한 결과도 전달할 수 없다.
매개 변수
HttpServletRequest
: 요청 정보를 가지고 있는 객체이다.HttpServletResponse
: 응답 정보를 가지고 있는 객체이다.Object
: 실행된 대상의 정보를 가지고 있는 객체이다.(일반적으로 컨트롤러의 매핑 메소드)ModelAndView
: 처리 완료 후의Model
과View
의 정보를 가진 객체이다.
afterCompletion
반환 형태
void
: 이 메소드는 어떠한 결과도 전달할 수 없다.
매개 변수
HttpServletRequest
: 요청 정보를 가지고 있는 객체이다.HttpServletResponse
: 응답 정보를 가지고 있는 객체이다.Object
: 실행된 대상의 정보를 가지고 있는 객체이다.(일반적으로 컨트롤러의 매핑 메소드)Exception
: 페이지 렌더링 시 발생한 예외 정보를 가진 객체이다.
afterConcurrentHandlingStarted
AsyncHandlerInterceptor
를 이용하여 사용할 것을 권장한다.
Object Handler의 활용
Handler를 이용하면 다음 작업들을 처리할 수 있다.
실행될(또는 실행된) 대상의
유형
확인실행될(또는 실행된) 대상의
Annotation Type
확인그 외 해당 대상의 정보 분석(매개변수, 반환형, 이름, 등...)
Object Handler를 이용하여 대상의 Annotation 정보 읽어오는 코드
이를 응용하면 Custom Annotation
을 만들어두고 이를 검사하여 원하는 작업을 처리하도록 하는 등의 작업을 구현할 수 있다.
Last updated