본문 바로가기
개발

Postman으로 STOMP 테스트 하기

by Mong-_- 2024. 4. 12.

개요

Spring boot에서 STOMP를 사용하여 웹 소켓 통신을 구현하였습니다. 소켓 테스트를 위해 Postman을 사용하려 했지만 Postman은 아직 STOMP를 지원하지 않아서 테스트가 어려웠습니다. 그래서 대부분의 사람들은 STOMP를 편리하게 테스트할 수 있는 apic tester를 이용하고 있었습니다. 하지만 Postman으로 API를 테스트하고 있었기 때문에, STOMP 역시 apic로 테스트하지 않고 Postman으로 테스트를 하고 싶었습니다. 이 과정에서 충분한 자료가 없어 어려웠지만 저처럼 Postman으로 테스트하고 싶은 분들이 계신다면 조금이나마 도움이 됐으면 하는 맘에 글을 쓰게 되었습니다!

 

 

Postman으로 테스트 전에 간단하게 Spring boot에서 STOMP를 어떻게 설정했는지 알아보고 갑시다.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.setErrorHandler(stompExceptionHandler)
                .addEndpoint("/socket-endpoint")
                .addInterceptors()
                .setAllowedOriginPatterns("*");
    }
}

addEndpoint 메서드는 HandShake 커넥션을 생성할 때 사용하는 url 입니다. (Client에서 해당 경로로 websocket 연결)

 

시도한 방법

개발자 도구를 통해 apic tester는 어떠한 방식으로 STOMP와 통신을 하는지 알아봅시다.

Connect를 하기 전, Connection type을 설정한 후 Connect를 눌러 연결을 시도합니다. 만약, STOMP에서 연결 설정을 따로 하지 않으셨다면 아무것도 보내지 않으시면 됩니다! (저는 Connect 할 때, Jwt 토큰 인증을 진행하기 때문에 Headers에 token을 넣었습니다. STOMP + Jwt 인증 방식이 궁금하시면 댓글 달아주세요.)

 

이제 Connect를 누른 후 개발자 도구를 이용하여 apic tester가 어떠한 형식으로 STOMP와 연결을 하는지 알아봅시다.

socket-endpoint로 통신한 Message중 COMMAND가 CONNECT인 것을 확인해보면, 공식 STOMP 스펙에 나온 형식과 같은 걸 알 수 있습니다. (COMMAND가 CONNECT인 것은 CONNECT를 하기 위해 apic tester가 해당 프레임을 보냈다는 것을 알 수 있습니다.)

이로써 STOMP Frames 형식대로 보내준다면 Postman으로도 테스트할 수 있다는 것을 알 수 있습니다.

 

한 번 Postman으로 테스트를 진행해봅시다.

테스트를 위해 endpoint에 Connect를 한 후

STOMP Frames 형식을 맞춰 Send를 눌러줬지만, 서버에서 아무런 응답이 오지 않습니다. 

(아래 Connected는 endpoint에 연결이 되었다는 표시로, STOMP 연결이 됐다는 것을 의미하는 것이 아닙니다.)

해답은 공식 스펙을 살펴보면 알 수 있습니다.

읽어보면, blank line은 헤더의 끝과 본문의 시작을 나타내고, 본문 뒤에는 NULL 옥텟이 온다고 합니다.

 

Window에서 NULL 옥텟을 사용할 수 있는 방법은 binary/Base64 인코딩을 사용하는 것입니다. 따라서 Nodepad ++를 이용하여 NULL을 base64로 인코딩을 합니다.

프레임 끝(헤드 및 본문 뒤)에 NULL을 추가합니다.

프레임을 전체 선택한 후 Base64로 인코딩합니다.

 

인코딩 한 프레임을 Postman Message에 넣고 다시 연결을 시도해 봅시다. (아래 Text -> Binary 변경)

 

이렇게 보내면!

에러가 나옵니다.

 

이유는 Base64 Encoding은 Binary Data를 Text로 변경하는 Encoding입니다. 이때, Binary Data를 6 bit 씩 자른 뒤 6 bit에 해당하는 문자를 색인표에 따라 치환합니다.

 

한 가지 문제점이 있는데 모든 문자열이 3개씩 남김없이 끊어지지 않는다는 점입니다. 그래서 padding을 하는데, 3개씩 끊고 빈자리가 생긴다면 패딩문자인 '='이 그 빈자리만큼 들어가게 되는 것입니다.

 

따라서 자릿수에 맞춰 패딩을 넣은 후 다시 Postman에서 send를 보내봅시다.

드디어 서버로부터 CONNECTED 응답이 왔습니다. 이로써 Postman으로 STOMP 테스트가 완료되었습니다. CONNECT 말고 다른 테스트는 공식 문서를 토대로 프레임만 변경하여 사용하시면 될 거 같습니다!

 

후기

Postman은 STOMP를 지원하지 않기 때문에 Postman으로 테스트를 하기 위해선 복잡한 과정을 거쳐야 하지만, Postman Enviroments 설정을 통해 OPTION마다 프리셋을 만들어 사용한다면 충분히 Postman으로도 사용할 수 있다고 생각합니다!

 

STOMP 설정 시 withSockJS() 메서드를 사용하면 Postman, apic tester 다 연결이 되지 않아 사용하지 않았습니다.