🍏 개발일기

멀티스레드 기반 비동기 처리를 할 때 자주 사용하는 Thread Pool과 @Async

보배 진 2026. 3. 3. 11:48

 

Thread Pool

개념 : Thread Pool은 미리 일정 개수의 스레드를 생성해두고, 작업이 들어오면 그 스레드들을 재사용하는 방식

 

왜 필요한가

스레드를 매번 새로 생성하면 비용이 크다

▪ 생성 비용 (매모리 + CPU)

▪ 컨텍스트 스위칭 비용

▪ 과도한 스레드 생성 시 서버 다운 위험

그래서 스레드를 미리 만들어 재사용합니다

 

동작 방식

1. 애플리케이션 시작 시 스레드 여러 개 생성

2. 작업이 들어오면 대기 큐에 저장

3. 빈 스레드가 작업을 가져가서 실행

4. 작업 완료 후 다시 대기 상태로 복귀

 

Java에서 Thread Pool 사용 예

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> {
    System.out.println("비동기 작업 실행");
});
executor.shutdown();

주요 종류

▪ newFixedThreadPool(n) ➡ 고정 개수

▪ newCachedThreadPoll() ➡ 필요 시 생성/반환

▪ newSingleThreadExecutor() ➡ 단일 스레드

 

ThreadPoolExecutor 주요 설정

▪ corePoolSize ➡ 기본 스레드 수

▪ maxPoolSize ➡ 최대 스레드 수

▪ queueCapacity ➡ 대기 큐 크기

▪ keepAliveTime ➡ 유후 스레드 유지 시간

 


 

 

@Async란?

@Async는 Spring에서 비동기 메서드를 쉽게 만들기 위한 어노테이션입니다

Spring 내부적으로는 Thread Pool을 사용합니다

 

동작원리

▪ @Async가 붙은 메서드는

별도의 스레드에서 실행됩니다

호출한 스레드는 기다리지 않습니다 (non-blocking)

 

사용 방법 (Spring Boot)

@EnableAsync
@Configuration
public class AsyncConfig {
}

🔼 설정 활성화

 

@Service
public class MyService {

    @Async
    public void asyncMethod() {
        System.out.println("비동기 실행");
    }
}

🔼 메서드에 @Async 추가

 

 

반환 타입

반환 타입 설명
void 결과 안 받음
Future 결과 받기
CompletableFuture 가장 많이 사용
ListenableFuture Spring 전용
@Async
public CompletableFuture<String> asyncMethod() {
    return CompletableFuture.completedFuture("완료");
}

🔼 예시

 

 

 

Thread Pool은 "스레드 재사용 메커니즘"이고,
@Async는 "Spring에서 Thread Pool을 쉽게 쓰게 해주는 기능"이다.