개발/스프링

Websocket-STOMP 및 DB 통합 테스트해보자

brobro332 2025. 4. 5. 15:04
반응형
웹소켓 연결 및 메시지를 전송해서 MongoDB에 데이터를 등록해보려고 한다.
클라이언트 앱이 아직 준비가 안 돼서 다른 방법으로 테스트해볼 것이다.

 

 

WebSocket Debug Tool

 

jiangxy.github.io

  • 포스트맨에서는 STOMP 서브 프로토콜을 지원하지 않는다.
  • 위의 페이지에 접속하여 테스트해보자. 

 

설정 파일

/**
 * 엔드포인트 설정
 * @param registry
 */
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws")
            .setAllowedOriginPatterns("*");
            .withSockJS();
}

 
컨트롤러

@MessageMapping("/chat.sendSystemMessage")
public void enterUser(Message message) {
    service.sendSystemMessage(message);
}
  • 클라이언트가 메시지 전송을 요청할 경우 /chat.sendSystemMessage를 목적지로 하면 된다.

 
서비스

public void sendSystemMessage(Message message) {
    MessageType type = message.getType();
    Long roomId = message.getRoomId();

    Message systemMessage = Message.builder()
        .type(type)
        .content(
            String.format(
                type.name().equals("ENTER") ? "[%s] %s 님이 입장했습니다." : "[%s] %s 님이 퇴장했습니다.",
                LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
                message.getSenderName()
            )
        )
        .senderId(message.getSenderId())
        .roomId(roomId)
        .sendAt(LocalDateTime.now())
        .build();

    repository.save(systemMessage);

    template.convertAndSend("/topic/room_" + roomId, systemMessage);
}
  • 클라이언트가 메시지를 요청할 경우 DB에 해당 메시지를 저장하고, 해당 사용자가 구독한 목적지에 메시지를 전송한다.
  • SimpleMessagingTemplate은 간단하게 목적지에 메시지를 전달할 수 있는 메서드를 제공한다.

 
테스트

  • 앞서 첨부한 링크에서는 CONNECT, SUBSCRIBE, SEND 등 요청 프레임을 작성할 필요 없이 간단하게 테스트할 수 있다.
  • 실제 목적지에 브로드캐스트 되는지는 클라이언트단을 구현해야 알 수 있기는 하지만 서버쪽 로깅을 확인하는 선에서 테스트를 마쳤다. 
2025-04-05T15:14:04.404+09:00 
DEBUG 23688 --- [nboundChannel-4] o.s.m.s.b.SimpleBrokerMessageHandler     
: Processing MESSAGE 
destination=/topic/room_2 
session=null 
payload={
    "senderId":1,
    "roomId":2,
    "content":"testz",
    "senderName":null,
    "type":"CHAT",
    "send...(truncated)"
}

 

  • 앞서 첨부한 코드나 이미지의 메서드와는 다른 메서드지만 테스트를 통해 서비스단 senderName 처리가 누락되어 있는 걸 알 수 있었다.
  • session도 null 값으로 로깅되고 있는데, 이건 SimpMessagingTemplate를 사용할 경우 세션 정보를 포함하지 않고 메시지를 브로커로 보내기 때문이다.
  • 한 가지 주의할 점은 SockJS를 사용할 경우 프로토콜에 ws가 아닌 http를 기재해야 한다.

 

SockJs를 사용할 경우 왜 http 프로토콜을 사용할까?

  • 브라우저에서 SockJS 클라이언트를 사용하면, 초기 연결 요청은 처럼 HTTP로 시작함
  • 서버와 핸드셰이크 후 WebSocket이 가능하면 ws://로 업그레이드
  • 안 되면 계속 HTTP 기반 방식으로 유지함

 

  • DB에도 저장이 잘 되었다.

 

마치며

  • 포스트맨에서는 STOMP 요청이 사실상 불가하다.
  • STOMP 같은 서브 프로토콜 요청이 불가능하고 챗지피티 말로는 SockJS도 지원하지 않는다고 한다.

 

참고 사이트

 

Stomp 테스트툴로 테스트해보자

채팅을 만들면서 가장 불편했던 건 클라이언트가 없어서 실시간으로 잘 작동하는지 확인하기가 어렵다는것이다.채팅 개발 강의를 보면서 얻은 클라이언트 코드가 있긴 하지만이걸 내쪽에 맞춰

velog.io

 

이미지 출처

 

How to Test WebSocket Applications Using a Mobile Phone

The Hypertext Transfer Protocol (HTTP) is an application-layer protocol for communication between web browsers and servers. On the…

medium.com