반응형
웹소켓 연결 및 메시지를 전송해서 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
'개발 > 스프링' 카테고리의 다른 글
Redis 도입을 통한 데이터 캐싱 처리 (5) | 2025.04.06 |
---|---|
[Trouble-shooting] 클라이언트에서 Websocket-STOMP 연결 요청 시 FALLBACK이 사용되는 현상 (2) | 2025.03.28 |
[Trouble-shooting] 중첩 클래스명 중복으로 Swagger가 고장났다 (2) | 2025.03.21 |
Faker가 만들어 주는 테스트 데이터, 또 나만 몰랐지 (3) | 2025.03.19 |
[Trouble-shooting] MyBatis는 카멜케이스 설정을 직접 해야 한다 (2) | 2025.03.18 |