Skip to content

Commit

Permalink
예외 로깅 내용 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
greeng00se committed Sep 19, 2023
1 parent 576e3f8 commit 0267fd5
Showing 1 changed file with 10 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ tags: [async, exception]

### 비동기 예외 발생시 로깅 설정

Spring에서 지원해 주는 AsyncUncaughtExceptionHandler 인터페이스를 구현해서 예외를 처리하는 클래스를 생성했다.
스프링 4.1 부터 제공되는 [AsyncUncaughtExceptionHandler](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/interceptor/AsyncUncaughtExceptionHandler.html)의 경우 반환 타입이 void인 비동기 메서드를 예외 처리하기 쉽도록 도와준다.

따라서 AsyncUncaughtExceptionHandler 구현해서 예외를 핸들링하는 클래스를 생성했다.
기존의 동기 예외 처리의 경우 예외가 발생할 때 실행 흐름을 추적하기 위해 MDC(Mapped Diagnostic Context)를 사용하고 있다.
비동기 예외 처리의 경우에도 마찬가지로 MDC의 정보를 가져와서 로그를 출력하도록 설정했다.

```java title=AsyncExceptionHandler
@Slf4j
Expand Down Expand Up @@ -41,15 +45,15 @@ public class AsyncConfig implements AsyncConfigurer {
}
```

이제 예외가 발생하는 경우 AsyncUncaughtExceptionHandler의 구현체인 AsyncExceptionHandler가 예외를 잡아서 처리를 해준다.
이제 비동기 상황에서 예외가 발생하는 경우 AsyncUncaughtExceptionHandler의 구현체인 AsyncExceptionHandler가 예외를 잡아서 처리를 해준다.

### MDC 정보 연동 문제

트립드로우의 애플리케이션은 예외가 발생할 때 실행 흐름을 추적하기 위해 MDC(Mapped Diagnostic Context)를 사용하고 있다. 비동기 처리의 경우 별도의 스레드에서 동작하기 때문에 ThreadLocal 기반으로 동작하는 MDC의 정보를 얻어올 수 없었다.
비동기 처리의 경우 별도의 스레드에서 동작하기 때문에 ThreadLocal 기반으로 동작하는 MDC의 정보를 얻어올 수 없었다.

![./mdc-null.png](./mdc-null.png)

Spring 4.3 이상부터 제공되는 [TaskDecorator](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html)를 이용하면 TaskExecutor를 커스터마이징 할 수 있다. TaskDecorator를 구현한 클래스를 하나 생성하고, Task가 실행되기 전 MDC의 정보를 복사하도록 설정한다.
스프링 4.3 이상부터 제공되는 [TaskDecorator](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html)를 이용하면 TaskExecutor를 커스터마이징 할 수 있다. TaskDecorator를 구현한 클래스를 하나 생성하고, Task가 실행되기 전 MDC의 정보를 복사하도록 설정한다.

```java title=MdcTaskDecorator
public class MdcTaskDecorator implements TaskDecorator {
Expand Down Expand Up @@ -106,4 +110,5 @@ public class AsyncConfig implements AsyncConfigurer {
[spring async, baeldung](https://www.baeldung.com/spring-async)
[@Async will not call by @ControllerAdvice for global exception](https://stackoverflow.com/questions/61885358/async-will-not-call-by-controlleradvice-for-global-exception)
[Spring 의 동기, 비동기, 배치 처리시 항상 context 를 유지하고 로깅하기, 강남언니](https://blog.gangnamunni.com/post/mdc-context-task-decorator/)
[TaskDecorator, Spring docs](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html)
[TaskDecorator, Spring docs](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/task/TaskDecorator.html)
[AsyncUncaughtExceptionHandler](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/aop/interceptor/AsyncUncaughtExceptionHandler.html)

0 comments on commit 0267fd5

Please sign in to comment.