중간에 에러코드가 포함돼있으니 따라할거면 한 번 쭉 보고 따라하기!
스프링에서 STOMP를 이용하여 웹소켓을 구현해볼 예정이다.
**STOMP(Simple Text Oriented Messaging Protocol)**이란 웹소켓 위에서 동작하는 프로토콜로써, 클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용등을 정의하는 매커니즘이다.
STOMP를 사용하지 않고 Websocket만 이용하여 구현했을 경우에는 해당 메세지가 어떤 요청인지, 어떻게 처리해야 하는지에 따라 채팅방과 세션을 일일이 구현하고 메세지 발송 부분을 관리하는 추가 코드를 구현해주어야 하는데 STOMP는 이것을 정의해줘서 개발자에게 편리하게 틀을 맞춰준 규약이라고 볼 수 있겠따. 순수 자바로만 서버를 개발하면 하나부터 열까지 일일이 구현해줘야 하지만 스프링은 그에 맞춘 틀을 제공하므로 스프링으로 서버를 개발하는것과 비슷한 이치 아닐까싶다.
또 SockJS 라는것이 등장하는데, 이것은 WebSocket으로 작동이 안될 때, 알아서 다른 방식으로 전환해 다시 연결을 시도해주는 WebSocket Emulation이다. emulation의 의미는 어떤 연산, 수행등의 기법을 복제하여 그대로 실행할 수 있도록 만든것을 의미한다. sockjs는 websocket의 기능을 따라하는 에뮬레이터라고 보는거같다. 무슨말이냐면 웹소켓은 HTML5에서부터 작동하는데, 모든 브라우저가 이 기능을 지원하는것이 아니다. IE는 10부터 지원하고 있으며 파이어폭스도 10부터 지원하는 등 구버전의 브라우저를 사용하면 웹소켓방식이 아닌, 이것을 비슷하게 따라했던 long-polling 방식등을 이용하여 웹소켓과 같은 기능을 하게 끔 도와주는것을 node.js에서는 socket.io, spring에서는 sockjs이라고 보면 된다.
package com.ssafy.yam.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat")
.setAllowedOrigins("<http://localhost:8080>")
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/pub")
.enableSimpleBroker("/sub");
}
}
STOMP는 기본적으로 퍼블리셔, 섭스크라이버 구조로 되어있다. 여기서 중간역할로 브로커가 존재하며 이를 통해 타 사용자들에게 메세지를 보내거나 서버가 특정 작업을 수행하도록 한다. 이 config파일에서는 @EnableWebSocketMessageBroker를 통해 웹소켓, 브로커 기능을 활성화 해준다
다음으로 접근할 url을 설정하는 endpoint를 추가해준다.
destination은 일반적으로 다음의 형식을 따른다. (정해진건 아니지만 관습?)
"topic/.."--> publish-subscribe(1:N)
"queue/" --> point-to-point(1:1)
아래는 사용된 함수들에 대한 설명이다.
setApplicationDestinationPrefixes : Client에서 SEND 요청을 처리
enableSimpleBroker
enableStompBrokerRelay(이건 없는데 왜 써있는지 나중에 확인해볼 예정)