필터 4

Filter 로그 처리 후 Controller에 요청 전달하기

이번 글에서 활용할 Filter 코드는 아래와 같다.( 해당 코드에 대한 설명과 과정은 아래 글을 참고 )https://taekt.tistory.com/12@Slf4j@Componentpublic class LogFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { ContentCachingRequestWrapper requestWrapper = new ContentCaching..

Log 2024.08.08

Filter doFilter, ContentCachingWrapper, copyBodyToResponse 사용 이유 및 예시

이전 Filter를 이용해 응답/요청 로그를 출력하는 과정에서 doFilter, ContentCachingWrapper, copyBodyToResponse 를 왜 사용하는 것인지, 사용하지 않으면 발생하는 문제를 예시와 함께 설명하기 위한 글이다.이해를 돕기 위해 사용할 Controller 코드이다.@RequestMapping("/api")@RestController@Slf4jpublic class Controller { @PostMapping("/test") public String test(@RequestBody String a){ log.info("Controller : " + a); return a; }}우선 요청 값을 그대로 읽어 출력하는 코드를 작성해보..

Log 2024.08.06

ContentCachingRequestWrapper 동작 원리

ContentCachingRequestWrapper은 요청의 응답을 단 한 번 밖에 읽지 못 하기에 이를 여러번 사용할 수 있도록 해준다. 다만 여기에는 여러가지 조건과 제약이 있는데 이를 살펴보자.ContentCachingRequestWrapper를 사용하기 위해 보통 아래와 같은 방식을 사용하는데, 처음 이를 사용할 때 ContentCachingRequestWrapper는 request 값을 캐싱하여 담아두는 , 복사해둔다는 개념만 알았기에 선언과 동시에 이 값이 저장이 되는 것으로 생각하고 있었다.하지만 이를 자세히 살펴보면 , 선언과 동시에 저장되는 것은 request 값의 length뿐, 그 값은 저장이 되지 않은 것을 볼 수 있다.실제로 데이터를 저장하는 것은 값을 read 할 때이며, 때문에..

Log 2024.08.04

스프링부트 Filter를 이용한 로그(Request,Response ) 출력

스프링부트에서 로그 관리를 위해서는 크게 Filter, Interceptor,AOP 를 활용할 수 있다.이중 Interceptor와 AOP는 스프링 내부에서 동작하는 반면, Filter는 스프링 외부에서 동작하여 스프링 내에서 가공되기 전 요청과, 가공된 후의 응답 값을 가져와 읽을 수 있다는 장점이 있어 이번에는 Filter를 활용하여 Request와 Response의 값을 로그로 출력해보려한다.우선 로그를 출력하기 위해 아래 의존성을 추가해준다.( lombok이 아닌 다른 의존성 혹은 방법을 사용해도 무관하다 )implementation 'org.projectlombok:lombok'당연하게도 로그를 띄우기 위해서는 외부에서 전달 받은 Request 값을 스프링으로 보내기 전 무조건 한 번은 읽어야 ..

Log 2024.08.02