Latency alone is not a deciding factor. If the volume of messages is relatively low (e.g. monitoring network failures) HTTP streaming or polling may provide an effective solution. It is the combination of low latency, high frequency and high volume that make the best case for the use WebSocket.
먼저 클라이언트가 서버에 HTTP 프로토콜로 핸드쉐이크 요청을 한다. 서버에서는 응답 코드를 101 로 응답해준다.
웹소켓을 위한 포트
HTTP 또는 HTTPS 통신을 위해 오픈한 포트를 사용한다. 웹소켓은 HTTP 포트 80, 와 HTTPS 443위에서 동작되도록 설계가 되었다. 별도의 포트를 오픈할 필요가 없다. 호환을 위해서 핸드쉐이크는 HTTP upgrade 헤더를 사용하며, HTTP 프로토콜에서 웹소켓 프로토콜로 변경한다.
ws와 wws의 차이 :
우리는 보안을 위해서 HTTP 가 아닌 HTTPS를 사용하듯 웹소켓도 wss로 통신해야 시큐어 통신이 가능하다.
스프링부트에서 웹소켓을 연동하는 방법
Spring Framework 공식문서를 참조하였다.
1. build.gradle 에 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.springframework.boot:spring-boot-starter'
}
2. WebSocketConfigurer 인터페이스를 구현한 WebSocketConfiguration 클래스 작성
//WebSocketConfig.java
package com.patientpal.backend.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
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 으로 웹소켓 서버를 사용하도록 정의
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/myHandler");
}
//MyHandler클래스를 웹소켓 핸들러로 정의
@Bean
public WebSocketHandler myHandler() {
return new MyHandler();
}
}
3. 웹소켓 핸들러 클래스 작성
웹소켓 핸들러 클래스는 4개의 메서드를 오버라이드 해야한다.
- afterConnectionEstablished
- handleTextMessage
- afterConnectionClosed
- handleTransportError
//MyHandler.java
package com.patientpal.backend.config;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyHandler extends TextWebSocketHandler {
//최초 연결 시 call
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
}
//양방향 데이터 통신할 때 call
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
//do something
}
//웹소켓 종료시 call
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
}
//통신 에러 발생 시 call
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
}
}
Postman으로 connection 을 시도하면 연결이 잘 된 것을 확인할 수 있다.
Request URL: http://localhost:8080/myHandler 이라고 뜨는데,
http 가 아닌 ws 프로토콜을 이용하는데 왜 http로 뜰까? 라고 생각했다.
하지만 거듭 생각해보니 request는 http 로 시작하되, 은밀하게 upgrade요청을 보내야 ws로 upgrade 된다는 코딩애플 님의 말이 생각나서! 갑자기 깨달았다
아래 response 부분에 보면 Upgrade="websocket"으로 적혀있는 것을 볼 수 있다.
ref : https://supawer0728.github.io/2018/03/30/spring-websocket/
https://brunch.co.kr/@springboot/801
https://docs.spring.io/spring-framework/reference/web/websocket/server.html
https://docs.spring.io/spring-session/reference/guides/boot-websocket.html
https://brunch.co.kr/@springboot/695
'Web > TIL' 카테고리의 다른 글
캐시와 설계 시스템 전략 (0) | 2024.08.11 |
---|---|
Flyway 데이터베이스 마이그레이션 (0) | 2024.08.11 |
[AWS] Amazon EC2 인스턴스 패밀리와 인스턴스 유형 (0) | 2024.08.01 |
메시지 브로커 개념 (1) | 2024.07.23 |
HTTP와 WebSocket: 웹 페이지는 어떻게 실시간으로 변할 수 있을까? (0) | 2024.06.29 |