본문 바로가기
스프링

spring websocket + stomp

by y00ns00 2020. 6. 3.

/app은 메세지를 처리할 수 있도록 서버측의 annotated method 로 흐르도록 하기 위한 라우팅

/topic , /queue 는 broker로 흐르도록하기 위한 라우팅

 

 STOMP는 여러 prefix를 통해 흐름을 결정하는데 자주쓰인prefix는 아래와 같다

1.  클라이언트에서 destination에 /app 이라는 prefix를 주었을때 흐름

 

해당 request는 @messagemapping된 스프링 컨트롤러로 흘러가고 컨트롤러에서 메세지를 수신한 후 여러 작업들을 처리한 후에 /topic이라는 prefix를 통해 브로커에게 전달하면 브로커는  STOMP MESSAGE 메소드를 이용해서 특정 토픽을 구독하는 구독자들에게 reponse를 보낸다.

 

2.  클라이언트에서 destination에 /topic이라는 prefix를 주었을때 흐름

 

매핑된 스프링 컨트롤러를 안거치고 브로커에게 직접 접근하겠다는 뜻인데 주로 클라이언트가 subscribe를 할때 이 prefix를 사용하는 것으로 보인다. 계속 설명하지만  /topic 이라는 prefix를 쓰면 브로커에게 직접 전달되는데 이 경우 브로커가 직접 받아서 subscriber들 관리를 하는 것 같다.

 

 

 

구현

 

1.connection

 

gs-guidewebcoket로 끝나는 주소 컨트롤러에 /gs-guidewebcoket 매핑하여 sockjs를 이용해 소켓을 생성

또한 /topic/a 주소를 구독 topic은 브로커에게 흐름을 넘기는 prefix일 뿐이고 뒤에 a를 구독하는 상태이다. 

 

 

configuration.xml

 

eendpointd에  /gs-guidewebcoket 주소가 들엉면 sockjs가 생성되도록 매핑

 

 

 

send

클라이언트에서 서버로 STOMP SEND메소드를 구현한 코드

 

첫번째 인자는 spring controller mapping ("/app"은 spring controller로 보낸다는 stomp 규칙 즉"/app" 뒤가 진짜 mapping 주소)

두번째 인자는 서버로 보낼 때 추가하고 싶은 stomp 헤더이다

세번째 인자는 서버로 보낼 때 추가하고 싶은 stomp 바디이다. 

서버 컨트롤러에서는 mapping된 함수의 String 인자로 json stringify된 문자열을 받을 수있다.

 

 

 

서버에서는 어떻게 받고 클라이언트에게 메세지를 보내줄까

 

클라이언트의 send 메소드의 첫번째 인자에서 매핑한대로 컨트롤러가 매핑되어 있는 것을 볼수 있다.

 /app은 빠져있는데 이것은 configuration.xml 코드에서 /app이 spring 으로 흘러가도록 설정해 두었기 때문에

생략할 수 있다.

 

STOMP는 topic, subscribe 관계가 핵심

즉 이 컨트롤러는 "/topic" prefix를 이용해서 명시적으로 브로커에게 알려주었고

그 뒤에 a라는 topic을 전달해주었다.  그러면 브로커는 a 토픽을 구독하고 있는 모든 클라이언트들에게 메세지를 전달하게 된다. 다시 말해 컨트롤러가 STOMP destination을 리턴했고 브로커는 이 destination을 구독하고 있는 구독자들에게 메세지를 전달하게 된다.

 

 

 

 

참조 : https://nobase2dev.tistory.com/25

 

'스프링' 카테고리의 다른 글

@ResponseBody  (0) 2020.06.04
AOP 관점 지향 프로그래밍  (0) 2020.05.20
자바 jdbc 스프링 DB 접근  (0) 2020.05.19
annotation  (0) 2020.05.18
maven  (0) 2020.05.18

댓글