-
Spring Boot 시리즈 37편 – 실시간 기능을 위한 WebSocket 연동 전략기술과 산업/언어 및 프레임워크 2025. 5. 29. 16:56728x90
실시간 기능은 이제 선택이 아닌 필수입니다. 특히 알림, 채팅, 모니터링, IoT, 협업 툴 등에서는 WebSocket을 통한 실시간 양방향 통신이 핵심 기술로 자리 잡고 있습니다. 이번 글에서는 Spring Boot에서 WebSocket을 적용하는 전략과 실무 예제를 중심으로 상세히 다뤄보겠습니다.
WebSocket이 필요한 이유
HTTP는 본질적으로 클라이언트가 요청해야 서버가 응답을 주는 구조입니다. 이 방식으로는 실시간 알림이나 채팅처럼 서버가 먼저 데이터를 보내야 하는 시나리오에 적합하지 않습니다. 이를 해결하기 위해 WebSocket이 등장했습니다.
WebSocket은 TCP 기반의 양방향 통신 프로토콜로, 클라이언트와 서버가 지속적인 연결을 유지하며 실시간 메시지를 주고받을 수 있습니다.
Spring Boot에서 WebSocket 설정
1. 의존성 추가
Spring Boot에서 WebSocket을 사용하려면 spring-boot-starter-websocket 모듈이 필요합니다.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
2. WebSocket Config 클래스 작성
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS(); } }
- /ws는 WebSocket 연결 엔드포인트
- /topic은 브로드캐스트 용도
- /app은 클라이언트에서 보낼 주소 prefix
3. 메시지 처리 Controller
@Controller public class ChatController { @MessageMapping("/chat.send") @SendTo("/topic/public") public ChatMessage sendMessage(ChatMessage message) { return message; } }
- 클라이언트가 /app/chat.send로 메시지를 보내면
- 서버는 /topic/public으로 전송합니다.
4. 메시지 DTO 클래스 예시
public class ChatMessage { private String sender; private String content; private String timestamp; }
클라이언트 연동 예 (JavaScript + SockJS + Stomp)
const socket = new SockJS('/ws'); const stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { stompClient.subscribe('/topic/public', function(message) { console.log("Received: ", JSON.parse(message.body)); }); stompClient.send("/app/chat.send", {}, JSON.stringify({ sender: 'user1', content: 'Hello!', timestamp: new Date().toISOString() })); });
운영 환경을 고려한 최적화 전략
- 클러스터 환경에서는 Redis Pub/Sub, Kafka 등 외부 브로커 연동이 필요합니다.
- STOMP heartbeat 설정을 통해 연결 유지 상태를 정기적으로 확인합니다.
- 권한 인증: JWT 기반 인증 또는 WebSocket handshake 시 헤더 검증 전략 필요합니다.
실무 팁
- SockJS를 함께 사용하라
→ 브라우저 호환성과 fallback을 보장합니다. - 보안 필수
→ /ws 접속 시 WebSecurity 설정으로 인증이 필요한 경우를 구분합니다. - 메시지 크기 제한
→ 대용량 메시지는 별도의 업로드 API를 사용하고, WebSocket은 신호만 주는 방식이 안정적입니다.
결론
Spring Boot에서 WebSocket은 설정이 간결하면서도 실무에서 유용하게 사용할 수 있는 실시간 통신 수단입니다. 이 글에서는 기본 설정부터 클라이언트 연동, 실무 고려사항까지 폭넓게 다뤘습니다. 이후에는 보안 처리, Redis 기반 메시지 브로커 연동 등 고도화 전략을 다룰 예정입니다.
728x90'기술과 산업 > 언어 및 프레임워크' 카테고리의 다른 글
FastAPI 시리즈 12화 - JWT 기반 인증 시스템 완성: 토큰 구조와 보안 처리 심화 (0) 2025.05.30 Spring Boot 시리즈 38편 – Spring Boot에서 분산 트레이싱(Distributed Tracing) 적용하기 (1) 2025.05.29 Spring Framework 시리즈 10화 – 실무 예제: 간단한 DI 기반 계산기 시스템 구현 (0) 2025.05.29 전자정부 표준프레임워크 시리즈 11화 – 공통 코드 관리 기능 완벽 정리: 코드 테이블, 조회 서비스, 화면 연동까지 (2) 2025.05.28 Spring Framework 시리즈 9화 – ApplicationContext의 역할과 이벤트 처리 구조 (0) 2025.05.28