Log 6

(AOP) 메세지 큐 요청/응답 로깅

이전 Filter 를 활용하여 Http 요청과 응답 값에 대한 로깅을 진행했었다.하지만, RabbitMQ 와 Kafka 등을 활용하게 되며 Http 요청 이외의 값에도 로깅이 필요하게 되었고, 최종적으로 AOP 를 활용해 이러한 코드를 구현하게 되었다.( 로깅을 위해서는 Filter ,Interceptor 를 활용할 수도 있으나, 이들은 Http 요청만을 가로챌 수 있다는 문제가 존재해 선택하지 않았다. )AOP 에서는 구현한 코드(메소드)를 어떤 시점에 작동시킬지 아래와 같은 메소드를 활용해 지정할 수 있다.Before 메소드를 실행하기 전 작동After메소드를 실행 후 작동AfterReturn메소드가 [정상] 실행 후 작동 ( 반환 값을 가져올 수 있음 )AfterThrowing메소드가 예외 처리 되..

Log 2025.05.11

로그 구분 ID 추가 logback-spring.xml + Filter

코드를 작성하고 테스트를 하거나 디버깅을 하는 과정에서 로그를 봐야하는 상황은 정말 많이 존재한다.하지만 이러한 로그에는 구분을 위한 ID 값이 존재하지 않기에 특정 로그를 찾는데 어렵다는 문제점이 존재하였다.이러한 사항 과정의 불편함을 줄이기 위해 각 로그 별로 특정 ID를 생성해 함께 출력하도록 하려 한다.로그에 ID 값을 출력하기 위해서는 로그 포맷을 변경해주어야 하는데, 기본 설정의 경우 아래와 같은 형식으로 로그가 출력되고 있을 것이다. 포맷 변경을 위해서는 application.yml 에서 간단하게 처리할 수 있으나, 세부적인 설정이 불가하기에 이번에는 logback-spring.xml 을 통해 변경해보도록 하겠다.logback-spring.xml 파일은 resources 아래에 생성해주면 된..

Log 2024.08.12

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