Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

선진이네

[Spring] WebSocket과 채팅(2) 본문

BackEnd/Spring

[Spring] WebSocket과 채팅(2)

악마선진 2022. 10. 8. 12:50

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