Spring Boot + Stomp + React로 구현한 간이 통신효과

백엔드: Spring Boot

Maven 의존성

Spring Boot 공식 스타터 사용

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

WebSocket 설정 클래스

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/wshub/topic");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/wshub/webServer").setAllowedOrigins("*").withSockJS();
    }
}

WebSocket 컨트롤러

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/wshub")
public class WebSocketController {
    @Autowired
    private SimpMessagingTemplate template;

    @MessageMapping("/subscribe")
    public void subscribe(MessageVO message) {
        for (int i = 1; i <= 20; i++) {
            template.convertAndSend("/wshub/topic/getResponse", message.getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

프론트 엔드: React

라이브러리 설치

yarn add sockjs-client webstomp-client

WebSocket 연결 설정

import { Button } from "antd";
import { useEffect, useState } from "react";
import SockJS from "sockjs-client";
import Stomp from "webstomp-client";

const ChatView = () => {
    const [stompClient, setStompClient] = useState();
    const [newMessage, setNewMessage] = useState();
    const [messages, setMessages] = useState([]);
    const [isConnected, setIsConnected] = useState(false);

    const connectToServer = () => {
        const socket = new SockJS("https://172.16.1.219:3000/server/wshub/webServer");
        const client = Stomp.over(socket)();
        client.connect(
            {},
            frame => {
                setIsConnected(true);
                console.log("연결 성공:", frame);
                client.subscribe("/wshub/topic/monitor", message => {
                    console.log("수신 메시지:", message);
                    const receivedMsg = { content: message.body };
                    setNewMessage(receivedMsg);
                });
            },
            error => {
                console.log("연결 실패:", error);
            }
        );
        window.stompClient = client;
        setStompClient(client);
    };

    const sendMessage = () => {
        stompClient.send('/subscribe', JSON.stringify({ 'name': "테스트 메시지" }));
    };

    useEffect(() => {
        if (newMessage) {
            setMessages([newMessage, ...messages]);
        }
    }, [newMessage]);

    return (
        <div>
            <div>
                {messages.map(msg => (
                    <div key={msg.content}>{msg.content}</div>
                ))}
            </div>
        </div>
    );
};

export default ChatView;

태그: Spring Boot STOMP React websocket

7월 12일 00:21에 게시됨