자바칩

비동기(Asynchronous) vs 멀티스레드(Multi-threading) 본문

Study

비동기(Asynchronous) vs 멀티스레드(Multi-threading)

아기제이 2025. 4. 15. 15:59
728x90

⚡ 핵심 차이 요약: "비동기 vs 멀티스레드"

개념 비동기 (Asynchronous) 멀티 스레드 (Multi-threading)
기본 철학 작업을 기다리지 않고 "예약"하고, 다른 일 함 각 작업을 별도 스레드에서 동시에 실행
구현 예 Python async/await, JavaScript Promise Java Thread, ExecutorService, @Async
자원 효율 ✅ 매우 효율적 (I/O 작업에서 유리) ❌ 스레드 수가 많아지면 자원 부담 ↑
사용 예시 웹 요청, DB 쿼리 기다릴 때 CPU 연산, 블로킹 작업 병렬 처리
모델 코루틴 기반 (cooperative) 병렬 처리 기반 (preemptive)

🧠 쉽게 말하면:

비동기(async):

  • "기다리는 동안 다른 일 좀 하자"
  • 한 개의 스레드 안에서 여러 작업을 순차적으로 처리하되, I/O 중에는 다른 작업으로 넘김
  • 👉 FastAPI, Node.js가 대표
# FastAPI (비동기)
async def get_data():
    data = await fetch_from_db()  # DB 응답 기다리는 동안 다른 요청 처리 가능

멀티스레드(multi-thread):

  • "작업을 스레드마다 나눠서 동시에 굴리자"
  • 각 요청마다 실제 OS 스레드를 새로 만들거나 재사용해서 처리
  • 👉 Spring Boot에서 @Async, CompletableFuture, ExecutorService
// Spring (멀티스레드 기반 비동기)
@Async
public CompletableFuture<String> getData() {
    // 별도 스레드에서 실행됨
    return CompletableFuture.completedFuture(fetchFromDb());
}

🔧 결론적으로 정리하면:

Spring Boot는 비동기 가능하다.
단, 그것은 멀티스레드 기반 비동기 모델이다.

그리고:

🧠 비동기 = 스레드 많다는 뜻 아님
비동기는 논리적인 처리 흐름 분리지, OS 스레드를 무조건 새로 쓰는 게 아님

 


🧨 추가로 알아두면 좋은 것

✅ Spring에서도 진짜 비동기 (논리적인 async 흐름) 하려면?

  • Spring WebFlux 사용해야 함!
    • 이건 Reactor 기반 (Mono/Flux)으로 FastAPI처럼 non-blocking I/O 모델을 씀
    • 서버: Netty, Undertow
    • 완전 이벤트 루프 기반으로 동작 → CPU 효율 훨씬 좋음
@GetMapping("/records")
public Mono<List<OperationRecord>> getRecords(@RequestParam String writerId) {
    return operationRecordService.getByWriter(writerId); // 논리적 비동기 흐름
}

🔚 요약 한 줄로:

Spring Boot 기본은 스레드 기반 비동기, FastAPI는 코루틴 기반 비동기
Spring에서도 진짜 async 하려면 WebFlux 써야 함!