728x90

Interceptor

AOP를 적용한 Spring MVC의 요소

Interceptor는 요청 주소에 대해 관심을 갖고 요청이 발생하면 요청주소를 확인해서 Controller의 메소드를 호출하기 전이나 후에 다른 메소드를 호출할 수 있도록 가로채가는 것.

 

즉 원래는 A를 요청해서 ControllerA로 매핑된 메소드를 호출해야 하지만 Interceptor가 가로채가서 interceptor가 처리한 후 Controller로 갈지 아니면 그대로 끝낼지를 정할 수 있다.

 

요청 발생시 호출되는 메소드의 코드가 중복되는 부분이 있을 떄 Interceptor를 통해 처리하게 된다. 예를들어 AB 요청에 연결된 각각의 ControllerC라는 중복된 코드가 있을 때, interceptor에서 C를 처리한 후 AB로 넘기면 간편하게 처리할 수 있다.

 

로그인 여부 확인, 등급별 서비스 사용 권한 확인 등의 작업을 처리할 떄 사용한다.

 

Interceptor 구현

InterceptorHandlerInterceptor 인터페이스를 구현하거나 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("/*");

728x90

'프로그래밍 > 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

+ Recent posts