[Spring Boot] 서버 시작 시 WebSocket 연결 client java 로직 구현 에서 Spring boot에서 Websocket을 연결했습니다.
그리고 [Postman] Websocket 테스트 방법 및 Protocol 설정 방법 에서 Websocket 연결 시 Protocol을 설정하는 방법에 대해서 알아보았습니다.
이번에는 Spring boot에서 Websocket 연결 시 Protocol을 설정하는 방법에 대해서 알아보겠습니다.
기존 Websocket 연결 코드는 아래와 같이 되있습니다.
StandardWebSocketClient 클래스의 execute 함수를 사용해서 Websocket을 연결하고 있는데 StandardWebSocketClient 클래스는 AbstractWebSocketClient 추상클래스를 상속받고 AbstractWebSocketClient 추상클래스에 execute 함수가 정의되어 있습니다.
StandardWebSocketClient client = new StandardWebSocketClient();
WebSocketSession session = client.execute(new TextWebSocketHandler() {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
System.out.println("Received message: " + message.getPayload());
}
}, "ws://localhost:8080/ws").get();
session.sendMessage(new TextMessage("Hello from client!"));
AbstractWebSocketClient 클래스에 execute 함수는 아래와 같이 2가지 종류가 있습니다.
Protocol을 사용하기 위해서는 headers를 이용해야 하기 때문에 인자로 WebSocketHttpHeaders 를 받는 함수를 사용해야 합니다.
public CompletableFuture<WebSocketSession> execute(WebSocketHandler webSocketHandler, String uriTemplate, Object... uriVars) {
Assert.notNull(uriTemplate, "'uriTemplate' must not be null");
URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri();
return this.execute(webSocketHandler, (WebSocketHttpHeaders)null, (URI)uri);
}
public final CompletableFuture<WebSocketSession> execute(WebSocketHandler webSocketHandler, @Nullable WebSocketHttpHeaders headers, URI uri) {
Assert.notNull(webSocketHandler, "WebSocketHandler must not be null");
this.assertUri(uri);
if (this.logger.isDebugEnabled()) {
this.logger.debug("Connecting to " + uri);
}
HttpHeaders headersToUse = new HttpHeaders();
if (headers != null) {
headers.forEach((header, values) -> {
if (values != null && !specialHeaders.contains(header.toLowerCase())) {
headersToUse.put(header, values);
}
});
}
List<String> subProtocols = headers != null ? headers.getSecWebSocketProtocol() : Collections.emptyList();
List<WebSocketExtension> extensions = headers != null ? headers.getSecWebSocketExtensions() : Collections.emptyList();
return this.executeInternal(webSocketHandler, headersToUse, uri, subProtocols, extensions, Collections.emptyMap());
}
아래와 같이 WebSocketHttpHeaders 클래스를 생성하고 header에 Sec-WebSocket-Protocol를 설정해주고 URI 문자열 값을 통해 URI.create 함수를 사용해서 URI 클래스를 만들어서 호출하게 수정해주면 Protocol을 사용할 수 있습니다.
WebSocketHttpHeaders webSocketHeaders = new WebSocketHttpHeaders();
webSocketHeaders.add("Sec-WebSocket-Protocol", "test-protocol");
StandardWebSocketClient client = new StandardWebSocketClient();
WebSocketSession session = client.execute(new TextWebSocketHandler() {
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
System.out.println("Received message: " + message.getPayload());
}
}, webSocketHeaders, URI.create("ws://localhost:8080/ws")).get();
session.sendMessage(new TextMessage("Hello from client!"));
'개발 > spring, spring boot' 카테고리의 다른 글
[JPA] MariaDB에서 PK를 날짜+sequence의 nextval의 조합으로 insert하는 방법 (0) | 2024.06.13 |
---|---|
[WebSocket] [STOMP] client 테스트 방법 (0) | 2024.06.11 |
[Spring Data JPA] Entity가 복합키를 사용할때 JpaRepository 개발 방법 (0) | 2024.02.16 |
[Spring Data JPA] Cannot do an operation on a closed statement 오류 해결 (0) | 2024.02.16 |
Spring Boot에서 JPA 사용하기 (0) | 2024.02.15 |