- 비동기 프로그래밍 = 여러 작업을 동시에 처리 (멀티 스레드 사용)
- 멀티스레딩이란 하나의 작업을 동기화 하는 것이 아니라, 비동기화 하는 것
-> 전화받으면서 설거지하기(비동기)
, 전화 받고 통화 종료 후 설거지하기(동기화)
웹 애플리케이션에서 여러 사용자가 동시에 요청을 보낼 때, 각 요청을 별도의 스레드에서 처리하여 사용자가 웹페이지를 더 빠르게 볼 수 있도록 만드는 것이 비동기 프로그래밍입니다.
예를 들어, 사용자가 웹사이트에서 글을 작성하면서 동시에 이미지를 업로드한다고 생각해봅시다. 이미지 업로드는 시간이 오래 걸리는 작업일 수 있는데, 이를 메인 스레드에서 처리한다면 사용자는 이미지 업로드가 완료될 때까지 글 작성을 할 수 없습니다. 하지만 이 두 작업을 별도의 스레드에서 처리한다면 사용자는 이미지 업로딩과 상관없이 글 작성을 계속할 수 있습니다.
ThreadPoolTaskExecutor
클래스를 사용해서 풀을 생성스레드풀
= 여러 개의 스레드를 미리 만들고, 필요할 때마다 사용 -> 다시 풀에 반환- 스레드풀 클래스의 메서드를 호출해서 스레드 수를 지정
@EnableAsync
를 사용해서 비동기화 설정
서비스에서 비동기화 테스트
- 서비스 로직의 1~3번 중에 1번만 동작
@Async
어노테이션을 사용해서 지정된 스레드에 할당을 하기 위해서는 빈으로 주입해야됨
->즉, Spring 컨테이너가 관리를 해주는 빈으로 생성된 객체만 비동기로 처리 가능!!
🙆♂️ 1번. 멀티스레딩 동작
- 컨테이너에 의해서 주입되었기 때문에 동작한다.
🤷♂️ 2번,3번은 동작하지 않음
- 2번 : 빈을 주입한 것이 아니라 new키워드로 생성을 했기 때문
- 3번 : 같은 클래스 내부 호출 -> proxy기반의 AOP 동작 원리 때문에 실제 Async 설정을 인식 하지 못하고 동일한 스레드에서 실행