스프링 웹소켓 예제

이 문서에서는, 우리는 봄 WebSocket와 사용자 또는 세션 ID에 직접 메시지를 보낼 수 있는 방법을 모색 했습니다 나머지 org.webjars 종속성은 jQuery, 부트스트랩 및 웹 소켓 및 STOMP 메시징에 필요한 STOMP 메시징에 대 한 클라이언트 쪽 라이브러리/ 자바 스크립트 채팅 클라이언트. 이러한 자바스크립트 종속성은 Java WebSocket 서버 구현에서 사용되지 않습니다. 백 엔드 응용 프로그램과 완전히 분리된 프런트 엔드 클라이언트에 필요합니다. HTML/Javascript 클라이언트가 스프링 응용 프로그램과 별도로 사용되거나 패키지되지 않은 경우 이러한 종속성을 POM에서 안전하게 제거할 수 있습니다. WebSocket 프로토콜은 응용 프로그램이 실시간 메시지를 처리하도록 하는 방법 중 하나입니다. 가장 일반적인 대안은 긴 폴링 및 서버 전송 이벤트입니다. 이러한 각 솔루션에는 장점과 단점이 있습니다. 이 문서에서는 스프링 부팅 프레임 워크를 사용하여 WebSockets를 구현하는 방법을 설명합니다. 서버 측과 클라이언트 측 설정을 모두 다루며 WebSocket 프로토콜을 통해 STOMP를 사용하여 서로 통신합니다. 서버 쪽은 Java에서만 코딩됩니다. 그러나 클라이언트의 경우 일반적으로 WebSockets 클라이언트가 프런트 엔드 응용 프로그램에 포함되기 때문에 Java 및 JavaScript (SockJS)로 작성된 스니펫을 표시합니다. 코드 예제에서는 pub-sub 모델을 사용하여 여러 사용자에게 메시지를 브로드캐스트하는 방법과 단일 사용자에게만 메시지를 보내는 방법을 보여 줍니다. 이 문서의 다른 부분에서는 WebSocket 보안에 대해 간략하게 설명하고 환경이 WebSocket 프로토콜을 지원하지 않는 경우에도 WebSocket 기반 솔루션이 계속 작동하도록 하는 방법에 대해 간략하게 설명합니다.

웹 응용 프로그램에는 이미 HTTP 요청을 보호하기 위한 인증 및 권한 부여가 있습니다. 일반적으로 사용자는 로그인 페이지, HTTP 기본 인증 또는 기타와 같은 일부 메커니즘을 사용하여 Spring 보안을 통해 인증됩니다. 인증된 사용자의 보안 컨텍스트는 HTTP 세션에 저장되며 동일한 쿠키 기반 세션의 후속 요청과 연결됩니다. 결과적으로 네트워크 IO 오류는 클라이언트가 연결이 끊어졌기 때문에 발생할 수 있으며, 이로 인해 로그를 불필요한 스택 추적으로 채울 수 있습니다. Spring은 클라이언트 연결 끊김(각 서버에 만 해당)을 나타내는 네트워크 오류를 식별하고 AbstractSockJSSession에 정의된 전용 로그 범주 DISCONNECTED_CLIENT_LOG_CATEGORY를 사용하여 최소한의 메시지를 기록하기 위해 최선의 노력을 기울입니다. 스택 추적을 확인해야 하는 경우 해당 로그 범주를 TRACE로 설정합니다. 먼저 기본 빌드 스크립트를 설정합니다. Spring으로 앱을 빌드할 때 원하는 빌드 시스템을 사용할 수 있지만 Gradle 및 Maven에서 작업하는 데 필요한 코드가 여기에 포함되어 있습니다.

어느 쪽이 익숙하지 않은 경우, Gradle와 자바 프로젝트 구축 또는 메이븐과 자바 프로젝트 구축을 참조하십시오. 요즘 웹 응용 프로그램은 종종 REST API를 백 엔드 및 OAuth/JWT 토큰으로 사용하여 사용자 인증 및 권한 부여를 사용합니다. WebSocket 프로토콜은 HTTP 핸드셰이크 중에 서버가 클라이언트를 인증하는 방법을 설명하지 않습니다. 실제로 표준 HTTP 헤더(예: 권한 부여)는 이 용도로 사용됩니다. 안타깝게도 모든 STOMP 클라이언트에서 지원되지는 않습니다. Spring Java의 STOMP 클라이언트를 사용하면 핸드셰이크에 대한 헤더를 설정할 수 있습니다: 각 WebSocket 세션에는 특성 맵이 있습니다. 맵은 인바운드 클라이언트 메시지에 헤더로 연결되며 컨트롤러 메서드에서 액세스할 수 있습니다. 스프링 프레임워크 4.0에 도입된 새로운 WebSocket 기능. 소개에서 설명한 것처럼 WebSocket API의 직접 사용은 응용 프로그램에 대한 수준이 너무 낮으며 메시지 형식에 대한 가정이 있을 때까지 는 메시지를 해석하거나 주석을 통해 메시지를 라우팅할 수 있는 프레임워크가 거의 없습니다.