본문 바로가기
Back-end/Spring boot

코인 모의투자 프로젝트(3) - 유저와 웹소켓 연결

by 악어코딩 2024. 4. 18.

Upbit로부터 데이터를 받아왔으니, 유저에게 그 데이터를 그대로 던져줘야 한다.

유저가 WebSocket으로 특정 주소로 요청을 보내면 그 유저의 세션을 관리해서 데이터를 전송하는 방법이 있다.

하지만 유저의 세션을 관리하는게 영 귀찮은게 아니라서 나는 Stomp의 Pub/Sub 통신을 사용해서 구현할 계획이다.

Pub/Sub 통신이란 발행자와 구독자가 있는 것으로, Stomp의 이 기능을 사용하면, 발행과 구독만 관리하면 편하게 구현할 수 있다!

 

일단 Configuration 코드부터 보자.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/sub");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/coin")
                .setAllowedOrigins("*");
    }
}

 

registerStompEndpoints 메서드에서 registry에 /coin 엔드포인트를 등록한다.

(configureMessageBroker 메서드는 /sub로 구독이 가능하게 설정한 부분이다.)

@Override
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
    String convertedMessage = new String(message.getPayload().array(), StandardCharsets.UTF_8);
    publish(convertedMessage);
}

/**
 * 받은 메시지를 토픽에 발행하는 비동기 메서드입니다.
 *
 * @param convertedMessage 처리된 메시지
 */
@Async
protected void publish(String convertedMessage) {
    simpMessageSendingOperations.convertAndSend("/sub/trade", convertedMessage);
}

 

WebSocketHandler에서 simpMessageSendingOperations를 통해 /sub/trade로 publish를 해주면 이렇게 된다.

apic 이라는 사이트이다. 여기서 테스트를 해볼 수 있다.

연결은 /coin으로, Subscription URL에는 /sub/trade를 입력해주면 trade 정보를 받을 수 있다.

 

주의할 점은, 이미 프로젝트에서 Spring Security를 사용중이라면, /coin 을 허용시켜야 데이터를 받을 수 있다는 점이다.

(이것때문에 한참을 헤맸다...ㅜㅠ)

이 프로젝트에서는 누구나 로그인 없이 이 데이터들을 받을 수 있어서 그냥 허용시켜 버렸다.