개요
웹소켓(WebSocket)은 웹 애플리케이션에서 양방향 통신을 가능하게 하는 표준화된 프로토콜입니다. HTTP 프로토콜과 달리 웹소켓은 서버와 클라이언트 간에 지속적인 연결을 제공하여 실시간 데이터 전송이 가능합니다.
일반적으로 HTTP 요청은 클라이언트가 서버에게 요청을 보내고, 서버는 응답을 보내는 단방향 통신이었습니다. 그러나 웹소켓은 연결을 유지하면서 클라이언트와 서버 간에 양방향 통신이 가능해집니다.
웹소켓을 사용하면 실시간 채팅, 주식 시세 업데이트, 멀티플레이어 게임 등과 같은 애플리케이션에서 실시간 정보를 보내고 받을 수 있습니다. 이러한 특성으로 인해 웹소켓은 웹 기반의 실시간 응용 프로그램을 개발하는 데 매우 유용하게 활용됩니다.
WebSocket 사용
build.gradle 파일에 dependency를 추가해줍니다.
implementation 'org.springframework.boot:spring-boot-starter-websocket'
TextWebSocketHandler를 상속받는 WebSocketHandler를 작성합니다. WebSocketHandler는 BinaryWebSocketHandler, TextWebSocketHandler가 있습니다.
@Getter
@Component
public class WebSocketHandler extends TextWebSocketHandler {
private Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);
private final List<WebSocketSession> sessionList = new ArrayList<WebSocketSession>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.info("{} 연결됨", session.getId());
sessionList.add(session);
logger.info(session + " 웹소켓 생성");
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
logger.info("payload : " + payload);
for(WebSocketSession sess: sessionList) {
sess.sendMessage(message);
}
}
@Override
public void afterConnectionClosed(final WebSocketSession session, final CloseStatus status) throws Exception {
logger.info(session + " 웹소켓 해제");
sessionList.remove(session);
}
}
TextWebSocketHandler는 텍스트 기반의 WebSocket 메시지를 처리하는 데 사용됩니다. 이 클래스를 상속하고 필요한 메서드를 구현하여 WebSocket 연결의 열기, 닫기, 메시지 수신 등의 이벤트를 처리할 수 있습니다. 주요 메서드로는 다음과 같은 것들이 있습니다:
1. handleTextMessage() : 클라이언트로부터 텍스트 메시지를 수신했을 때 호출되는 메서드입니다. 메시지를 처리하고 응답을 생성할 수 있습니다.
2. afterConnectionEstablished() : 클라이언트와 WebSocket 연결이 성공적으로 설정되었을 때 호출되는 메서드입니다. 초기화 작업이나 연결 이벤트에 대한 처리를 할 수 있습니다.
3. afterConnectionClosed() : WebSocket 연결이 닫혔을 때 호출되는 메서드입니다. 자원을 정리하거나 추가적인 처리를 할 수 있습니다.
WebSocketConfigurer를 구현하는 WebSocketConfig 파일을 작성합니다. WebSocketConfigurer를 구현함으로써 WebSocket을 설정하고 관리할 수 있습니다.
@Configuration
@RequiredArgsConstructor
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final WebsocketHandler websocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(websocketHandler, "wsEvent").setAllowedOrigins("*");
}
}
registerWebSocketHandlers(WebSocketHandlerRegistry registry) 메서드는 WebSocket 핸들러를 등록하는 데 사용됩니다. WebSocketHandlerRegistry를 통해 WebSocket 연결을 처리하는 핸들러를 등록할 수 있습니다. 주로 사용되는 메서드는 addHandler()로, 핸들러와 URL 매핑, 옵션 등을 설정할 수 있습니다.
addHandler 함수를 통해 웹소켓 서버의 엔드포인트는 wsEvent로 설정하였고 setAllowedOrigins("*")을 통해 클라이언트에서 웹소켓 서버에 요청 시 모든 요청을 수용하게 설정하였습니다.(CORS)
서버에서 클라이언트로 메세지를 보내는 테스트 코드를 작성해보도록 하겠습니다.
private final WebSocketHandler webSocketHandler;
ObjectMapper objectMapper = new ObjectMapper();
for(WebSocketSession session : webSocketHandler.getSessionList()) {
String message = objectMapper.writeValueAsString(map);
session.sendMessage(new TextMessage(message));
}
webSocketHandler가 @RequiredArgsConstructor로 주입되게 하고 WebSocketSession.sendMessage 함수로 웹소켓 서버와 연결된 클라이언트에 메세지를 전송합니다.
message가 text가 아니고 map, dto 형식이면 ObjectMapper.writeValueAsString 함수를 이용해서 string으로 변환 후 TextMessage의 생성자의 인자로 사용하면 됩니다.
클라이언트 javascript는 아래와 같이 작성합니다.
const websocket = new WebSocket("ws://localhost:8080/wsEvent");
websocket.onmessage = function(msg){
const data = JSON.parse(msg.data);
console.dir(data);
}
WebSocket 객체를 통해 웹소켓 서버 연결을 생성할 수 있습니다. websocket.onmessage 함수는 데이터를 수신했을때 호출됩니다.
참고자료
https://developer.mozilla.org/ko/docs/Web/API/WebSocket
'개발 > spring, spring boot' 카테고리의 다른 글
[Spring boot] Springdoc-openapi를 통한 Swagger UI 설정 (1) | 2024.01.11 |
---|---|
[Spring boot] WebSocket + STOMP (0) | 2023.12.14 |
spring boot 환경에서 npm 설정하는 방법 (1) | 2023.12.06 |
spring boot 3.2.0 버전 업그레이드 (1) | 2023.12.04 |
View단에서 Form Submit시 Dto 내부에 다른 Dto를 List로 가진 형태일때 처리방법 (0) | 2023.12.04 |