Spring/기타 여러가지

TCP프로토콜과 Socket, WebSocket, SseEmitter

doriver 2025. 5. 29. 15:41

 

ServerSocket, Socket

TCP소켓 API
IP와 포트 기반의 저수준(transport layer) 통신
바이트 스트림을 직접 읽고 쓰면서 프로토콜(HTTP, FTP, 커스텀 프로토콜 등)을 직접 구현할수 있음

 

 

일반HTTP · SSE(SseEmitter)  · WebSocket 

모두 내부적으로는 TCP소켓(= Socket)을 사용

톰캣 커넥터(또는 다른 컨테이너)가 저수준 Socket/채널을 관리, 개발자는 저수준 소켓 코드를 직접 다루지 않아도 됨

모두 애플리케이션 레벨 프로토콜쪽 개념

 

차이점은 “연결을 열어두는 방식”과 “스레드 사용 방식”

  커넥터 레벨 소켓 관리 스레드 사용 방식
일반 HTTP 요청 수신 시 소켓 열고, 응답 후 닫거나 재사용 요청당 스레드 하나 점유, 응답 후 반납
SSE  컨테이너는 해당 AsyncContext에 소켓 채널을 매핑해 계속 열어둠 Async I/O 스레드 또는 쓰레드 풀을 통해 비동기 전송
WebSocket HTTP → WebSocket 업그레이드 후, 톰캣 WebSocket 모듈이 장시간 소켓 유지 NIO/EventLoop 기반으로 non-blocking 처리, 필요 시 스레드 풀에서 처리

 

SseEmitter

내부에서 HttpServletRequest.startAsync()를 호출해 비동기 서블릿 기능을 사용

AsyncContext에 묶인 스레드(또는 비동기 I/O 스레드)가 열린 소켓으로 chunked HTTP 바디를 전송

 

WebSocket - 핸들러 등록만으로 메시지 라우팅, 세션 관리, sub-protocol 지원 등을 제공