Spring Framework는 많은 기능을 제공하며, 이 중에서도 Spring Websocket은 실시간 웹 애플리케이션을 개발하는 데 매우 유용한 기능입니다. 이 기능을 사용하면 웹 페이지에서 서버로 실시간으로 데이터를 전송하거나, 서버에서 클라이언트로 실시간으로 데이터를 전달할 수 있습니다. 이번 글에서는 Spring Websocket의 개요, 필요성, 구성 요소, 동작 방식, 실시간 메시징 구현 방법, 그리고 실시간 웹 애플리케이션 구현 예시에 대해 알아보겠습니다.
Spring Websocket의 개요와 필요성
Spring Websocket은 WebSocket 프로토콜을 지원하는 Spring 프레임워크의 모듈입니다. WebSocket 프로토콜을 사용하면 클라이언트와 서버 사이에 양방향 통신을 할 수 있습니다. 즉, 서버에서 데이터를 보내면 클라이언트에서 바로 받아볼 수 있고, 클라이언트에서 데이터를 보내면 서버에서 바로 받아볼 수 있습니다.
Spring Websocket을 사용하면 서버와 클라이언트 사이에 실시간으로 데이터를 주고받을 수 있기 때문에, 다음과 같은 상황에서 매우 유용합니다.
- 채팅 애플리케이션
- 실시간 게임
- 주식 시장 등의 실시간 데이터를 보여주는 웹 애플리케이션
Spring Websocket의 구성 요소와 동작 방식
Spring Websocket은 크게 세 가지 구성 요소로 이루어져 있습니다.
- WebSocketHandler: WebSocket 연결을 관리하고, 클라이언트로부터의 메시지를 받아서 처리하는 역할을 합니다.
- WebSocketSession: WebSocketHandler와 클라이언트 사이의 연결을 나타내며, 클라이언트로부터 메시지를 받아서 WebSocketHandler로 전달합니다.
- WebSocketMessage: WebSocketSession과 WebSocketHandler 간에 전송되는 메시지입니다.
Spring Websocket은 WebSocket 연결을 관리하기 위해 다음과 같은 순서로 동작합니다.
- 클라이언트가 WebSocket 연결을 요청합니다.
- 서버는 WebSocketHandler를 생성합니다.
- WebSocketHandler는 WebSocketSession을 생성합니다.
- WebSocketSession은 클라이언트와 WebSocketHandler 간의 연결을 나타냅니다.
- 클라이언트는 WebSocketSession을 사용하여 서버로 메시지를 보냅니다.
- WebSocketSession은 WebSocketHandler로 메시지를 전달합니다.
- WebSocketHandler는 메시지를 처리하고, 필요에 따라 클라이언트로 메시지를 전송합니다.
Spring Websocket을 활용한 실시간 메시징 구현 방법
Spring Websocket을 사용하여 실시간 메시징을 구현하는 방법은 다음과 같습니다.
- WebSocketHandler 구현하기
WebSocketHandler 인터페이스를 구현한 클래스를 작성합니다. 이 클래스에서는 클라이언트로부터 메시지를 받아서 처리하는 코드를 작성합니다.
@Component
public class MyWebSocketHandler implements WebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// WebSocket 연결이 성공한 후 호출됩니다.
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception {
// 클라이언트로부터 메시지를 받았을 때 호출됩니다.
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
// WebSocket 연결 중 오류가 발생했을 때 호출됩니다.
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
// WebSocket 연결이 종료되었을 때 호출됩니다.
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
- WebSocketConfigurer 구현하기
WebSocketConfigurer 인터페이스를 구현한 클래스를 작성합니다. 이 클래스에서는 WebSocketHandler를 등록하는 코드를 작성합니다.
@Configuration
@EnableWebSocket
public class MyWebSocketConfigurer implements WebSocketConfigurer {
@Autowired
private MyWebSocketHandler myWebSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myWebSocketHandler, "/my-websocket");
}
}
- 클라이언트에서 WebSocket 연결하기
웹 페이지에서 WebSocket을 사용하기 위해서는 다음과 같은 코드를 작성해야 합니다.
var ws = new WebSocket("ws://localhost:8080/my-websocket");
ws.onopen = function() {
// WebSocket 연결이 성공한 후 호출됩니다.
};
ws.onmessage = function(event) {
// 서버로부터 메시지를 받았을 때 호출됩니다.
};
ws.onclose = function(event) {
// WebSocket 연결이 종료되었을 때 호출됩니다.
};
ws.onerror = function(event) {
// WebSocket 연결 중 오류가 발생했을 때 호출됩니다.
};
Spring Websocket을 활용한 실시간 웹 애플리케이션 구현 예시
Spring Websocket을 사용하여 실시간 웹 애플리케이션을 구현하는 방법을 예시로 살펴보겠습니다. 예시로는 간단한 채팅 애플리케이션을 구현해보겠습니다.
- WebSocketHandler 구현하기
@Component
public class ChatWebSocketHandler implements WebSocketHandler {
private List sessions = new CopyOnWriteArrayList();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception {
String payload = (String) message.getPayload();
for (WebSocketSession s : sessions) {
s.sendMessage(new TextMessage(payload));
}
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
sessions.remove(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
sessions.remove(session);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
- WebSocketConfigurer 구현하기
@Configuration
@EnableWebSocket
public class ChatWebSocketConfigurer implements WebSocketConfigurer {
@Autowired
private ChatWebSocketHandler chatWebSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatWebSocketHandler, "/chat");
}
}
- HTML 파일 작성하기
Chat
위와 같이 작성하면, 웹 페이지에서 입력한 메시지가 다른 클라이언트에게 실시간으로 전달됩니다.
이번 글에서는 Spring Websocket의 개요, 필요성, 구성 요소, 동작 방식, 실시간 메시징 구현 방법, 그리고 실시간 웹 애플리케이션 구현 예시에 대해 알아보았습니다. Spring Websocket을 사용하면 실시간으로 데이터를 주고받는 웹 애플리케이션을 쉽게 구현할 수 있습니다. 이를 통해 채팅 애플리케이션, 실시간 게임, 실시간 데이터를 보여주는 웹 애플리케이션 등을 구현할 수 있습니다. Spring Websocket을 사용하여 다양한 실시간 웹 애플리케이션을 개발해보세요!
Reference : Spring Websocket을 활용한 실시간 웹 애플리케이션 구현 방법