본문 바로가기
개인 공부/TIL

TIL : @Async, @EnableAsync (24)

by 희조당 2024. 6. 12.
728x90

Spring Async

비동기 처리를 나타내는 @Async에는 proxy target 옵션이 존재한다.

처리 모드가 프록시일 때만 설정할 수 있는 옵션인데, true라면 CGLIB로, false라면 동적 프록시로 생성한다.

 

두 방법 모두 프록시를 사용하므로 당연히 상속을 사용하는데, CGLIB는 subclass 기반이고 동적 프록시는 interface 기반이다.

여기서 CGLIB는 바이트 코드 기반으로 생성하기 때문에 성능적으로 약간 낫다.

 

@Async가 아닌 커스텀 어노테이션을 등록해서도 사용할 수 있다.

@EnableAsync 속성에 annotation 필드가 바로 이 옵션이다.

 

비동기를 사용하기 앞서 thread pool의 사이즈, queue 사이즈를 정해서 하나의 Executor를 빈으로 등록한다.

pool은 재고를 미리 쌓아두는 것과 같으므로 비용을 고려해야 한다. (Context switching)

 

API에 따라 요구하는 pool의 크기가 다를 수 있는데, 이때 빈을 여러 개 등록하면 된다.

@Configuration
public class AsyncConfiguration {

    @Bean(name = "fcm")
    public Executor fcmExecutor() {
        // ...
    }

    @Bean(name = "mail")
    public Executor mailExecutor() {
        // ...
    }
}

그러면 다음과 같이 사용할 수 있다.

@Service
public class AsyncService {

    @Async("fcm")
    public void sendFcm(...) {
        // ...    
    }

    @Async("mail")    
    public void sendMail(...) {
        // ...    
    }
}

 


Reference:

https://docs.spring.io/spring-framework/docs/5.0.2.RELEASE/kdoc-api/spring-framework/org.springframework.scheduling.annotation/-enable-async/

 

😋 지극히 개인적인 블로그지만 댓글, 조언 그리고 좋아요는 제 성장에 도움이 됩니다 😋

댓글