Playcloud8
실시간/채팅

STOMP는 웹소켓 위에서 어떤 역할을 할까

2026-07-11  ·  조회 39
웹소켓 자체는 "연결을 열어두고 양방향으로 데이터를 주고받을 수 있다"는 통신 통로만 제공할 뿐, 그 통로로 오가는 메시지를 어떤 형식으로 구성하고 누구에게 전달할지에 대한 규칙은 정해주지 않습니다. 채팅방이 여러 개이고 사용자도 여러 명인 서비스에서는, 이 "누구에게 무엇을 보낼지"를 관리하는 상위 규칙이 필요합니다. STOMP(Simple Text Oriented Messaging Protocol)는 이런 필요를 충족시키기 위해 웹소켓 위에 얹는 메시징 프로토콜입니다. 이메일 헤더와 비슷하게 메시지 앞에 명령어와 목적지 정보를 붙이는 단순한 텍스트 형식을 사용해서, "이 메시지는 어떤 주제(destination)로 보내는 것인지"를 명확히 표현할 수 있게 해줍니다. STOMP의 핵심 개념 중 하나는 구독(subscribe)입니다. 클라이언트는 관심 있는 특정 주제(예: 특정 채팅방을 나타내는 경로)를 구독해두고, 서버는 그 주제로 메시지를 발행(publish)하면 해당 주제를 구독 중인 모든 클라이언트에게 자동으로 메시지가 전달됩니다. 이 발행-구독(pub/sub) 모델 덕분에, 서버는 "이 메시지를 누구에게 보내야 하는지"를 개별적으로 계산할 필요 없이 주제 단위로만 관리하면 됩니다. Spring 진영에서는 SockJS와 STOMP를 함께 사용하는 조합이 널리 쓰입니다. SockJS는 웹소켓을 직접 지원하지 않는 구형 환경에서도 유사한 방식으로 동작하도록 대체 통신 방식을 자동으로 선택해주는 역할을 하고, STOMP는 그 위에서 메시지 라우팅 규칙을 담당하는 식으로 역할이 나뉩니다. 이런 구조 덕분에 채팅방마다 별도의 구독 경로를 두고, 각 방의 메시지가 그 방을 구독한 사용자에게만 전달되도록 구현할 수 있습니다. 이 사이트의 실시간 채팅도 이러한 발행-구독 구조를 바탕으로 여러 채팅방의 메시지를 서로 섞이지 않게 처리하고 있습니다.