LinkedIn

Spring @Async - 비동기 처리

2020. 12. 6. 14:55 | 자바 개발자되기

Why?

  • 자바에서 기본적인 비동기 처리를 위해 Runnable Interface를 구현하여 Thread 클래스를 생성하여 사용
        new Thread(new Runnable() {
            @Override
            public void run() {
                // do something
            }            
        }).start();
  • 스프링에서 비동기 처리를 효율적으로 관리하기 위해 @Async Annotation을 제공
    • 함수나 타입에 해당 어노테이션을 사용하여 비동기 처리 가능
    • 비동기 처리를 호출 한 부분에서 결과 값에 대하여 유연한 처리

 

What is 비동기?

  • 비동기란 특정 업무 처리 X를 요청한 A가 해당 요청(X)이 끝날 때까지 기다리는 것이 아닌 업무 요청 후 또 다른 본인의 업무를 수행하는 것

비동기 처리 개발 시 유의 사항

  1. 스레드 풀 관리
  2. 반환 값 Handling
  3. Exception 처리

1. 스레드 풀 관리

  • 스레드 풀과 관련된 설정(maxPoolSize ...)은 프로퍼티를 사용하여 관리

 

2. 반환 값 Handling

2.1 반환 값이 존재하는 경우

  • 반환 값이 존재하는 경우 "반환 값 Return 대기""반환 값 처리에 대한 Callback 등록" 존재

2.1.1 반환 값 Return 대기

	protected Object doSubmit(Callable<Object> task, AsyncTaskExecutor executor, Class<?> returnType) {
		if (CompletableFuture.class.isAssignableFrom(returnType)) {
			return CompletableFuture.supplyAsync(() -> {
				try {
					return task.call();
				}
				catch (Throwable ex) {
					throw new CompletionException(ex);
				}
			}, executor);
		}
		else if (ListenableFuture.class.isAssignableFrom(returnType)) {
			return ((AsyncListenableTaskExecutor) executor).submitListenable(task);
		}
		else if (Future.class.isAssignableFrom(returnType)) {
			return executor.submit(task);
		}
		else {
			executor.submit(task);
			return null;
		}
	}
  • @Async 어노테이션은 스프링 AOP의 기능을 사용하며 내부 핵심 로직을 보면 위와 같이 returnType에 따라 분류되며 리턴 데이터가 존재하는 경우에 Future 인터페이스를 사용
    • Future 인터페이스는 비동기 처리의 결과를 표현하기 위해 사용
  • 즉, 반환 값을 사용하기 위하여 Future 인터페이스의 get() 함수를 사용
    • get() 함수를 호출하여 반환 값을 대기하는 순간부터 blocking 발생

2.1.2 반환 값 처리에 대한 Callback 등록

  • callback 등록을 위해서는 Future 인터페이스를 상속하고 있는 ListenableFuture 인터페이스의 addCallback() 사용
  • 콜백 함수는 non blocking 처리

 

2.2 반환 값이 존재하지 않는 경우

  • 반환 값이 존재하지 않는 경우는 반환받을 데이터가 없기 때문에 별도의 처리 X

 

3. Exception 처리

  • Exception Handler 등록은 Asynconfig Class의 getAsyncUncaughtExceptionHandler() 사용함

참고

brunch.co.kr/@springboot/401