본문 바로가기

TIL

TIL) 인터셉터

1. Spring interceptor

API 명세에 따른 개발중, 모든 요청에 따라 특정 헤더, 파라미터를 검사, 조작후 모든 응답에 뿌려주는 작업이 있었다.

 

인터셉터는 필터와 다르게 Spring 컨텍스트에 등록되기 때문에, @ControllerAdvisor 로 예외를 잡을 수 있다는 이점에 사용하였다.

 

구현하는 방법에는 두가지가 있다.

  • HandlerInterceptorAdapter 추상클래스 구현
  • HandlerInterceptor 인터페이스 구현

두 경우 모두 아래의 세가지 메서드를 오버라이딩할 수 있다.,

  • preHandle
  • postHandle
  • afterCompletion

HandlerInterceptor 인터페이스의 경우, 인터페이스라 모든 메서드를 굳이 구현해야할 것 같고

반면 추상메서드는 필요한 메서드만 골라서 구현하면될 것 같지만,

 

HandlerInterceptorAdapter 는 스프링 5.3 부터 deprecated 되었다.

HandlerInterceptor 인터페이스에 메서드들이 default 메서드로 작성되어 있기에, 인터페이스를 써도 원하는것만 골라 오버라이딩할 수 있다. 인터페이스를 사용하자.

 

 

 

인터셉터 구현이 끝나면 빈으로 등록후 WebMvcConfigurerAdapter 를 상속하여 config 클래스를 만들고 @Configuration 을 붙인다.

addInterceptors 를 오버라이딩해서 해당 빈을 등록하고, 적용할 Url 을 지정한다.

 

url 에서 * 과 ** 의 차이

* 는 / 로 구분된 한칸
만약 /* 라면 /a, /b, /c 등은 만족하지만, /a/b 는 만족하지 못함.

** 는 뒤에 정말 무엇이든 상관없는 것.
/a, /a/b/c/d/e 모두 가능.

 

 

 

 

2. 컨트롤러, 인터셉터에서 예외 발생시 공통헤더, 파라미터 처리하기

인터셉터의 postHandler 는 약간 까다로웠다.

자바독에  Called after HandlerAdapter actually invoked the handler 라고 명시되어 있다. 즉 핸들러 (컨트롤러) 의 요청이 정상적으

로 끝난 상황에 불리운다.

아래 상황은 모두 @ExceptionHandler 로 예외를 잡았다 가정한다.

 

  1. 인터셉터 로직 도중 예외 발생 -> 이건 pre, post, after 그냥 동작 안함.
  2. 컨트롤러 도중 예외 발생 -> 이 경우, 기존에 실행했던 핸들러가 정상적으로 동작이 끝난게 아니다. 따라서 post는 동작하지 않는다. pre, afterCompletion 은 동작.
  3. postHandler 에서 Header 를 추가하는 동작 -> 컨트롤러에서 null 을 반환한게 아닌 이상, 컨트롤러가 끝나면서 OutputStream 이 열리고 기본헤더가 작성된다. 이후 스트림을 열었다는 것을 isCommited 로 기록하여 관리하며, postHandler 에서 재작성할 수 없게 된다.

이 내용에 대해서는 포스팅을 따로 할 예정이다.

 

정상응답이든, 예외응답이든 모든 응답에 넣어줘야하는 공통 헤더가 있었는데 이를 사용하여 해결했다.

 

-> ResponseBodyAdvice 인터페이스를 구현한 클래스를 작성하여 해결할 수 있다.

두가지 메서드를 오버라이딩하게 되는데,

  • support : 작업해야하는 response 를 boolean 형으로 판별.
    • 이 메서드가 true 를 반환하면 작업을 수행.
  • beforeBodyWrite : 하고자 하는 작업을 정의.
반대로 RequestBodyAdvice 도 있다.

https://chung-develop.tistory.com/61

 

[Spring]스프링에서 공통 Response처리 하기(@ControllerAdvice 이용)

[Spring]스프링에서 공통 Response처리 하기(@ControllerAdvice 이용하기) 스프링 프로젝트를 진행하다 보면 응답값 response에 대하여 공통적인 처리를 해야할 때가 있다. 필자의 경우 처음에는 interceptor

chung-develop.tistory.com