선 조치 후 분석

웹 개발자라면 알아야 할 WebSocket과 소켓 통신의 구조 차이 본문

ETC/IT Knowledge

웹 개발자라면 알아야 할 WebSocket과 소켓 통신의 구조 차이

JB1104 2025. 6. 18. 13:01
728x90
반응형
SMALL

1. 소켓의 본질 – “연결된 통신 통로”

  • 소켓(Socket)네트워크에서 **두 컴퓨터가 데이터를 주고받기 위해 만든 연결 지점(Connection Endpoint)**
    즉, 양쪽 컴퓨터가 소켓을 만들어 연결되면, 그 위에서 텍스트든 JSON이든 HTTP든 마음껏 주고받을 수 있습니다.

2. 어떤 상황에서 쓰이는가?

HTTP 요청도 결국 소켓 위에서 동작

계층 설명
Application  HTTP, FTP  우리가 작성하는 웹 API, 브라우저 요청
Transport  TCP / UDP 💡 여기서 소켓이 사용됨!
Network  IP  인터넷 주소와 라우팅
Physical  이더넷 Wi-Fi 실제 전송 매체

 

즉, HTTP 요청은 실제로는 TCP/IP 연결이 먼저 맺어지고 → 그 위에서 메시지가 오가는 구조

 

3. Java에서 소켓을 직접 쓰는 경우

  • Spring Web MVC나 Boot를 쓰면 소켓을 직접 다루는 경우는 거의 없다.
  • 하지만 다음과 같은 상황에서는 직접 다루기도 한다.

예시 1: 채팅 서버 만들기 (TCP 소켓)

ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept(); // 클라이언트 연결 대기
InputStream in = socket.getInputStream();  // 메시지 받기
OutputStream out = socket.getOutputStream();  // 메시지 보내기
  • 여기서 socket.getInetAddress() → 상대방 IP
  • getInputStream() → 받은 메시지 읽기
  • getOutputStream() → 메시지 보내기

예시 2: WebSocket (양방향 웹 통신)

  • 실시간 채팅, 주식 차트, 알림 등에 쓰이는 HTTP 업그레이드 방식
  • HTTP → WebSocket 프로토콜로 전환되면, 내부적으로 소켓을 유지하며 양방향 통신

 

4. Spring에서는 소켓을 어떻게 다루는가?

용도 기술  소켓 관련
일반 웹 요청 Spring MVC (@RestController) 소켓 직접 사용 X
(getRemoteAddr()로만 조회 가능)
실시간 알림 Spring WebSocket / STOMP 내부적으로 소켓 연결 유지
TCP 서버 Netty, Reactor Netty Non-blocking 소켓 처리
HTTP 서버 Spring Boot (Tomcat, Jetty) WAS가 소켓 연결을 관리함

 

우리가 직접 소켓을 열고 accept() 하는 일은 거의 없음.

대신 WAS(예: Tomcat)가 그걸 대신해 주고, 우리는 요청 객체만 다룬다.


개발에서 "소켓 통신을 한다"라는 말은 무슨 의미일까?

  1. 서버와 클라이언트가 HTTP 없이, 혹은 HTTP를 넘어서, 직접 데이터를 주고받는 방식
    즉, HTTP 요청-응답 모델과 달리, 소켓을 유지한 채로 실시간으로 데이터를 주고받는 구조
  2. HTTP 같은 고수준 통신 방식이 아니라, 개발자가 직접 네트워크 연결을 관리하면서 데이터를 주고받는 방식
    즉, 소켓 통신”이란 = 클라이언트와 서버가 직접 연결된 통로(TCP/IP)를 통해 데이터를 주고받는 통신을 한다는 뜻

소켓 통신은 언제 쓰이는가?

  • 브라우저 → 서버 요청: HTTP 기반, 우리가 흔히 쓰는 방식
  • 반면 다음과 같은 경우엔 소켓 통신이라 말한다.
상황 왜 소켓 통신을 쓰나?
실시간 채팅 사용자의 말이 실시간으로 전달되어야 하니까
게임 서버 위치, 움직임 등 빠르게 전송돼야 해서
IoT 기기 통신 기기 ↔ 서버가 직접 연결되어야 해서
파일 전송 FTP 등은 소켓 위에서 데이터 스트림 직접 주고받음
서버 간 통신 (예: 마이크로서비스) HTTP가 아닌 TCP로 성능 최적화할 때

 

HTTP vs 소켓 통신 - 개발자들 용어차이

표현 실질 의미 설명
"HTTP 요청 보낸다" 브라우저 → 서버, API 호출 고수준, stateless
"소켓 통신한다" 양방향 실시간 통신, TCP 직렬 연결 저수준, 연결유지
"WebSocket 통신" HTTP → 소켓으로 업그레이드 채팅, 알림 등에 적합
"소켓 서버 만든다" ServerSocket 등 직접 구현 게임 IoT, 커스터마이징 목적

 

즉, "소켓 통신 한다"라는 의미는

"브라우저에서 HTTP 요청 보내는 것처럼 단방향 요청/응답이 아니라,

서버랑 클라이언트가 직접 연결된 상태에서 실시간으로 데이터를 주고받는 구조(양방향)를 쓴다"는 뜻

 

요약

개념 설명
소켓  연결된 양방향 데이터 통로
소켓 통신  소켓을 통해 직접 데이터 송수신 (보통 TCP/IP)
" 소켓 통신을 한다" HTTP처럼 한 번 요청해서 끝나는 방식이 아니라,
지속적인 연결을 통해 데이터를 주고받는다는 의미
WebSocket  HTTP를 소켓처럼 바꿔주는 프로토콜. 소켓 통신의 한 형태

 


WebSocket도 소켓인데 뭐가 다르지?

  • 둘은 관련 있지만 엄연히 다른 계층의 기술입니다.
  • **소켓(Socket)**은 통신을 위한 "저수준 기술"이고,
  • WebSocket은 이를 웹 환경에서 실시간 양방향 통신을 하기 위해 만든 고수준 프로토콜
구분  WebSocket  소켓 (TCP 소켓)
계층  Application Layer Transport Layer
프로토콜 여부 ✅ 있음 (RFC 6455) ❌ 없음 (TCP 위에서 직접 구현)
사용 환경  브라우저 ↔ 서버 / JS에서 사용 가능 클라이언트 ↔ 서버
(프로그램끼리 직접 통신)
연결 방식 HTTP → Upgrade → WebSocket TCP 연결 직접 생성
메시지 형식 프레임 단위 (텍스트/바이너리)  바이트 스트림 직접 전송
일반 용도 실시간 웹앱 (채팅, 알림, 협업 등)  게임, 채팅, IoT, 금융 시스템 등
브라우저 지원 ✅ 지원 (JavaScript API 존재)  ❌ 브라우저에서는 직접 사용 불가
표준화  W3C + RFC로 명세화 OS/네트워크 수준 표준 (BSD 소켓 등)

 

 

WebSocket초기에 HTTP 요청을 보내서 연결을 시작한 뒤,

연결이 성립되면 TCP 소켓 위에서 독립적인 양방향 채널을 형성

즉, WebSocket은 TCP 소켓 위에서 동작하는 '웹 친화적' 프로토콜

 

클라이언트

const socket = new WebSocket("ws://localhost:8080/chat");
socket.onmessage = (e) => console.log("메시지:", e.data);

 

서버(Spring)

@MessageMapping("/chat")
@SendTo("/topic/messages")
public Message handle(Message message) {
    return message;
}

 

항목  WebSocket  TCP 소켓
동작 방식 HTTP 업그레이드 후 TCP 소켓 위에서 통신  TCP 직접 연결
추상화 수준 고수준 (메시지 기반, 웹용) 저수준 (바이트 스트림 기반)
관계  WebSocket은 TCP 소켓 위에서 동작하는 
특수한 프로토콜
WebSocket의 기반이 되는 전송 계층

 

정리

  • SocketWebSocket은 모두 포트를 통한 양방향 통신
  • WebSocket은 브라우저에서도 쉽게 사용 가능하도록 TCP 위에 HTTP 업그레이드 프로토콜로 설계된 응용계층 프로토콜
  • TCP 소켓은 더 저수준이며, 더 넓은 환경(앱, 서버, IoT 등)에서 직접 통제할 수 있는 반면, WebSocket은 웹 친화적

언제 소켓(Socket)을 사용하는가?

조건 설명
웹 환경이 아니다 브라우저를 거치지 않고, 앱, 기기, 서버 간 통신
고성능, 고속 전송 지연시간 최소화가 필요할 때 (ex. 게임, IoT)
커스텀 프로토콜 필요 HTTP/프레임 기반 아닌 고유 프로토콜 구현이 필요할 때
경량성 중요 WebSocket보다 패킷 오버헤드가 적어야 할 때
(IoT, 임베디드 등)

 

언제 WebSocket을 사용하는가?

조건 설명
브라우저에서 실시간 통신이 필요 JS로 쉽게 연결 가능 (new WebSocket())
HTTP 기반 네트워크 환경 사용 프록시, 방화벽, HTTPS 등을 그대로 활용 가능
양방향 실시간 통신이 필요 채팅, 알림, 협업, 실시간 알림 등
인프라 구성의 복잡도를 줄이고 싶을 때 HTTP 업그레이드 방식이라 기존 인프라 활용 가능

 

핵심 비교 정리

구분 TCP/UDP 소켓 WebSocket
연결 방식 TCP/UDP 직접 연결 HTTP → Upgrade → TCP
프로토콜 추상화 없음(직접 구현) 있음 (프레임 구조, ping/pong 등)
브라우저 지원 X O
성능 빠름 (특히 UDP) Web보다 빠름, 소켓보다 느릴 수 있음
보안 전송 SSL/TLS 직접 구성 필요 wss:// 사용 가능
인프라/방화벽 통과 어려움 (포트 열어야 함) 용이 (80/443 포트 그대로 사용)
개발 편의성 어려움 (패킷 조작, 오류처리 등 직접구현) 쉬움 (JS에서도 한 줄로 연결)
728x90
반응형
LIST