[table-now] 1:1(예약자:가게) 채팅 기능 고도화를 위해 RabbitMQ Relay를 적용한 이유
·
Dev Projects
🔍 개요TableNow의 1:1 채팅 기능은 예약자와 가게 사장이 실시간으로 원활하게 소통할 수 있도록 제공된 기능이다. 초기에는 Spring의 SimpleBroker를 사용해 간단하게 구현되었지만, 멀티 인스턴스 환경에서 채팅 메시지가 공유되지 않는 문제점이 있었다.이에 따라 RabbitMQ를 도입하고, STOMP Relay 구조로 전환함으로써 실시간성과 확장성을 확보하고자 했다.이 글에서는 기존 구조의 한계와 개선 이유, 그리고 RabbitMQ Relay 구조를 선택하게 된 배경과 테스트 결과를 정리한다. ⚠️ 기본 채팅 구조의 한계 - SimpleBroker의 구조적 문제점Spring의 기본 메시지 브로커인 `SimpleBroker`는 다음과 같은 한계를 가지고 있었다:단일 서버 메모리 기반메시지..
JWT 인증 기반 WebSocket 연결 실패, 원인과 해결법
·
TIL (Today I Learned)
❗ 문제점채팅 시스템에서 메시지를 전송하려 했으나 메시지 전송이 이뤄지지 않는 문제가 발생했습니다. 테스트용 chat.html 페이지에서는 JWT AccessToken을 입력받아 STOMP connect 헤더에만 포함시켰지만, 이 값은 WebSocket 핸드셰이크 단계에선 전달되지 않아 인증이 누락되었습니다. 클라이언트와 서버 양쪽에서 다음과 같은 에러가 확인됩니다. 클라이언트 서버2025-04-23T15:44:45.565+09:00 WARN 8236 --- [table-now] [nio-8080-exec-7] o.s.w.s.s.t.h.DefaultSockJsService : Origin check enabled but transport 'jsonp' does not support it.20..
[table-now] 예약자-사장님 1:1 실시간 채팅 기능 설계 및 구현
·
Dev Projects
🔍 구현 목적`table-now`는 실시간 식당 예약 서비스입니다.예약자와 가게 사장님 간의 실시간 소통을 지원하기 위해 1:1 채팅 기능을 구현했습니다. 단순한 메시지 전송이 아닌, 예약 건 단위로 안전하게 주고받을 수 있도록 설계하여, 예약 관련 문의 및 요청사항을 실시간으로 교환할 수 있습니다. 🧩 설계1. ERD 설계 - 채팅방 없이 메시지만 저장이 시스템은 예약(reservation) 단위로 채팅이 이뤄지므로, 별도의 채팅방 테이블은 필요하지 않습니다.각 `reservation_id`는 고유한 채팅방 역할을 하며 예약이 존재해야만 채팅이 가능하므로, 채팅방 개념은 reservation에 종속됩니다. 모든 채팅 메시지는 chat_message 테이블에 저장됩니다.💡 채팅방 테이블을 만들지 ..