Interceptor
AOP를 적용한 Spring MVC의 요소
Interceptor는 요청 주소에 대해 관심을 갖고 요청이 발생하면 요청주소를 확인해서 Controller의 메소드를 호출하기 전이나 후에 다른 메소드를 호출할 수 있도록 가로채가는 것.
즉 원래는 A를 요청해서 Controller의 A로 매핑된 메소드를 호출해야 하지만 Interceptor가 가로채가서 interceptor가 처리한 후 Controller로 갈지 아니면 그대로 끝낼지를 정할 수 있다.
요청 발생시 호출되는 메소드의 코드가 중복되는 부분이 있을 떄 Interceptor를 통해 처리하게 된다. 예를들어 A와 B 요청에 연결된 각각의 Controller에 C라는 중복된 코드가 있을 때, interceptor에서 C를 처리한 후 A와 B로 넘기면 간편하게 처리할 수 있다.
로그인 여부 확인, 등급별 서비스 사용 권한 확인 등의 작업을 처리할 떄 사용한다.
Interceptor 구현
Interceptor는 HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdapter를 상속받은 클래스를 만들고 다음 메소드를 구현해야 한다.
preHandle : Controller의 메소드가 호출되기 전 호출된다. 이 메소드가 false를 반환하면 코드의 흐름이 중단된다.
postHandle : Controller의 메소드의 수행이 완료되고 view처리를 수행하기 전에 호출된다
afterCompletion : view 처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.
pre, post, after 실행 순서
pre는 위에부터 순서대로 실행되지만, post는 역순으로 진행된다.
TestInterceptor1 - preHandle
TestInterceptor2 - preHandle
test1
TestInterceptor2 - postHandle
TestInterceptor1 - postHandle
TestInterceptor2 - afterCompletion
TestInterceptor1 - afterCompletion
ServletAppContext에서 인터셉터를 등록한다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
TestInterceptor7 inter7 = new TestInterceptor7();
InterceptorRegistration reg1 = registry.addInterceptor(inter1);
reg1.addPathPatterns("/test1");
}
이런식으로 등록한다.
인터셉트할 경로는 아래처럼 패턴 방식으로 지정할 수 있다.
첫번쨰는 sub1 이하의 한 경로에만 인터셉터를 적용하고 **는 모든 곳, exclue는 저 경로를 제외한 곳을 인터셉트한다는 뜻이다.
reg7.addPathPatterns("/sub1/*");
reg7.addPathPatterns("/**");
reg7.excludePathPatterns("/*");
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] RestController (0) | 2020.04.07 |
---|---|
[Spring] 예외 처리 (0) | 2020.04.06 |
[Spring] Validator 커스터마이징 (0) | 2020.04.03 |
[Spring] JSR-380 오류들 (0) | 2020.04.03 |
[Spring] JSR-303 오류들 (0) | 2020.04.03 |