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 로 예외를 잡았다 가정한다.
- 인터셉터 로직 도중 예외 발생 -> 이건 pre, post, after 그냥 동작 안함.
- 컨트롤러 도중 예외 발생 -> 이 경우, 기존에 실행했던 핸들러가 정상적으로 동작이 끝난게 아니다. 따라서 post는 동작하지 않는다. pre, afterCompletion 은 동작.
- postHandler 에서 Header 를 추가하는 동작 -> 컨트롤러에서 null 을 반환한게 아닌 이상, 컨트롤러가 끝나면서 OutputStream 이 열리고 기본헤더가 작성된다. 이후 스트림을 열었다는 것을 isCommited 로 기록하여 관리하며, postHandler 에서 재작성할 수 없게 된다.
이 내용에 대해서는 포스팅을 따로 할 예정이다.
정상응답이든, 예외응답이든 모든 응답에 넣어줘야하는 공통 헤더가 있었는데 이를 사용하여 해결했다.
-> ResponseBodyAdvice 인터페이스를 구현한 클래스를 작성하여 해결할 수 있다.
두가지 메서드를 오버라이딩하게 되는데,
- support : 작업해야하는 response 를 boolean 형으로 판별.
- 이 메서드가 true 를 반환하면 작업을 수행.
- beforeBodyWrite : 하고자 하는 작업을 정의.
반대로 RequestBodyAdvice 도 있다.
https://chung-develop.tistory.com/61
'TIL' 카테고리의 다른 글
TIL) JPA 페이징, Json 응답시 Null 필드 제외, Envers (0) | 2021.10.18 |
---|---|
TIL) 깃 충돌, 예외 처리 전략, @CreatedDate vs @CreationTimeStamp (0) | 2021.10.17 |
TIL) 트래킹 브랜치, @RequestParam 디폴트, Kotlin any() (0) | 2021.10.15 |
TIL) 쿠키/세션, 코틀린 스트림 파이프라인, 정규식 (0) | 2021.10.14 |
TIL) @field:, getBy vs findby, jwt (0) | 2021.10.13 |