비동기 처리
포스트
취소

비동기 처리

비동기 처리를 위한 서비스 Class 만드는 방법

  1. 비동기 처리를 위한 Class 파일을 만든다.
  2. 비동기 처리를 시킬 메소드를 만든다.
    • 필요 어노테이션
      • @Async
    • 반환타입
      • CompletableFuture
    • 리턴형식
      • return new AsyncResult(실행할_메소드()).completable();
    • 예시 )
        @Async
        public CompletableFuture run() {
            return new AsyncResult(helloWolrd()).completable();
        }
        public String helloWolrd() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello World !";
        }
        

※ 비동기 처리를 진행한 결과를 확인하기 위해 서비스의 메소드는 주로 ListenableFuture나 CompletableFuture 형식으로 결과를 반환한다.

※ 주로 return new AsyncResult(결과물) 형식으로 값을 전달한다.

※ completable() 메소드 : ListenableFuture 객체를 CompletableFuture로 변환해서 리턴한다.

※ AsyncResult의 completable() 메소드는
AsyncResult는 기본적으로 ListenableFuture 인터페이스를 구현하고 있기 때문에
해당 결과를 CompletableFuture 형태로 바꾸기 위해 사용한다.

비동기 처리 로직 적용 방법

  1. @SpringBootApplication 어노테이션이 있는 클래스에 가서 @EnableAsync 어노테이션을 추가한다.
  2. 컨트롤러에 가서 메소드를 작성한다.
    • 예외처리를 반드시 추가한다.
    • 예시 : InterruptedException, ExecutionException 등등
  3. 해당 메소드의 return을 비동기 처리를 위해 작성한 Service의 @Async 메소드를 반환한다.
    • 예시
        @GetMapping("/api/test/async/listenableFuture")
        public ListenableFuture<Integer> listenableFuture() throws InterruptedException, ExecutionException {
            return asyncService.listenableFuture(10000);
        }
        

Custom Thread

  1. Thread 용으로 사용할 Class를 만든다.
  2. 반환형이 Executor인 메소드를 만든다.
  3. ThreadPoolTaskExecutor 필드를 만들어 준다.
  4. ThreadPoolTaskExecutor의 메소드를 통해서 Thread에 대한 설정을 한다.
  5. 해당 객체를 return 시켜준다.
  6. 해당 메소드에 @Bean(“Thread명”)을 추가해준다.

※ @Async 어노테이션의 name 속성에 Thread Bean의 명시해주면
해당 Thread를 사용하도록 할 수 있다.

  • 예시)
    @Configuration
    public class AppConfig {
        @Bean("asyncThread")
        public Executor asyncThread(){
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(100);
            executor.setQueueCapacity(10);
            executor.setThreadNamePrefix("Async-");
            return executor;
        }
    }
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.