Spring MVC에서 응답을 쓰는 방식이 크게 두가지가 있다.
1. response.getWriter() - 문자 기반 응답
2. response.getOutputStream() - 바이트 기반 응답
한 번 getWriter()를 호출하면 내부적으로 OutputStream이 이미 사용된 것으로 간주되며, 그 이후에는 getOutputStream()을 사용할 수 없습니다, 반대도 마찬가지입니다.
GenericFilterBean만 상속받고 있다면, 다음과 같은 흐름에서는 여러 번 필터가 실행될 수 있습니다.
- 예외 처리 중 /error로 forward
- Servlet Dispatcher가 다시 요청 처리
이와 반대로
OncePerRequestFilter가 요청당 한 번만 필터를 실행하도록 자동으로 보장해 주는데, 내부에 그런 "중복 실행 방지 로직"이 구현되어 있기 때문이다.
때문에 OncePerRequestFilter는 이런 경우에 유용하다.
- 예외 처리로 인해 /error로 내부 forward 되는 경우
- DispatcherType.FORWARD, DispatcherType.ERROR로 필터 체인이 재실행되는 경우
- 보안 필터(JWT, 인증, IP 제한 등)처럼 요청당 한 번만 실행돼야 할 때
-> 참고로 OncePerRequestFilter는 GenericFilterBean을 상속받고 있다.
OncePerRequestFilter에는 ShouldNotFilter라는 메소드가 존재하며 이를통해 filter를 안타게끔 패스 지정을 할 수 있다.(REGEX 지정 가능)
'SpringBoot' 카테고리의 다른 글
Lombok getter (0) | 2024.10.07 |
---|