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 지원 등을 제공