선진이네
[Spring] WebSocket과 채팅(2) 본문
WebSocket을 구현해도 지원하지 않는 브라우저들이 존재한다.
문제점을 정리해보자면,
1. 모든 클라이언트의 브라우저에서 WebSocket을 지원한다는 보장이 없다.
2. Server/Client 중간에 위치한 Proxy가 Upgrade 헤더를 해석하지 못해 서버에 전달하지 못할 수 있다.
3. Server/Client 중간에 위치한 Proxy가 유휴 상태에서 도중에 Connection을 종료시킬 수도 있다.
이러한 문제를 해결하기 위해 우리는 WebSocket Emulation을 이용하려한다.
WebSocket Emulation이란, 우선 WebSocket을 시도하고, 실패할 경우 HTTP Streaming, Long-Polling과 같은 HTTP 기반의 다른 기술로 전환해 다시 연결을 시도하는 것을 의미한다.
필자는 Spring으로 개발 중에 있으니 SockJS를 이용하려한다.
Spring 프레임워크는 Servlet 스택 위에서 Server/Client 용도의 SockJS 프로토콜을 모두 지원한다.
SockJS는 어플리케이션이 WebSocket API를 사용하도록 허용하지만 브라우저에서 WebSocket을 지원하지 않는 경우에 대한 대안으로 어플리케이션의 코드를 변경할 필요 없이 런타임에 필요할 때 대체하는 것이다.
@Configuration
@RequiredArgsConstructor
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final ChatHandler chatHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler, "/ws/chat")
.setAllowedOriginPatterns("http://*:8080", "http://*.*.*.*:8080")
.withSockJS()
.setClientLibraryUrl("http://localhost:8080/myapp/js/sock-client.js");
//.setClientLibarayUrl은 그냥 sockjs CDN 주소를 입력해도 무관하다.
//https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.2/sockjs.js
/*
Spring Boot에서 CORS 설정 시, .allowCredentials(true)와
.allowedOrigins("*")는 동시 설정을 못하도록 업데이트 되었다고 한다.
모든 주소를 허용하는 대신 특정 패턴만 허용하는 것으로 적용해야한다고 변동됨.
.allowedOrigins("*") 대신 .allowedOriginPatterns("*")를 사용하면 에러는 해결이
된다고 한다.
나는 이처럼 하지 않고, http://localhost:8080 또는, IP 주소로 접속하기 때문에
위에 설정처럼 하였다.
*/
}
}
var sockJs = new SockJS("/ws/chat");
'BackEnd > Spring' 카테고리의 다른 글
[Spring] FetchType.EAGER VS FetchType.LAZY (0) | 2022.10.12 |
---|---|
[Spring] WebSocket과 채팅(3) (0) | 2022.10.09 |
[Spring] WebSocket과 채팅(1) (0) | 2022.10.07 |
[Spring] Cascade Types (0) | 2022.09.15 |
[Spring] 무한 순환 참조 문제 (0) | 2022.09.14 |