[Spring] WebSocket 특정 유저로 메세지 보내기

서버

웹소켓을 사용하여 서버에서 특정 유저로 메세지를 전달하는 방법은 두 가지인데 하나는 브로커를 통한 메세지 전달, 다른 하나는 직접 전달이다.

브로커를 통한 전달은 @SendToUser을 사용하여 쉽게 전달할 수 있으나 직접 전달 시에는 SimpMessagingTemplate으로 전달할 수 있다. 방법은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RequiredArgsConstructor
@RestController
public class StompController {
private final SimpMessagingTemplate messagingTemplate;

@GetMapping(“/direct”)
public void directSendMessage(@RequestParam String user) {
messagingTemplate.convertAndSendToUser(user, “/queue/message”, new DirectMessage(“test”), createHeaders(null));
}

private MessageHeaders createHeaders(@Nullable String sessionId) {
SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
if (sessionId != null) headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
return headerAccessor.getMessageHeaders();
}
}
  • messagingTemplate.convertAndSendToUser는 @SendToUser와 다르게 헤더정보가 없으므로 직접 입력해주어야 한다.
  • createHeaders함수는 필요한 헤더를 설정해주며 만약 세션아이디로 특정 유저에게 메세지를 전달 할 때 세션아이디로 전송할 수 있도록 헤더에 설정해준다.
    1
    2
    // sessionId로 전달 시
    messagingTemplate.convertAndSendToUser(sessionId, “/queue/message”, new DirectMessage(“test”), createHeaders(sessionId));
  • createHeaders함수는 SendToMethodReturnValueHandler.java를 참고하였고 해당 클래스에는 더 자세하고 많은 기능들을 알 수 있다.

클라이언트

클라이언트가 브로커를 통해서가 아닌 직접 메세지를 받기 위해서는 구독 시 주소 앞에 /user이 붙어야 한다.

1
2
3
4
// 브로커를 통한 메세지 수신 @SendToUser
session.subscribe(“/queue/message”, brokerMessageHandler);
// 직접 메세지 수신 convertAndSendToUser
session.subscribe(“/user/queue/message”, directMessageHandler);

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×