본문 바로가기

검색용 개발 블로그

웹소켓

 

 

 

 

 

 

웹소켓을 지원하지 않는 브라우저가 있다.

 

그럴때 사용하는 것이

soket.io다

 

스프링에서 웹소켓 설정하는 방법

1. 설정파일 (WebSocketConfig.java)

 

1) @Configuration 클래스를 생성

2) WebSocketConfigurer 을 상속 받는다.

3) @EnableWebSocket

4) registerWebSocketHandlers 함수 오버라이드 (소켓등록)

 

 

설정파일 (WebSocketConfig.java)

클라이언트가 보내는 통신을 처리할 핸들러가 필요하다. ==> new SocketTextHandler()

그래서 필요에 따라 구현한 핸들러를 --> 웹소켓이 연결될 때

핸드쉐이크를 할 주소 + 인자를 넣어주면 된다.

여기서는 /user 가 주소이다

 

 

 

2. SocketTextHandler.java

클라이언트가 보내는 통신을 처리할 핸들러

위의 코드는 예시로 작성한 간단한 웹소켓 핸들러다.

웹소켓은 기본적으로 text, binary type을 지원한다.

필요에 따라 TextWebSocketHandler, BinaryWebSockeyHandler를 상속하고 구현해줘야 한다.

 

 

 

메소드 인자로 받아오는 WebSocketSession( 전달 변수)

http 세션과 웹소켓 세션은 다르다.

웹소켓 연결될 때 생기는 연결정보를 담고 있는 객체다.

 

핸들러에서 웹소켓 통신에 대한 처리를 하기 위해, 이 세션들을 컬렉션으로 담아 관리하는 경우가 많다.

코드를 보면

커넥션이 맺어질 때, 컬렉션에 웹소켓 세션을 추가하고, add

커넥션이 끊어지면, 웹소켓 세션을 제거하고 있다. remove

 

이렇게 연결된 세션들은 관리하면서

연결된 모든 클라이언트에게 메세지를 보내는 처리를 할 수 있다.

 

3. CORS 설정

스프링에서 웹소켓을 사용할 때 same-origin만 허용하는 것이 기본 정책이다

 

 

4. SockJS 설정

sock.js 라이브러리 사용하게 해줌

 

 

 

5. STOMP

WebSocket 의존성,  Spring Messaging
  STOMP 프로토콜
simple
text
Oriented
message
protocol

  메세지 브로커를 이용해서

펍-섭 방식으로

클라이언트<---> 서버
쉽게 메시지를 주고 받는 프로토콜

 

 

pub-sub

메시징 패러다임

발신자가 어떤 범주로 메시지를 발행하면

이 범주를 구독하고 있는 수신자는 메시지를 받아 볼 수 있는 방식.

 

 

메시지 브로커

발신자가 보낸 메시지를 받아서

수신자들에게 전달해주는 것

 

 

spring이 웹소켓 위에

STOMP를 얹어서 사용한다

 

 

웹소켓만 쓰면되지, 왜 굳이 STOMP라는 서브 프로토콜을 사용할까?

 

어떻게 메세지를 받은건지 정해진 것이 없다.

 

 

클라이언트 <---> 서버

어떤 형식으로 메시지를 주고받을 건지

메시지 타입은 어떻게 명시?

메시지 본문, 설정 정보 같은 데이터는 어떻게 구분할 것인지?

정의 된 것을 파싱하는 로직들도 따로 구현해야한다.

 

==> STOMP를 사용하면 형식을 고민할 필요도, 파싱을 위한 코드 구현도 필요 없다

 

 

왼쪽은 웹소켓,.. 날것의 데이터

오른쪽은 STOMP 형식이 있다.

 

 

발신자: 메시지를 보내고 싶어함

수신자: 메시지를 받고 싶어함.. /topic으로 받음

 

서버가 일을 모두 마쳤으면, 가공되거나 처리된 메시지를 

/topic 이라는 경로를 담아 다시 전송하게 되면

이 메시지가 ---> 메시지 브로커에게 전달한다

 

처리가 필요 없다면

발신자 --> 메시지 브로커 --> 구독자 도 가능.

 

 

6. 메시지 브로커

 

Config 파일이 달라짐

 

 

6-1. configureMessageBroker

1) 메시지 브로커 설정

enableSimpleBroker 메서드 

스프링에서 제공하는 내장 브로커를 사용하겠다.라는 설정

파라미터: 해당 값이 prefix 붙은 메시지가 송신되었을때

그 메시지를 메시지 브로커가 처리하겠다.

 

/queue.   일대일로 갈때

/topic.    일대다로 브로드캐스팅 될 때

 

으로 경로가 오면

심플 브로커가 메시지를 받고 --> 구독자에게 전달해주겠다.

 

setApplicationDestinationPrefixes 메서드

바로 브로커로 가는 경우가 아니라

 

메시지에 어떤 처리나 가공이 필요한경우 핸들러를 타게 한다.

바로 핸들러로 메시지가 라우팅 되도럭 설정한다.

 

 

 

7. 메시지 핸들러

STOMP를 사용하게 되면

상속을 받거나, 할 필요 없이

컨트롤러로 사용함

처리를 마치고 반환된 그리팅 객체를

/topic/greeting경로로 다시 보냄 ---> 심플 브로커로 전달

 

 

추가 핸들러 메소드와 비슷하다

 

인자로 들어가는 경로는 

처음 웹소켓 핸드쉐이크를 위한 주소

cors 설정, sockJs 설정을 해줄 수 있음

 

 



스프링이 기본적으로 제공하는 내장 메시지 브로커 사용했지만

외부 메시지 큐도 연동해서 쓸 수 있다.