자바칩
비동기(Asynchronous) vs 멀티스레드(Multi-threading) 본문
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 써야 함!
'Study' 카테고리의 다른 글
[Docker] 이미지 / 컨테이너 / 도커 용어 개념 정리 (0) | 2025.04.18 |
---|---|
FastAPI vs Spring Boot (1) | 2025.04.15 |
[Spring] Spring Boot에서 동시성 처리 방법 (0) | 2025.04.15 |
[FastAPI] async + await 구조가 동시성에 강한 이유 (0) | 2025.04.15 |
RDBMS 용어와 NoSQL 용어 비교 (0) | 2025.04.02 |