본문 바로가기
개발 공부/서버

[서버 성능 최적화] 비동기 처리와 병렬 처리, 서버를 멈추지 않고 일 시키는 법

by 악마의 개발자 2025. 5. 26.
반응형

서버 성능 최적화


💡 “서버는 동시에 몇 명까지 처리할 수 있나요?”

사용자 10명이 동시에 버튼을 누르면

서버는 그걸 하나씩 처리할까?
아니면 여러 개를 동시에 처리할까?

→ 바로 여기서 비동기와 병렬 처리의 개념이 등장합니다.
이해하면 서버는 훨씬 효율적으로 동작하게 만들 수 있어요!


🧭 기본 개념부터 정리

✅ 비동기(Asynchronous)

하나의 요청이 끝날 때까지 기다리지 않고, 다음 작업으로 넘어감

 
console.log("A");
setTimeout(() => {
  console.log("B");
}, 1000);
console.log("C");

 

출력 결과:

A
C
B

✅ → 오래 걸리는 작업을 기다리지 않고,
✅ → 콜백/Promise/async-await을 통해 결과만 나중에 받는 방식


✅ 병렬 처리(Parallel)

여러 작업을 동시에 실행하는 구조
CPU 코어나 워커 스레드를 나눠서 실제 동시 작업 수행

 

📦 예시:

  • 파일 여러 개를 동시에 압축
  • API 여러 개를 한 번에 호출
  • 이미지 리사이징을 워커 프로세스로 처리

🔁 실무에서 비동기 처리를 써야 하는 이유

이유 설명
서버 리소스 낭비 방지 대기 시간 동안 다른 요청 처리 가능
외부 API 대기 시간 줄이기 I/O 처리 중 다른 작업 수행
응답 속도 향상 병렬 요청으로 시간 절약
시스템 확장성 향상 논블로킹 구조로 처리량 증가
 

🔧 비동기 & 병렬 처리 구조 예시

✅ 비동기 구조 (Node.js 스타일)

app.get('/user', async (req, res) => {
  const user = await getUserFromDB(); // DB 대기 중
  res.send(user);
});

→ 서버는 DB 응답 기다리는 동안
→ 다른 요청들도 자유롭게 처리 가능


✅ 병렬 요청 처리 예시 (Promise.all)

const [user, posts] = await Promise.all([
  getUserInfo(),
  getUserPosts()
]);

→ 두 API를 동시에 실행
→ 총 1초 걸릴 작업을 0.5초로 단축할 수 있음 ✅


🧱 실무에서 자주 쓰는 비동기 처리 도구

도구 설명
Promise 기본적인 비동기 구조
async/await 비동기를 동기처럼 작성 가능
BullMQ / RabbitMQ 작업 큐 → 워커에게 분배
worker_threads (Node.js) CPU 병렬 처리 (이미지 처리 등)
웹훅(Webhook) 외부 이벤트를 기다리는 방식
 

🧩 큐 & 워커 패턴이란?

큐(Queue): 처리할 작업을 순서대로 쌓아둠
워커(Worker): 큐에 있는 작업을 하나씩 또는 병렬로 꺼내서 실행

 

예시:

  • 주문이 들어오면 → 주문 큐에 추가
  • 워커가 주문을 하나씩 처리 (결제, 문자 발송 등)

✅ 서버는 빠르게 응답만 주고,
✅ 나머지 무거운 작업은 워커가 따로 처리


⚠️ 실무에서 주의할 점

항목 주의 포인트
비동기 오류 처리 try/catch 또는 .catch() 필수
병렬 요청 과다 외부 API rate limit 초과 주의
큐 병목 워커 수 부족 시 지연 발생 가능
CPU 작업은 따로 분리 Node.js는 싱글 스레드이므로 워커로 분산 필요
 

🧠 정리 한마디!

"서버는 멀티태스킹처럼 보이지만,
진짜 효율을 내려면 비동기 구조와 병렬 처리가 필수입니다!"

 

✔️ 요약

  • 비동기: 기다리지 않고 요청 처리 → 서버 효율 극대화
  • 병렬 처리: 여러 작업을 동시에 → 속도 최적화
  • 큐/워커: 무거운 작업을 분리 → 응답 지연 방지
반응형