Why?
- 자바에서 기본적인 비동기 처리를 위해 Runnable Interface를 구현하여 Thread 클래스를 생성하여 사용
new Thread(new Runnable() {
@Override
public void run() {
// do something
}
}).start();
- 스프링에서 비동기 처리를 효율적으로 관리하기 위해 @Async Annotation을 제공
- 함수나 타입에 해당 어노테이션을 사용하여 비동기 처리 가능
- 비동기 처리를 호출 한 부분에서 결과 값에 대하여 유연한 처리
What is 비동기?
- 비동기란 특정 업무 처리 X를 요청한 A가 해당 요청(X)이 끝날 때까지 기다리는 것이 아닌 업무 요청 후 또 다른 본인의 업무를 수행하는 것
비동기 처리 개발 시 유의 사항
- 스레드 풀 관리
- 반환 값 Handling
- 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() 사용함
참고
'자바 개발자되기' 카테고리의 다른 글
리팩토링과 TDD (0) | 2020.12.19 |
---|---|
Junit 병렬 테스트와 Thread Safe - Junit @Execution (0) | 2020.12.16 |
자바 스터디 3주차 : 연산자 (0) | 2020.11.27 |
자바 문자열 결합 (0) | 2020.11.23 |
자바 스터디 2주차 : 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법 (0) | 2020.11.20 |