동시성이란? 여러 작업을 동시에 처리하는 것처럼 보이는 원리 쉽게 이해하기
동시성은 여러 작업이 같은 시간대에 진행되도록 관리하는 개념입니다. 병렬성·Promise.all·Concurrency Limit·Queue·Rate Limit·Race Condition·멱등성까지 초보 기준으로 정리합니다.
식당 직원 한 명 · 동시성 ≠ 병렬성
이미지 업로드처럼 독립 작업은 하나씩 끝낼 수도, 같은 시간 구간에 겹쳐 진행할 수도 있습니다. 여러 작업이 겹치도록 관리하는 개념이 동시성(Concurrency)입니다. 직원이 손님 A 음식이 조리되는 동안 B·C를 돕는 것과 같습니다 — 한 순간에 여러 일을 「진짜로」 하는 것이 아니라 대기 시간을 다른 일에 씁니다. 병렬성(Parallelism)은 직원 여러 명이 같은 순간에 각자 일하는 것에 가깝습니다. 브라우저 JS 메인 스레드는 보통 한 번에 하나의 JS를 실행하지만, 네트워크·타이머는 브라우저가 맡는 동안 이벤트 루프로 다른 일을 이어 동시성처럼 보일 수 있습니다.
동시성: 여러 작업이 같은 시간대에 진행되도록 관리 병렬성: 여러 작업을 실제 같은 순간에 실행
순차 · Promise.all · Concurrency Limit
로그인 후 userId로 주문을 조회하듯 의존이 있으면 순차 처리가 맞습니다. 공지·날씨·주문처럼 독립이면 먼저 fetch를 시작하거나 Promise.all / async/await의 await Promise.all로 대기 시간을 줄일 수 있습니다. 반대로 독립 작업을 순차 await하면 Request Waterfall이 됩니다. 그렇다고 1만 개를 한꺼번에 시작하면 브라우저·네트워크·API·DB가 포화될 수 있어 Concurrency Limit(동시 실행 개수 제한)이 필요합니다 — 파일 1,000개여도 동시에 3~5개만 돌리고 하나가 끝나면 다음을 넣는 식입니다. 「항상 5개」 정답은 없고 서버·네트워크·데이터 크기·외부 제한에 맞춥니다.
순차 await → Waterfall 위험(독립 작업일 때) Promise.all → 함께 시작·모두 대기 Limit 3 → A B C 진행, B 완료 시 D 시작
처리량 · Queue · Rate Limit · Backpressure
Throughput은 단위 시간당 처리량, Latency는 한 건 완료 시간입니다. 동시성을 올리면 처리량이 늘 수 있지만 과하면 대기열·지연·오류가 늘고 Latency도 나빠질 수 있습니다. 오래 걸리는 보고서·이메일·이미지 변환은 HTTP를 붙잡지 말고 Job Queue에 넣고 Worker가 가져가게 할 수 있습니다. Worker 수·Worker Pool·DB Connection Pool도 동시성 제한입니다. 오토스케일링으로 웹서버만 늘리면 Connection이 폭증해 DB가 병목이 될 수 있습니다. Rate Limit은 「일정 시간당 요청 수」, Concurrency Limit은 「지금 진행 중인 개수」로 다릅니다. 초과 시 HTTP 429가 나올 수 있고, 전원 즉시 Retry하면 Thundering Herd가 됩니다 — Backoff·Jitter·Queue 길이 제한·Backpressure로 유입을 조절합니다. 포화되면 503 같은 일시 장애와도 맞닿습니다.
I/O · CPU · Race · 멱등 · 모니터링
I/O Bound(네트워크·DB 대기)는 기다리는 동안 다른 요청을 돌리기 좋아 Node.js 이벤트 루프 이야기가 자주 나옵니다. CPU Bound(인코딩·대량 계산)를 메인에서 오래 돌리면 다른 요청·화면이 막혀 Long Task가 됩니다 — Worker Thread·Web Worker로 분리 검토. 같은 재고·잔액을 동시에 읽고 바꾸면 Race Condition이 납니다. Lock·Transaction·원자적 업데이트로 일관성을 지키되 Lock이 길면 처리량이 떨어집니다. Deadlock은 서로 자원을 기다리는 교착입니다. 결제·주문에는 프론트 버튼 비활성 + 서버 멱등성(Idempotency)·Idempotency-Key가 필요합니다(HTTP 메서드의 멱등 개념과도 연결). 평균만 보지 말고 p95·p99·Tail Latency, Queue 길이, Connection 사용량, 오류율을 봅니다. 분산 추적·부하 테스트로 타이밍에만 나는 문제를 드러냅니다. 로드밸런싱은 서버 간 요청을 나누고, 서버 안에서는 I/O 동시성이 겹칩니다. 동시성은 SEO 지표가 아니지만 응답 지연·장애가 나면 사용자 경험에 영향을 줍니다.
독립 → 동시 검토 · 의존 → 순차 높이되 Limit · Rate · Pool · Queue 같은 데이터 → Race 대비 · 멱등 · Lock/Tx
자주 묻는 질문
동시성이란?
여러 작업이 같은 시간 구간에서 함께 진행되도록 실행 순서를 관리하는 개념입니다.
병렬 처리와 같나요?
아닙니다. 동시성은 「함께 진행되도록 관리」, 병렬은 「같은 순간에 실제 실행」에 가깝습니다.
JS는 한 줄씩인데 어떻게?
네트워크·타이머를 브라우저가 처리하는 동안 이벤트 루프가 다른 JS를 실행할 수 있기 때문입니다.
Promise.all이면 동시인가요?
독립 작업을 함께 시작하고 기다리는 데 쓸 수 있습니다. CPU가 자동 멀티코어 병렬이 된다는 뜻은 아닙니다.
Concurrency Limit이란?
동시에 실행되는 작업의 최대 개수를 제한하는 것입니다.
높이면 무조건 빨라지나요?
아닙니다. 자원이 포화되면 오히려 느려지고 오류가 늘 수 있습니다.
Rate Limit과 차이는?
Rate는 일정 시간당 요청 수, Concurrency는 한 순간에 진행 중인 작업 수입니다.
Race Condition이란?
여러 작업이 동시에 같은 상태를 다루며 실행 순서에 따라 결과가 달라지는 문제입니다. 자세한 설명은 Race Condition 가이드를 참고하세요.
정리
동시성 = 여러 작업이 같은 시간대에 진행되도록 관리하는 것입니다. 순차는 「하나 끝나면 다음」, 병렬은 「같은 순간에 실행」으로 구분합니다. 독립 작업은 불필요하게 순차 두지 말고, 그렇다고 무제한 동시 실행도 피합니다 — Limit·Rate·Queue·Connection Pool·Backpressure로 조절합니다. 재고·결제처럼 같은 데이터를 동시에 바꾸면 Race Condition이 납니다. 재고 1개에 두 사용자가 동시에 「1개 남음」을 읽고 둘 다 구매를 승인하는 식으로, 실행 순서에 따라 결과가 달라지는 문제가 경쟁 상태입니다.