🙋‍♀️ Server

[Server] STOMP + WebSocket 테스트 문제 해결기 : Postman 활용

수댕ʕت̫͡ʔ 2025. 2. 26. 14:40

spring + stomp + websocket 으로 구현한 채팅 기능을 테스트하기 위해 꼬박 하루를 삽질했다.😂

그 이유는 Postman으로 테스트하기 위함인데, 프론트 코드 없이 테스트를 해야했기 때문에 문제가 발생했다.

 

이미 많은 블로그에서 다양한 방법으로 WebSocket을 테스트하는 글을 찾아볼 수 있었지만, 대부분 테스트용 프론트 페이지가 폐쇄된 경우가 많았다.

 

WebSocket을 Postman으로 테스트하는 방법은 몇몇 블로그에서 확인할 수 있었다. 하지만 나는 stomp + websocket을 사용했기 때문에 참고할 자료가 거의 없었다. 심지어 Postman으로 테스트하는게 어렵다는 이야기 뿐...

 

그래서 내가 시도해봤다! 모두들 내 글을 보고 함부로 잘못 없는 코드를 의심하거나...chatgpt에게 50번씩 물어보는 상황을 겪지 않기를 바란다ㅎㅎ

 

1️⃣ WebSocket 연결 준비

먼저 당연히 서버를 실행하고, postman에 접속해서 아래와 같이 WebSocket을 선택한다.

stomp를 연결하기 위해서는 먼저 WebSocket에 연결 성공해야하기 때문이다.

 

2️⃣ WebSocket 연결 시도

자 이제 Websocket 연결을 해보자. url을 넣어주고 connect를 시도한다. 참고로 나는 websocket을 연결할때 access token을 함께 요구 하도록 구현했다. 그렇기 때문에 파라미터에 access token을 넣어줘야했다.

ws://localhost:8080/api/ws-chat/websocket

 

그러면 연결이 성공된 것을 확인할 수 있다. 이때까지는 아주 잘 되어가고 있어서 행복했다..ㅎ 

 

3️⃣ STOMP 연결 및 테스트 시도

그리고 대망의 stomp을 연결해준다.

stomp를 이용한 채팅 과정은 다음과 같은 순이다.

connect -> subscribe -> send 

 

근데 나는 여기서 채팅에 입장한 사람을 알려주고 싶기 때문에 다음 순으로 테스트했다.

connect -> subscribe -> send(입장) -> send(메세지 송수신)

 

당연히 코드도 그렇게 작성해주어야 한다.

🚨 문제 발생: STOMP CONNECT 응답이 없다..?

자 여기서부터 문제가 발생했다.

connect를 시도하기 위해 아래와 같이 connect message를 보냈지만 아무런 응답이 오지 않았다...

보내기만 할 뿐 이 친구는 응답을 보내주지 않았고, 어떤 문제인지 알지 못해 답답했다ㅜㅜ

 

그래서 폭풍 검색을 시도한 끝에 어떤 포스팅을 발견했고, 여기서 문제의 원인을 알 수 있었다. 바로 공식문서를 확인해야한다는 것!!!

 

자 공식문서를 해석해보자.

 

stomp는 프레임을 주고받으며 통신한다. 

여기서 프레임 구조는 

COMMAND
header1:value1
header2:value2

Body^@

 

 형식은 이렇다고 한다.

  • COMMAND: 명령어 (대문자로 작성해야 함)
  • Headers: key:value 형식으로 작성
  • Body: 실제 메시지 내용
  • NULL 옥텟 (^@): 반드시 메시지 끝에 추가해야 함

반드시.. 본문이 끝난 후에는 NULL 옥텟을 추가해주어야 한다.

 

이것이 문제였다. 반드시 NULL을 추가해주어야한다는 것! 나는 아무생각없이 text로 NULL을 추가해서 보내주었지만 window 같은 경우는 NULL 옥텟을 직접 입력하기 어렵기 때문이다.

 

그래서 Binary/Base64 인코딩을 사용해 NULL을 추가해줘야 한다.

 

나는 인코딩을 위해 NotePad++를 사용했다. NotePad++을 설치해주고 메세지를 입력해준다.

그리고 플러그인을 클릭해 Base64 Encode with padding을 클릭한다.

 

🔍 여기서 Base64 Encode with padding을 선택해야하는 이유는 뭘까?

Base64는 데이터를 6비트 단위로 쪼개서 글자로 바꾼다.

보통 검퓨터 데이터는 0, 1의 이진수 즉, 8비트로 되어있는데, Base64는 6비트 단위로 쪼개서 글자로 바꾼다.

그렇기 때문에 빈 공간이 발생할 수 밖에 없고 이 공간을 채워주기 위해서 padding을 넣어줘야한다!

 

stomp 프레임이 정확한 메시지를 전달하기 위해서는 패딩을 설정해줘서 데이터의 손상을 막아주는 것이다. 

자 이제 이걸 복사해서 사용해주면 끝이다.

👩‍💻 해결

이제 이렇게 connect 메시지를 보내주니 잘 received 메세지가 오는것을 확인할 수 있다!!

 

이 문제를 해결하면서 공식문서를 잘 확인해야한다는 것을 느꼈다.