스프링 비동기 처리

Date:     Updated:

카테고리:

태그:

비동기 처리를 이해하기 위해 알면 좋은 개념

Process - 실행중인 프로그램
- OS에 의해 메모리 공간을 할당받아 실행
- 프로그램에 사용되는 데이터, 메모리 등의 자원과 Thread로 구성
Thread - 프로세스 내에서 작업을 수행하는 주체
- CPU를 점유하는 최소단위 (Thread를 사용하지 않으면 최소 단위는 Process가 된다!)
- 모든 Process 내에는 한 개 이상의 Thread가 존재하여 작업 수행 (Process내에 두 개 이상의 Thread가 존재하면 멀티스레드 프로세스라고 부른다!)
- LWP ( Light Weight Process - Process에 비해 가벼움 )

Thread 구현 방법 (양자택일 X)

User Thread

- User-level에서 라이브러리로 구현
→ 컴파일시 라이브러리를 링크해서 같이 컴파일
- Java Thread, POSIX Pthread, window Thread

Kerner Thread

- Kerner-level에서 kernel이 지원하는 thread
- Linux, window, solaris

User thread - Kernel thread mapping

Many-To-One

- kerner thread를 만들 때 같이 생성되는 Process 안에 여러개의 User thread를 만듦
- 하나의 thread가 block되면 모든 thread가 block 됨

One-To-One

- 하나의 user thread를 만들면 하나의 kerner thread가 자동으로 mapping 됨

Many-To-Many

- OS가 kerner thread를 만들고 사용자가 user thread를 만들면 만들어 놓은 kernel thread에 mapping
- user thead의 수가 kernel thread의 수보다 많거나 같음
Thread Pool - 스레드를 미리 만들어 놓은 하나의 집합
- 작업 요청이 늘어나도 스레드의 전체 개수가 늘어나지 않음
→프로그램 성능 저하 방지
- 크기를 너무 크게 지정하면 메모리 낭비 야기함
image

스프링 부트 비동기 처리

AsyncConfigurerSupport

  • AsyncConfigurer를 구현할 때 상속 받는 class
  • getAsyncExecutor()
    • Executor 메소드를 호출하여 비동기 처리를 할 때 이 메소드를 오버라이드 하여 thread pool 등을 재설정 가능

ThreadPoolTaskExecutor

  • setCorePoolSize
    • ThreadPoolExecutor의 코어 풀 크기 설정
    • 기본적으로 관리할 Thread 숫자
  • setMaxPoolSize
    • core pool과 queue가 다 찼을 때 최대로 생성할 Thread 숫자
    • 기본값은 Integer.MAX_VALUE
  • setQueueCapacity
    • core pool이 다 찼을 때(core pool의 크기를 넘어서는 tesk가 들어왔을 때) tesk가 쌓일 수 있는 갯수
      @Configuration
      @EnableAsync// spring 메소드 비동기 기능 활성화
      public class AsyncConfig extends AsyncConfigurerSupport{
      
      @Override
      public Executor getAsyncExecutor(){
          ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
          //기본적으로 실행 대기하는 thread의 갯수 설정
          executor.setCorePoolSize(2);
          //동시동작하는 최대 Thread pool 크기
          executor.setMaxPoolSize(10);
          //thread pool que 크기
          executor.setQueueCapacity(500);
          // spring이 생성하는 thread의 접두사 설정
          executor.setThreadNamePrefix("mail-async-");
          //initialize 안해주면 executor 사용 불가
          executor.initialize();
          return executor;
        }
      }
      
  • @Async
    • 비동기 처리를 하고자 하는 메소드 위에 추가
    • 지정된 비동기 작업을 위한 어노테이션
      @Async
      public void assessmentMailBuilder(MailDtomailDto) throws MessagingException{
      //서비스 로직
      }
      

Spring 카테고리 내 다른 글 보러가기

댓글남기기