프로젝트로 채팅을 구현했었는데, 복습할 겸 내용을 정리해두고자 합니다.
구현 과정에 대한 설명 전...
WebSocket과 STOMP에 대해서 하나도 몰랐기 때문에 내용을 정리했었습니다.
WebSocket
WebSocket이란?
Ws 프로토콜 기반으로 클라이언트와 서버 사이에 지속적인 완전 양방향 연결 스트림을 만들어주는 기술을 말합니다.
대표적으로 게임과 채팅에 많이 사용됩니다.
따라서 채팅은 HTTP 통신이 아니라 웹소켓(WebSocket) 통신을 통해서 일어납니다.
웹 소켓은 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜로 실시간성을 보장하기 위해 사용됩니다.
즉, 채팅은 실시간성이 필요하기 때문에! 웹소켓을 사용합니다.
HTTP 통신은 한 번 요청 후 응답하면 연결이 끝납니다. 여러 번 요청할 경우 여러 번 연결이 맺어지는 방식입니다.
그러나 웹소켓은 한 번 요청 후 연결을 끊기 전까지 계속 연결을 유지합니다.
기존 웹소켓만 사용한 방식에서는...
- Spring 단에서 발신자, 수신자를 직접 관리.
- 사용자를 Map으로 관리.
- 클라이언트에서 들어오는 메시지를 다른 사용자에게 전달하는 코드를 직접 구현.
이렇게 사용을 해야 했습니다.
저는 웹소켓을 조금 더 쉽게 사용하기 위해
하위 프로토콜인 STOMP를 사용해서 Spring 채팅을 구현했습니다.
STOMP
STOMP(Simple Text Oriented Messaging Protocol)은 메시지 전송을 위한 프로토콜입니다.
메시지 브로커를 활용해 쉽게 메시지를 주고 받을 수 있습니다.
pub - sub(발행 - 구독) 방식으로 동작합니다.
이 방식은 발신자가 메시지를 발행하면 수신자가 그것을 수신하는 메시징 패러다임으로 웹소켓 위에 얹어 함께 사용 가능한 하위 프로토콜입니다!
STOMP는 메시지 형식이 정해져 있고 pub/sub 방식으로 동작해 추가적인 코드 없이 @MessagingMapping만으로 쉽게 메시지를 전송하고 수신할 수 있습니다.
채팅방을 생성하면 Topic이 생성되며 이 Topic마다 채팅방이 구분됩니다.
해당 Topic을 구독(sub)하면 웹소켓이 연결되어 있는 동안 채팅방을 지속적으로 확인할 수 있게 됩니다.
그렇기에 새로운 채팅이 송신(pub)되면 구독한 사람들에게 메시지를 전달만 해주면 되기 때문에 더 쉬워진 것입니다.
채팅 ERD
WebSocket과 STOMP에 대한 간단한 이해를 바탕으로...
ERD를 작성했습니다.
당시 프로젝트로 회원(사원)이 있었기 때문에 로그인한 사람의 정보를 받을 수 있었습니다.
채팅 ERD의 경우 이것저것 참고해봤는데 본인이 사용하는 거에 맞춰서 만들면 될 거 같습니다.
저는 채팅과 채팅방을 나눠서 만들었는데 사실 합쳐도 될 거 같긴 합니다.
비공개방 여부나 채팅참여수 등을 넣고 싶어서 나눴습니다.
기능 추가하기 편하려고....
잘려서 안 보이지만 채팅방, 메시지는 1명의 사원을 가져야 합니다.
그러나 사원은 채팅에 참여하지 않고 채팅에 참여해도 메시지를 보내지 않아도 되기 때문에 1개나 여러 개나 0개인 경우로 관계를 표기했습니다.
메시지는 1개의 채팅방이 있어야 되고 채팅 참여 내역은 1개의 채팅방을 기준으로 잡았습니다.
또한, 채팅 참여는 PK값을 따로 생성하지 않고 사원ID와 채팅방ID를 FK로 받아서 복합 기본키로 잡았습니다.
이때 메시지에서는 보낸 사람 ID만 있는데, 그럼 받는 사람은 어떻게 보면 되는지...?
이 부분은 프론트엔드에서 로그인한 사용자 토큰 + 보낸 사람 ID를 비교해서 처리했습니다.
보낸 사람이 아니라면 무조건 받는 사람이니 채팅방 기준 메시지칸이 왼쪽으로 가도록 하면 됩니다.
채팅이 은근 참고자료가 많은 것 같으면서도 적어서...
단계별로 천천히 나아갔습니다.
'자바&스프링' 카테고리의 다른 글
[Spring] WebSocket & STOMP로 채팅 구현하기 (4) (0) | 2025.04.07 |
---|---|
[Spring] WebSocket & STOMP로 채팅 구현하기 (3) (0) | 2025.03.28 |
[Spring] Spring boot와 MySQL 연동하기 (0) | 2025.03.20 |
[Spring] WebSocket & STOMP로 채팅 구현하기 (2) (0) | 2025.03.17 |