채팅 서비스를 직접 구현해보려 한다. 이번 목표는 채팅이 어떻게 실시간으로 동작하는가를 가장 기초적인 TCP 연결 단계부터 이해하는 것이다.
Spring, HTTP, WebSocket 같은 기술들은 이미 내부적으로 TCP 위에서 돌아간다. 하지만 그 내부가 어떤 원리로 작동하는지는 직접 TCP 소켓을 다뤄보지 않으면 감이 잡히지 않는다.
그래서 이번엔 TCP Socket을 직접 다루며, 실시간 대화가 네트워크 수준에서 어떻게 이루어지는지를 알아본다.
채팅은 단순한 데이터 전송이 아니다. 지속적인 연결을 유지한 채, 서로가 동시에 데이터를 주고받는 통신이다.
한쪽이 말을 할 때마다 새로 연결을 맺고 끊는 것이 아니라, 이미 만들어진 통로를 통해 양방향으로 메시지가 오간다.
이런 성격의 통신을 stateful(상태를 유지하는) 통신이라고 부른다. 실시간 게임, 주식 시세, IoT 센서 데이터 같은 서비스도 같은 구조를 사용한다.
물론 stateless하게 즉 HTTP로 메시지를 전송해도 된다. 하지만 매번 연결을 맺고 끊는 과정에서 비용(Cost) 이 크다. 따라서 채팅처럼 연결이 유지되어야 하는 서비스에는 stateful한 TCP 연결이 적합하다.
TCP(Transmission Control Protocol)는 지속적이고 신뢰성 있는 연결을 보장하는 전송 계층 프로토콜이다.
TCP는 다음을 보장한다:
즉, TCP는 메시지가 손실되거나 순서가 뒤바뀌지 않게 안전하게 전달되도록 설계된 프로토콜이다. 이 안정성이 바로 채팅 서비스가 대화처럼 느껴지게 하는 핵심이다.
TCP 위에서 Socket은 애플리케이션이 TCP를 사용할 수 있도록 연결해주는 창구다.
TCP는 운영체제 수준에서 동작하고, Socket은 그 기능을 개발자가 코드로 제어할 수 있게 해주는 인터페이스(API) 이다.
TCP가 통신의 규칙이라면, Socket은 그 규칙을 실제로 사용하는 문(door)이다.
ServerSocket server = new ServerSocket(8080); // 포트 개방
Socket client = server.accept(); // 연결 수락
이 두 줄이 바로 서버가 클라이언트와 대화를 시작할 준비를 하는 과정이다.
채팅의 핵심은 끊기지 않는 연결이다. 이를 가능하게 하는 것이 바로 TCP Socket이다.
ServerSocket을 통해 연결 요청을 기다린다.Socket(ip, port)을 통해 서버에 연결한다.이 구조가 채팅의 실시간성과 지속성을 만들어낸다.
UDP는 TCP보다 빠르지만 데이터 유실이나 순서 뒤바뀜이 발생할 수 있다.
실시간성이 중요한 게임에는 UDP가 유리하지만, 메시지가 반드시 도착해야 하는 채팅에서는 TCP가 적합하다.
| 구분 | TCP | UDP |
|---|---|---|
| 연결 방식 | 연결 지향 | 비연결 |
| 신뢰성 | 높음 (재전송, 순서보장) | 낮음 (손실 허용) |
| 속도 | 느림 | 빠름 |
| 채팅 적합성 | ✅ | ❌ |
Socket은 네트워크에서 데이터를 주고받기 위한 논리적 통신의 끝점(EndPoint) 이다. 두 프로그램(혹은 컴퓨터)이 데이터를 주고받기 위해 양쪽에 각각 하나씩 생성하는 연결 지점이다.
모든 애플리케이션 간 통신은 결국 소켓을 통해 Transport 계층(TCP/UDP)에서 이루어진다. 우리가 사용하는 HTTP 역시 내부적으로는 TCP Socket 위에서 동작한다.
채팅은 끊기지 않는 대화이며 TCP는 끊기지 않는 통신을 보장한다. 따라서 채팅을 가장 기초부터 이해하려면 TCP Socket을 직접 다뤄보는 것이다.