소켓(Socket)은 오늘날 인터넷을 통한 데이터 송수신을 가능하게 해주는 핵심 기술입니다.
웹사이트, 채팅 앱, 온라인 게임, 메신저, 실시간 스트리밍... 이 모든 것들이 소켓 통신 위에 구축되어 있습니다.
그런데 막상 소켓을 공부하려고 하면
- "그냥 통신하는 거 아냐?"
- "HTTP랑 뭐가 달라?"
- "소켓 서버랑 클라이언트는 어떻게 만들지?"
혼란스럽기 쉽습니다.
이 글에서는 소켓의 근본 개념부터 코드를 통한 실전 이해, 최신 소켓 활용 트렌드까지 아주 꼼꼼히 정리해드립니다.
소켓이란 무엇인가?
소켓(Socket)은 네트워크 상의 양 끝점(End Point)을
프로그래밍적으로 다루는 인터페이스입니다.
더 쉽게 말하면
"서로 다른 컴퓨터끼리 데이터를 주고받기 위해 열어놓은 통로."
- 소켓은 운영체제(OS)가 제공하는 기능입니다.
- 프로그래밍 언어들은 소켓을 이용해 네트워크 통신을 제어합니다.
소켓은 무엇을 담당할까?
- 데이터 보내기 (
send
) - 데이터 받기 (
receive
) - 연결 열기 (
connect
) - 연결 대기 (
listen
) - 연결 끊기 (
close
)
소켓과 TCP/IP
소켓은 TCP/IP 프로토콜 위에서 주로 동작합니다.
TCP 소켓
- 연결 지향(Connection-oriented)
- 신뢰성 보장 (데이터 유실 없음)
- 순서 보장
- 예: 웹 브라우징, 이메일, 파일 다운로드
UDP 소켓
- 비연결 지향(Connectionless)
- 빠르지만 신뢰성 없음 (데이터 유실 가능)
- 예: 실시간 게임, 스트리밍, VoIP
대부분의 앱은 TCP 소켓을 사용합니다.
소켓 통신의 흐름
소켓 통신은 다음 순서로 이루어집니다
- 서버 소켓 생성 (포트 바인딩)
- 클라이언트가 연결 요청
- 서버가 연결 수락
- 양방향 데이터 송수신
- 통신 종료 후 소켓 닫기
흐름 그림
[서버] bind -> listen -> accept
↑ ↓
[클라이언트] connect
소켓 서버와 클라이언트 만들기 (Node.js 예제)
Node.js에서는 기본 net
모듈을 사용해 소켓을 다룰 수 있습니다.
서버 만들기
// server.js
const net = require('net');
const server = net.createServer((socket) => {
console.log('클라이언트 접속');
socket.on('data', (data) => {
console.log('클라이언트로부터 데이터:', data.toString());
socket.write('서버 응답: ' + data);
});
socket.on('end', () => {
console.log('클라이언트 연결 종료');
});
});
server.listen(3000, () => {
console.log('서버 대기 중 (port 3000)');
});
클라이언트 만들기
// client.js
const net = require('net');
const client = net.createConnection({ port: 3000 }, () => {
console.log('서버에 연결되었습니다.');
client.write('안녕하세요 서버!');
});
client.on('data', (data) => {
console.log('서버로부터 응답:', data.toString());
client.end(); // 통신 종료
});
client.on('end', () => {
console.log('서버 연결 종료');
});
WebSocket vs 일반 소켓
구분 | 일반 TCP 소켓 | WebSocket |
프로토콜 | TCP | HTTP 기반 업그레이드 후 TCP |
초기 연결 | 직접 TCP 연결 | HTTP 핸드셰이크 후 업그레이드 |
브라우저 지원 | 직접 접근 불가 | 브라우저 지원 (Web API) |
용도 | 서버 간 통신, 게임 서버, DB 연동 | 웹 앱 채팅, 알림, 실시간 데이터 업데이트 |
즉, 브라우저 기반 실시간 앱을 만들고 싶다면 WebSocket을 사용합니다.
Node.js에서는 ws
패키지를 이용해 쉽게 WebSocket 서버를 만들 수 있습니다.
실전 예제: 간단한 채팅 앱 만들기
서버 코드 (WebSocket)
// server.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('클라이언트 접속');
ws.on('message', (message) => {
console.log('받은 메시지:', message);
// 연결된 모든 클라이언트에게 메시지 전송
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
});
클라이언트 코드 (HTML + JS)
<!DOCTYPE html>
<html>
<body>
<input id="msgInput" type="text">
<button onclick="sendMessage()">Send</button>
<ul id="chatLog"></ul>
<script>
const socket = new WebSocket('ws://localhost:8080');
socket.onmessage = (event) => {
const li = document.createElement('li');
li.textContent = event.data;
document.getElementById('chatLog').appendChild(li);
};
function sendMessage() {
const input = document.getElementById('msgInput');
socket.send(input.value);
input.value = '';
}
</script>
</body>
</html>
실제 애플리케이션에서 소켓 활용 예시
- 메신저 앱 (카카오톡, WhatsApp) - 실시간 채팅
- 온라인 게임 (League of Legends) - 플레이어 위치 실시간 공유
- 증권 앱 - 주식 가격 실시간 갱신
- IoT 디바이스 관리 - 디바이스 간 통신
- 실시간 스트리밍 서비스 - 유튜브 라이브 채팅
대부분의 "실시간" 서비스는 소켓 없이는 불가능합니다.
정리
- 소켓은 통신을 위한 프로그래밍 인터페이스
- 주로 TCP 소켓을 사용 (신뢰성 보장)
- Node.js에서는
net
모듈이나ws
모듈로 쉽게 구현 가능 - 브라우저 기반 실시간 앱은 WebSocket이 표준
- 실전에서는 소켓 연결 관리, 에러 처리, 보안이 중요
728x90