목차
STOMP
- Simple Text Orientated Messaging Protocol의 약자
- Web Socket 위에서 동작하며 서버를 거쳐 클라이언트 간의 비동기 양방향 통신을 지원하는 프로토콜이다.
- 서버와 클라이언트가 통신할 주체인 메시지의 유형, 형식, 내용들을 정의한다.
- 이름에서 알 수 있듯이 Text 기반의 메시지 형식을 사용한다.
- pub/sub 형태의 통신이다.
- PUB(Publish) : 특정 토픽을 구독 중인 모든 클라이언트에게 메시지 발행
- SUB(Subscribe) : 특정 토픽을 클라이언트가 구독
- STOMP를 사용한다는 말이 메시지 브로커를 사용한다는 말과 동치는 아니지만, 대부분의 경우, STOMP를 통한 통신은 메시지 브로커와 함께 사용된다.
STOMP 사용 이점
- 메시지의 형식을 정의할 수 있기 때문에, 서버 - 클라이언트 통신의 일관성을 유지할 수 있다.
- SpringBoot에서 STOMP를 사용하면 통신 과정을 간단하고 직관적으로 구현할 수 있다.
- 메시지 브로커를 통한 메시지 라우팅과 브로드캐스팅을 지원한다. 이를 통해 여러 클라이언트 간의 메시지 전파 및 구독 기능을 효과적으로 구현할 수 있다.
- 이 외에도 메시지 브로커의 장점을 동일하게 가질 수 있다.
- 정리하자면, 통신의 구축 및 커넥션 관리가 용이해진다.
SpringBoot에서 STOMP 활용한 통신 구축 예제
WsConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WsConfig implements WebSocketMessageBrokerConfigurer{
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/test-socket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
- SockJS를 사용하여 ‘/test-socket’ 이라는 엔드포인트를 명시하고, 이를 통해 프론트 단에서 통신할 수 있도록 한다.
Main.js
function connect(event) {
username = document.querySelector('#name').value.trim();
if(username) {
usernamePage.classList.add('hidden');
chatPage.classList.remove('hidden');
var socket = new SockJS('/test-socket');
stompClient = Stomp.over(socket);
stompClient.connect({}, onConnected, onError);
}
event.preventDefault();
}
ChatController.java
@Controller
public class ChatController {
@MessageMapping("/chat.register")
@SendTo("/topic/public")
public ChatMessage register(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
@MessageMapping("/chat.send")
@SendTo("/topic/public")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
return chatMessage;
}
}
ChatMessage.java
@Getter @Setter
public class ChatMessage {
private String content;
private String sender;
private MessageType type;
public enum MessageType {
CHAT, LEAVE, JOIN
}
}
반응형
'Study > JAVA' 카테고리의 다른 글
[백준 1764] HashSet - contains, sort (0) | 2022.11.24 |
---|---|
[백준 9375] HashMap - containsKey, 전체 탐색 (0) | 2022.11.23 |
STOMP
- Simple Text Orientated Messaging Protocol의 약자
- Web Socket 위에서 동작하며 서버를 거쳐 클라이언트 간의 비동기 양방향 통신을 지원하는 프로토콜이다.
- 서버와 클라이언트가 통신할 주체인 메시지의 유형, 형식, 내용들을 정의한다.
- 이름에서 알 수 있듯이 Text 기반의 메시지 형식을 사용한다.
- pub/sub 형태의 통신이다.
- PUB(Publish) : 특정 토픽을 구독 중인 모든 클라이언트에게 메시지 발행
- SUB(Subscribe) : 특정 토픽을 클라이언트가 구독
- STOMP를 사용한다는 말이 메시지 브로커를 사용한다는 말과 동치는 아니지만, 대부분의 경우, STOMP를 통한 통신은 메시지 브로커와 함께 사용된다.
STOMP 사용 이점
- 메시지의 형식을 정의할 수 있기 때문에, 서버 - 클라이언트 통신의 일관성을 유지할 수 있다.
- SpringBoot에서 STOMP를 사용하면 통신 과정을 간단하고 직관적으로 구현할 수 있다.
- 메시지 브로커를 통한 메시지 라우팅과 브로드캐스팅을 지원한다. 이를 통해 여러 클라이언트 간의 메시지 전파 및 구독 기능을 효과적으로 구현할 수 있다.
- 이 외에도 메시지 브로커의 장점을 동일하게 가질 수 있다.
- 정리하자면, 통신의 구축 및 커넥션 관리가 용이해진다.
SpringBoot에서 STOMP 활용한 통신 구축 예제
WsConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WsConfig implements WebSocketMessageBrokerConfigurer{
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/test-socket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
- SockJS를 사용하여 ‘/test-socket’ 이라는 엔드포인트를 명시하고, 이를 통해 프론트 단에서 통신할 수 있도록 한다.
Main.js
function connect(event) {
username = document.querySelector('#name').value.trim();
if(username) {
usernamePage.classList.add('hidden');
chatPage.classList.remove('hidden');
var socket = new SockJS('/test-socket');
stompClient = Stomp.over(socket);
stompClient.connect({}, onConnected, onError);
}
event.preventDefault();
}
ChatController.java
@Controller
public class ChatController {
@MessageMapping("/chat.register")
@SendTo("/topic/public")
public ChatMessage register(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
@MessageMapping("/chat.send")
@SendTo("/topic/public")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
return chatMessage;
}
}
ChatMessage.java
@Getter @Setter
public class ChatMessage {
private String content;
private String sender;
private MessageType type;
public enum MessageType {
CHAT, LEAVE, JOIN
}
}
반응형
'Study > JAVA' 카테고리의 다른 글
[백준 1764] HashSet - contains, sort (0) | 2022.11.24 |
---|---|
[백준 9375] HashMap - containsKey, 전체 탐색 (0) | 2022.11.23 |