💡 개요
나는 지금까지 비동기와 멀티스레딩이 유사한 개념이라고 생각했다.
아니, 거의 동일한 개념이라고까지 여겼다.
그래서 오늘은 이 두 개념이 어떻게 다르고, 어떻게 엮일 수 있는지를 정리해보려 한다.
🛠️ 비동기 vs 멀티스레딩
먼저 비동기란, 작업을 요청한 후 그 작업이 끝날 때까지 기다리지 않고 다음 작업을 바로 처리하는 방식이다.
즉, 어떤 요청을 보냈을 때, 그 요청의 처리가 완료되기를 기다리지 않고 콜백, 이벤트 루프 등을 활용하여 나중에 그 결과를 받아 처리한다.
이 방식은 주로 하나의 스레드로 여러 작업을 다루는 데 효과적이며, 특히 I/O 작업이 많은 시스템에서 성능을 높이는 데 유리하다.
참고로 하나의 스레드로도 비동기 작업이 가능한 이유는, I/O 작업의 경우엔 CPU가 작업을 직접 하지 않고, 외부 자원에 위임한 뒤 다시 돌아오기 때문이다.
반면, 멀티스레딩은 하나의 프로세스 내에서 여러 개의 스레드를 만들어 동시에 여러 작업을 수행하는 방식이다.
여기서 동시라는 말은 CPU 코어가 여러 개일 경우 진짜 병렬 실행이 가능하고, 단일 코어일 경우엔 시분할 방식으로 스레드가 번갈아 실행된다.
항목 | 비동기 | 멀티 스레딩 |
개념 | 작업의 완료를 기다리지 않고 다음 작업 수행 | 여러 스레드를 이용한 병렬 처리 |
동작 방식 | 이벤트 루프, 콜백 등 | OS가 스레드 스케줄링 |
주요 사용 예 | Node.js, Spring WebFlux | Java Thread |
스레드 수 | 보통 1개 (2개 이상도 가능) | 2개 이상 |
장점 | 리소스 효율적, I/O에 강함 | 병렬 계산에 적합, 코드 구조 직관적 |
단점 | 콜백 지옥, 디버깅 어려움 | context switching 비용, 동기화 문제 |
🍝 시나리오: 손님 3명이 파스타를 주문 (ChatGPT가 만들어준 예시)
🧵 [1] 동기 + 멀티스레딩 방식 (Spring MVC, Servlet)
각 요리사는 한 손님만 전담해서 요리함. 요리 중엔 다른 일을 못 함.
- 👨🍳 요리사 3명(3개의 스레드)이 각 손님 요청을 동기적으로 처리
- A 요리사: 면 삶기 → 소스 만들기 → 플레이팅 → 완료
- 동시에 B, C 요리사도 각각 작업함
✅ 장점
- 동시 요청에 빠르게 대응 가능
- 각 요청은 독립적인 스레드로 처리됨
❌ 단점
- 요리사 수(스레드 수)가 한정되어 있고, 요청이 많아지면 스레드 고갈 위험
- I/O(예: 소스가 도착할 때까지 기다리는 시간) 동안 스레드가 낭비됨
⚙️ [2] 비동기 + 싱글스레드 방식 (Node.js, Spring WebFlux)
요리사는 1명인데, 한 작업을 하다가 기다릴 시간이 생기면 다른 작업을 먼저 처리함.
- A 손님: 면 삶는 중 → 물 끓을 동안 대기
- 그 사이에 B 손님 요리 준비 시작 → 소스 기다리는 중
- 다시 A 손님 요리 마무리 진행 → …
✅ 장점
- I/O 대기 시간을 효율적으로 사용함
- 적은 스레드 수로도 많은 요청을 처리 가능 (확장성 뛰어남)
❌ 단점
- 요리 순서가 복잡해짐 → 요리사가 일정을 엄청 잘 관리해야 함
- 작업이 모두 논블로킹 방식으로 작성돼야 효율이 나옴
🤔 결론
내가 보기엔 전통적인 서버, 우리가 많이 구현하고 사용하는 서버 방식은 동기+멀티스레드 방식인 것 같다.
하지만 성능 측면을 더 신경 쓰고 싶다면 비동기+싱글스레드 방식은 고성능 I/O 처리에 적합할 것 같다.
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.05.19 - ConcurrentHashMap이 HashMap보다 빠른 이유 (1) | 2025.05.19 |
---|---|
[개발 일기] 2025.05.18 - Spring Flux을 많이 사용하지 않는 이유? (0) | 2025.05.18 |
[개발 일기] 2025.05.16 - PSA (Portable Service Abstraction) (0) | 2025.05.16 |
[개발 일기] 2025.05.15 - 클래스마다 무조건 인터페이스를 생성?? (0) | 2025.05.15 |
[개발 일기] 2025.05.14 - ConfigurationProperties와 Setter (0) | 2025.05.14 |