본문 바로가기

Spring

[Spring Boot] Rest API 만들기(5) 비동기 예외 처리

@Async를 활용한 비동기 방식을 사용하게 되면 예외 상황에서 요청에 대한 응답으로 에러를 받지 못하기 때문에 별도의 처리를 하지 않으면 서버 로그에만 에러가 남게 되고 모르고 넘어가는 경우가 있습니다.

이전 포스팅에서 예외상황을 @RestControllerAdvice 활용하여 한 곳에서 관리하도록 구현하였는데 비동기 상황에서도 동일하게 한 곳에서 예외처리를 하는 방법에 대해 알아보겠습니다.

 

 

 

1. Async Config 설정

아래 어노테이션을 설정하여 비동기 프로세스에 대해 설정을 추가합니다.

 - @Configuration: 설정 클래스임을 명시

 - @EnableAsync: 비동기 활성화, @Async 어노테이션 사용 가능

 

package kr.co.sample.sampleapi.common.config.async;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {
    @Autowired
    private AsyncUncaughtExceptionHandler asyncExceptionHandler;

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return asyncExceptionHandler;
    }
}

 

 

 

 

 

2. AsyncUncaughtExceptionHandler 구현

지난 포스팅에 추가한 공통 Exception Handler에 추가하여 비동기 예외상황에 대해 처리할 수 있습니다.

 

package kr.co.sample.sampleapi.common.response;

import kr.co.sample.sampleapi.common.enums.ExceptionEnum;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.nio.file.AccessDeniedException;

@RestControllerAdvice
public class ApiExceptionAdvice implements AsyncUncaughtExceptionHandler {
    @Override
    public void handleUncaughtException(Throwable e, Method method, Object... params) {
        e.printStackTrace();
    }
   ... (생략)
 }