반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 스프링 부트 입문
- SQL
- 스프링
- Effective Java
- 스프링 프레임워크
- DI
- db
- Javascript
- resultMap
- kafka
- assertThat
- 스프링부트
- 필드 주입
- thymeleaf
- DIP
- spring
- springboot
- 생성자 주입
- mybatis
- 스프링 빈
- 스프링 부트 기본
- java
- 싱글톤
- 스프링 컨테이너
- @Configuration
- JPA
- assertThrows
- 스프링 부트
- sqld
- jdbc
Archives
- Today
- Total
선 조치 후 분석
웹 개발자라면 알아야 할 WebSocket과 소켓 통신의 구조 차이 본문
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)가 그걸 대신해 주고, 우리는 요청 객체만 다룬다.
개발에서 "소켓 통신을 한다"라는 말은 무슨 의미일까?
- 서버와 클라이언트가 HTTP 없이, 혹은 HTTP를 넘어서, 직접 데이터를 주고받는 방식
즉, HTTP 요청-응답 모델과 달리, 소켓을 유지한 채로 실시간으로 데이터를 주고받는 구조
- 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의 기반이 되는 전송 계층 |
정리
- Socket과 WebSocket은 모두 포트를 통한 양방향 통신
- 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
'ETC > IT Knowledge' 카테고리의 다른 글
Spring 로그인 시 사용자 IP 정확히 가져오는 방법 (getRemoteAddr vs X-Forwarded-For) (0) | 2025.06.17 |
---|---|
[Maven] java.nio.charset.MalformedInputException: Input length = 1 오류 및 maven-resources-plugin (1) | 2025.06.12 |
FeignClient 개념 및 사용법 (1) | 2025.06.09 |
Maven과 Nexus 개념 그리고 필요성은? (0) | 2025.02.14 |
리눅스(Linux) 패키지 다운 사이트 (0) | 2025.01.24 |