스프링 Spring
21. Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. 웹소켓(WebSocket)이란?
✔ 웹소켓(WebSocket)은 클라이언트와 서버 간에 실시간 양방향 통신을 가능하게 하는 프로토콜
✔ HTTP 요청-응답 방식과 달리, 지속적인 연결을 유지하며 데이터를 주고받을 수 있음
📌 웹소켓의 주요 특징
| 양방향 통신(Bidirectional Communication) | 클라이언트와 서버가 실시간으로 데이터를 주고받을 수 있음 |
| Persistent Connection(연결 유지) | 초기 연결 후 계속해서 데이터를 송수신 가능 |
| 낮은 지연 시간(Low Latency) | HTTP보다 빠르게 데이터를 전달할 수 있음 |
| 이벤트 기반 메시징 | 클라이언트와 서버 간 메시지를 이벤트로 처리 가능 |
📌 웹소켓을 사용하면 "실시간 채팅, 주식 시세 조회, 온라인 게임 등에서 빠른 데이터 전송이 가능"
2. HTTP vs WebSocket 비교
✔ 웹소켓은 기존 HTTP 통신 방식보다 효율적으로 실시간 데이터를 처리할 수 있음
📌 HTTP vs WebSocket 비교
| 통신 방식 | 요청-응답(Request-Response) 방식 | 양방향 통신(Bidirectional) |
| 연결 유지 | 요청마다 새로운 연결 생성 | 지속적인 연결 유지 |
| 성능 | 다량의 요청이 필요한 경우 부하 증가 | 지속적인 연결로 성능 향상 |
| 사용 사례 | 일반적인 웹 애플리케이션 | 실시간 채팅, 주식 시세, 게임 등 |
📌 웹소켓을 활용하면 "지속적인 연결을 통해 실시간 데이터를 효율적으로 주고받을 수 있음"
✅ 여기까지 웹소켓의 개념과 HTTP 대비 장점을 배웠습니다!
👉 "그렇다면, Spring Boot에서 웹소켓을 어떻게 구현할까?"
✅ 2부에서 Spring Boot에서 웹소켓을 설정하고, 실시간 데이터 처리를 구현하는 방법을 배워봅시다!
2. 상세 주제 정리
1. Spring Boot 프로젝트에서 WebSocket 설정
✔ 웹소켓을 사용하려면 Spring Boot에서 spring-boot-starter-websocket 의존성을 추가해야 함
📌 1️⃣ build.gradle 설정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-websocket'
}
✔ 웹소켓 지원을 위한 라이브러리 추가
2. WebSocket 설정 및 핸들러 구현
✔ WebSocket을 활성화하고, 클라이언트와 서버 간 메시지를 처리하는 핸들러 구현
📌 WebSocketConfig 설정 – 웹소켓 활성화
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final WebSocketHandler webSocketHandler;
public WebSocketConfig(WebSocketHandler webSocketHandler) {
this.webSocketHandler = webSocketHandler;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(webSocketHandler, "/ws/chat").setAllowedOrigins("*");
}
}
✔ 웹소켓 핸들러를 /ws/chat 경로에 등록하여 클라이언트와 연결 가능
📌 WebSocket 핸들러 구현 – 메시지 처리
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.stereotype.Component;
@Component
public class WebSocketHandler extends TextWebSocketHandler {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
System.out.println("Received: " + payload);
session.sendMessage(new TextMessage("Echo: " + payload));
}
}
✔ 클라이언트에서 보낸 메시지를 받아 다시 클라이언트로 전송(Echo)하는 기능 구현
📌 웹소켓을 설정하면 "클라이언트와 서버 간 실시간 데이터 송수신 가능"
3. WebSocket 클라이언트(JavaScript) 연결
✔ 웹 브라우저에서 웹소켓을 이용하여 서버와 연결 가능
📌 JavaScript에서 WebSocket 연결 예제
const socket = new WebSocket("ws://localhost:8080/ws/chat");
// 서버와 연결이 열리면 실행
socket.onopen = function() {
console.log("WebSocket 연결됨");
socket.send("안녕하세요, 서버!");
};
// 서버에서 메시지를 받으면 실행
socket.onmessage = function(event) {
console.log("서버로부터 받은 메시지: " + event.data);
};
// 연결이 닫히면 실행
socket.onclose = function() {
console.log("WebSocket 연결 종료");
};
✔ 클라이언트에서 웹소켓을 통해 서버와 연결하고, 메시지를 송수신 가능
📌 웹소켓을 사용하면 "실시간 채팅, 알림 시스템 등의 기능을 구현 가능"
4. Spring Boot에서 STOMP를 활용한 웹소켓 메시징
✔ 웹소켓의 확장 기능으로 STOMP(Simple Text Oriented Messaging Protocol)를 활용 가능
✔ STOMP를 사용하면 채팅방, 브로드캐스트 등 더욱 확장된 메시징이 가능
📌 STOMP를 활성화하는 WebSocketConfig 설정
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); // 메시지를 전달할 경로
config.setApplicationDestinationPrefixes("/app"); // 클라이언트가 메시지를 보낼 경로
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws-stomp").setAllowedOrigins("*").withSockJS();
}
}
✔ STOMP 기반 웹소켓을 활성화하고, /ws-stomp 엔드포인트를 설정
📌 STOMP 컨트롤러에서 메시지 처리
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class ChatController {
@MessageMapping("/message") // 클라이언트가 보낸 메시지 경로
@SendTo("/topic/chat") // 모든 구독자에게 메시지 전송
public String sendMessage(String message) {
return "Server: " + message;
}
}
✔ 클라이언트에서 메시지를 보내면, 모든 구독자에게 메시지 전송
📌 STOMP를 활용하면 "확장된 웹소켓 메시징 기능을 제공 가능"
✅ 여기까지 Spring Boot에서 웹소켓(WebSocket)과 실시간 데이터 처리 방법을 배웠습니다!
👉 "그렇다면, Spring Security에서 RBAC(Role-Based Access Control) 적용은 어떻게 할까?"
✅ 다음 회차에서 Spring Security에서 RBAC(Role-Based Access Control) 적용을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
| Spring 기초 <25. Spring Boot에서 GraphQL API 개발 (Spring GraphQL)> (0) | 2025.04.11 |
|---|---|
| Spring 기초 <24. Spring Boot에서 Kafka 이벤트 스트리밍 시스템 구축> (0) | 2025.04.10 |
| Spring 기초 <23. Spring Boot에서 Multi-Tenancy 아키텍처 구현> (0) | 2025.04.09 |
| Spring 기초 <22. Spring Security에서 RBAC(Role-Based Access Control) 적용> (1) | 2025.04.08 |
| Spring 기초 <20. Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)> (1) | 2025.04.06 |
| Spring 기초 <19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)> (0) | 2025.04.05 |
| Spring 기초 <18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용> (0) | 2025.04.04 |
| Spring 기초 <17. Spring Boot에서 JWT(Json Web Token) 인증 구현> (0) | 2025.04.03 |