본문 바로가기

Spring

spring 에서 @Async 어노테이션 사용하기(비동기)

728x90
반응형
SMALL

 

spring에서 @Async 를 이용하여 비동기로 서버를 구축할 수 있다.

[AsyncConfig.java]

@EnableAsync
public class AsyncConfig {
    @Bean
    public Executor getAsyncExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(8);
        executor.setMaxPoolSize(8);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("test-pool-");
        executor.initialize();
        return executor;
    }



}

먼저 비동기를 위한 기본 세팅을 해준다.

 

기본적으로 쓰는 메소드

setCorePoolSize
ThreadPoolExecutor가 인스턴스 되면서 기본적으로 띄울 스레드 개수. 아무작업이 없어도 corePoolSize만큼 스레드가 생성됨
setMaxPoolSize
ThreadPool 최대개수, queueCapa까자 꽉 차는 경우 maxPoolSize 만큼 넓혀감.
setQueueCapacity
스레드 대기큐, 큐카파가 꽉차면 스레드가 추가로 생성됨.
setThreadNamePrefix
스레드에 사용할 이름, ThreadPool이 여러군데에서 관리되면 알아보기 쉽게 사용. SpringBoot의 SimpleLoggingFormat4Java에서 이 이름으로 보여준다.

[AsyncController.java]

@RestController
@Slf4j
@RequiredArgsConstructor
public class AsyncController {
    private final AsyncService asyncService;

    @GetMapping("/test")
    private String test(){
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            asyncService.createDummy(i);
        }
        log.info("성능 시간 :" + (System.currentTimeMillis() - startTime)+ "ms");
        log.info("성능 시간 :" + (System.currentTimeMillis() - startTime)+ "ms");
        log.info("성능 시간 :" + (System.currentTimeMillis() - startTime)+ "ms");
        log.info("성능 시간 :" + (System.currentTimeMillis() - startTime)+ "ms");
        log.info("성능 시간 :" + (System.currentTimeMillis() - startTime)+ "ms");
        return "h2";
    }
}

[AsyncService.java]

@Service
public class AsyncService {

    private static final Logger logger = LoggerFactory.getLogger(AsyncService.class);

    @Async //비동기로 할건지안할건지 핵심 어노테이션
    public void createDummy(int i) {
        logger.info("Async-test : {}",i);
    }
}

결과.

 

@Async 사용하기 전.

for 문으로 돌린 값들이 순서대로 로그에 찍히는 것을 볼 수 있다.

 

@Async 사용 한 후

로그 왼쪽에 test-pool 이라는 텍스트뒤에 붙는 숫자 (1 ~ 8) 에서만 왓다갔다 하는데

아까전 위에 설정해줬던

executor.setMaxPoolSize(8);

이 코드가 최대 쓰레드 사이즈를 8로 지정해놨기때문에, 그안에서만 쓰레드 할당하는것을 볼 수 있다.

또한 로그 맨오른쪽 숫자들도 순서가 뒤죽박죽 각자 처리를 기다리지않고 비동기로 바로바로 처리되는것을 알수있다.

 

728x90
반응형
LIST