안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)
해당 포스팅은 프로젝트 진행시 필요한 웹소켓 내용을 참고하고자 아래 주소 포스팅을 참고하여 작성하였습니다.
SpringBoot에서 Websocket 사용하기
Websocket 이란?
서버와 클라이언트 사이에 양방향 통신 채널을 구축할 수 있는 통신 프로토콜이다. 동작 방식은 먼저 HTTP 통신을 연결하고 이후 Upgrade 헤더를 보내 양방향 연결로 업그레이드한다. Websocket은 최신 브라우저에서는 대부분 지원한다.
전체 소스는 참고 내역에 있는 소스를 확인하면 된다.
주요 설정은 다음과 같다.
1. WebSocket Configuration
package com.example.websocketdemo.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("/ws").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic");
}
}
@EnableWebSocketMessageBroker 은 websocket 서버를 사용한다는 설정입니다.
또한 WebSocketMessageBrokerConfigure를 상속 받아 몇몇 메소드를 구현하여 websocket 연결 속성을 설정합니다. registerStompEndpoints를 이용하여 클라이언트에서 websocket에 접속하는 endpoint를 등록합니다.
withSockJS()를 이용시에는 브라우져에서 websocket을 지원하지 않을 경우 fallback 옵션을 활성화 하는데 사용됩니다.
메소드 이름에 STOMP(Simple Text Oriented Messaging Protocol)라는 단어가 있습니다.
이는 스프링프레임워크의 STOMP 구현체를 사용한다는 의미합니다. STOMP가 필요 한 이유는 websocket은 통신 프로토콜이지 특정 주제에 가입한 사용자에게 메시지를 전송하는 기능을 제공하지 않습니다. 이를 쉽게 사용하기 위해 STOMP를 사용합니다.
두변째 메소드configureMessageBroker는 한 클라이언트에서 다른 클라이언트로 메시지를 라우팅 할 때 사용하는 브로커를 구성합니다.
첫번째 라인에서 정의된 /app로 시작하는 메시지만 메시지 헨들러로 라우팅한다고 정의합니다. 두번째 라인에서 정의된 /topic로 시작하는 주제를 가진 메시지를 핸들러로 라우팅하여 해당 주제에 가입한 모든 클라이언트에게 메시지를 방송합니다.
2. ChatController
package com.example.websocketdemo.controller;
import com.example.websocketdemo.model.ChatMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.stereotype.Controller;
@Controller
public class ChatController {
@MessageMapping("/chat.sendMessage")
@SendTo("/topic/public")
public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
return chatMessage;
}
@MessageMapping("/chat.addUser")
@SendTo("/topic/public")
public ChatMessage addUser(@Payload ChatMessage chatMessage,
SimpMessageHeaderAccessor headerAccessor) {
// Add username in web socket session
headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
return chatMessage;
}
}
@MessageMapping는 클라이언트에서 보내는 메시지를 매핑합니다.
호출 되는 주소는 /app/chart.addUer, /app/chat.sendMessage가 됩니다.
3. main.js
javascript 에서 실제 사용은 다음 같이 사용합니다.
function connect(event) {
username = document.querySelector('#name').value.trim();
if(username) {
usernamePage.classList.add('hidden');
chatPage.classList.remove('hidden');
var socket = new SockJS('/ws');
stompClient = Stomp.over(socket);
stompClient.connect({}, onConnected, onError);
}
event.preventDefault();
}
function onConnected() {
// Subscribe to the Public Topic
stompClient.subscribe('/topic/public', onMessageReceived);
// Tell your username to the server
stompClient.send("/app/chat.addUser",
{},
JSON.stringify({sender: username, type: 'JOIN'})
)
connectingElement.classList.add('hidden');
}
.... 중략
connect를 통해 클라이언트는 websocket을 연결 합니다.
연결에 성공하면 /topic/public 주제에 가입하여 메시지를 주고 받습니다.
참고 내역
- callicoder/spring-boot-websocket-chat-demo
- Building a chat application with Spring Boot and WebSocket
- WebSocket과 Socket.io
'。*:・゚☆・゚schedule・゚*:・゚★・:*:・☆ *:・゚★ > 활용해본 코드 적용 예시 (◍•ᴗ•◍)❤' 카테고리의 다른 글
[SpringBoot] java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 오류 해결과정 (0) | 2023.09.18 |
---|---|
[SpringBoot] 게시글 상세조회 ajax 비동기식 조회하기 (0) | 2023.09.15 |
[Spring boot] 스프링부트 웹소켓 SockJs 구성하기 (0) | 2023.09.01 |
Spring 스프링 CSS 적용 안되는 에러 해결 (+이미지 파일 불러오기 에러 해결) (1) | 2023.08.24 |
인스타그램 알람 기능 구현 - 모달창 크기 조절, 내용 제한(기본틀 및 활용예시) (0) | 2023.08.24 |