-
용어
WebSocket
HTTP 에서 양방향 통신을 제공하는 프로토콜 (실시간으로 통신이 가능)
STOMP
Simple (or Streaming) Text Oriented Message Protocol
폴링 방식
주기적으로 계속해서 확인
메세지 브로커
ex. RabbitMQ, ActiveMQ etc...
토픽
URI 와 유사한 개념
자신이 받고자 하는 주제를 정의하면 그것에 해당하는 메시지를 수신 했을 때 처리하는 것
서버
설정
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // 메세지 브로커 설정 @Override public void configureMessageBroker(MessageBrokerRegistry config) { // 해당 URI를 구독하고 있는 클라이언트에게 메세지 전달
config.enableSimpleBroker("/topic"); // 컨트롤러 URI의 prefix config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 서버 URI registry.addEndpoint("/gs-guide-websocket").withSockJS(); } }컨트롤러
@Controller public class GreetingController { @MessageMapping("/hello") // Request Mapping 개념 @SendTo("/topic/greetings") // 해당 URI를 구독하는 모든 사용자에게 메세지 전송 public Greeting greeting(HelloMessage message) throws Exception { Thread.sleep(1000); // simulated delay return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"); } }
클라이언트
HTML에서 자바스크립트 라이브러리 import
<script src="/webjars/sockjs-client/sockjs.min.js"></script>
<script src="/webjars/stomp-websocket/stomp.min.js"></script>
자바스크립트 파일
function connect() { var socket = new SockJS('/gs-guide-websocket'); stompClient = Stomp.over(socket); stompClient.connect({}, function (frame) { setConnected(true); console.log('Connected: ' + frame); /topic/greetings에 대한 구독 신청 stompClient.subscribe('/topic/greetings', function (greeting) { showGreeting(JSON.parse(greeting.body).content); }); }); } ... function sendName() { stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()})); }
function showGreeting(message) { $("#greetings").append("<tr><td>" + message + "</td></tr>"); }
참고
http://heowc.tistory.com/10
https://spring.io/guides/gs/messaging-stomp-websocket/
http://asfirstalways.tistory.com/359
https://supawer0728.github.io/2018/03/30/spring-websocket/
https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#websocket-stomp-message-flow