728x90
소켓 통신이 연결을 유지하면서 데이터를 주고받는 방식은 비동기(Asynchronous) 및 이벤트 기반(Event-driven)으로 동작합니다.
단순히 "비동기에서 실행된다"는 의미를 넘어, 왜 소켓 통신에서 비동기가 핵심인지 3가지 포인트로 정리해 드릴게요.
1. "기다리지 않는다" (Non-blocking)
일반적인 동기식 처리라면 서버가 데이터를 보낼 때까지 클라이언트가 아무것도 못 하고 멈춰 있어야 합니다. 하지만 소켓은 비동기적으로 작동하기 때문에:
- 클라이언트는 메시지를 보내놓고 다른 작업을 계속할 수 있습니다.
- 서버도 메시지가 올 때까지 멍하니 기다리는 게 아니라, 다른 유저의 요청을 처리하다가 메시지가 도착하는 이벤트가 발생할 때만 반응합니다.
2. 이벤트 루프(Event Loop)와의 관계
Node.js(Express)는 싱글 스레드 기반의 이벤트 루프를 사용합니다. 소켓 연결이 1,000개 쌓여있어도 서버가 느려지지 않는 이유는 다음과 같습니다.
- 소켓 연결 자체는 OS가 관리하는 백그라운드에서 유지됩니다.
- 데이터(패킷)가 도착하면 OS가 Node.js에게 알림을 줍니다.
- Node.js는 이벤트 루프에 이 작업을 등록하고, 순서가 되면
socket.on('message', ...)콜백 함수를 실행합니다.
3. HTTP vs 소켓 (동기 vs 비동기 체감 차이)
| 구분 | HTTP (일반적인 방식) | 소켓 (Socket.io) |
|---|---|---|
| 방식 | Request-Response (요청-응답) | Event-based (이벤트 기반) |
| 대기 | 응답이 올 때까지 기다림 (Sync/Async 선택) | 언제든 데이터가 오면 실행 (Always Async) |
| 주도권 | 클라이언트만 요청 가능 | 서버와 클라이언트 모두 먼저 보낼 수 있음 |
4. 실무적인 관점에서의 "비동기"
Express 코드에서 보셨던 socket.on(...) 함수 자체가 "이 이벤트가 발생하면 나중에 이 함수를 실행해줘"라는 비동기 예약 시스템입니다.
// 이 코드는 즉시 실행되는 게 아니라,
// 미래에 'chat message'라는 패킷이 도착했을 때 비동기적으로 실행됩니다.
socket.on('chat message', (msg) => {
console.log('메시지 도착:', msg);
});
console.log('나는 메시지 수신 대기 설정 직후에 바로 출력됩니다!');
요약하자면
소켓 연결이 유지된다는 것은 "데이터가 흐를 수 있는 파이프라인이 항상 열려 있다"는 뜻이고, 그 파이프라인을 통해 데이터가 들어오고 나가는 행위는 모두 비동기 방식으로 처리되어 프로그램의 전체 흐름을 방해하지 않습니다.
728x90
'기술 학습' 카테고리의 다른 글
| Java에서는 비동기 대신 가상 스레드 (0) | 2026.02.09 |
|---|---|
| Java에서 소켓(socket)은? (0) | 2026.02.09 |
| express로 socket 사용 방법 (0) | 2026.02.09 |
| 소켓(Socket)과 패킷(Packet)의 관계 (0) | 2026.02.09 |
| 소켓(Socket) 이란? (0) | 2026.02.09 |