채팅방 구현은 어떻게 할까
이슈 내용
채팅방은 어떤 식으로 구현해야 사용자들이
자연스럽게 채팅방이라고 느낄까?
STOMP의 SUBSCRIBE 개념
STOMP
(Streaming Text Oriented Messaging Protocol)
간단한 텍스트 메세지 프로토콜이다.
프로토콜이란 말은
http 네트워크 통신 규약으로,
STOMP는 http같은 메시지를 보낼 때
상용하는 규약으로 생각하면 된다.
아래 그림이 가장 이해하기 쉽고 적절한 것 같아 가져와 봤다.
분홍 토끼는 rabbits를 구독 중이다.
주황 고양이는 cats를 구독 중이다.
갈색 토끼가 "Hi!"라는 메시지를 rabbits를 향해 보내면
STOMP는 MESSAGE BROKER를 거쳐
rabbits를 구독 중인 분홍 토끼에게만 메시지가 가게 된다.
분홍 토끼는 animals를 구독 중이다.
주황 고양이 또한 animals를 구독 중이다.
갈색토끼가 anmials를 향해 "mornig!"이라는 메시지를 보냈다.
이 메시지는 MESSAGE BROKER를 거쳐
animals를 구독한 분홍 토끼와 주황 고양이에게 메시지가 전달되게 된다.
구독만 한다면 MESSAGE BROKER에서 메시지를 받아 볼 수 있는 구조이다.
내용, 이미지 참고 - hongju Blog
생각해 보기
STOMP에 대한 위 특성에 대하여 포커싱을 하여 채팅방을 어떻게 구현할 수 있을지 계속 생각해 보았다.
STOMP는 websocket에 비해 채팅을 pub/sub으로 메시지를 공급하는 주체와 소비하는 주체가
나뉘어 있어 채팅방 구현에 적합하다.
채팅방을 들어가는 순간 shakehands가 일어나 websocket이 connection이 되고
그 후 자동으로 채팅방을 들어온 사람들은 채팅방이름을 구독하게 하고
채팅방이름에만 메시지를 보낼 수 있게 한다면 가능할 것 같았다.
가설
생각1 : 한 socket서버에 사람들이 모두 존재한다.
-> 한 사람이 말을 하면 모두에게 들린다.
생각2 : 고유한 주소로 pub/sub을 해준다면 관련된
사람들만 대화가 보일 것이다.
-> 각각을 구분할 수 있는 고유한 값을 구독하게 한다.
결론 : 모두 같은 서버 이지만 고유값으로 pub/sub을 해준다면
이용자는 자연스럽게 채팅방을 입장하여 대화하는 것처럼 느낄것이다.
해결 과정
1. chatRoom Entity를 만든다.
채팅방을 DB에 INSERT 하면,
눈으로 채팅방 목록들이 확인 가능할 것이라 생각하였다.
2. UUID로 채팅방이름을 만든다.
채팅방의 순서를 특정하고 싶지 않아
UUID의 고윳값으로 채팅방 이름을 만들었다.
UUID는 시간과 관련하여 랜덤 하게 고윳값을 만들어 낼 수 있다.
이렇게 하면
/sub/chat/room + roomId으로 방 ID를 구독한 대상에게만 메시지가 보내지도록 할 수 있다.
정리를 하고 보니 STOMP에 대한 특성만 알면
채팅방 구현은 충분히 가능하다.
'프로젝트 회고' 카테고리의 다른 글
이슈) IntelliJ에서 xml파일의 경로를 찾지 못하는 문제 (0) | 2024.06.19 |
---|---|
클론 프로젝트) 카카오톡 클론코딩 - websocket통신시 유저 정보 null에 대한 고민 (0) | 2023.07.06 |
클론 프로젝트) 카카오톡 클론 코딩 (0) | 2023.07.05 |
실전 프로젝트) Apoorpoor - 아이템 이미지 나타내기 (0) | 2023.07.04 |
실전 프로젝트) Apoorpoor - 작성했던 테스트 코드의 방향성 (0) | 2023.07.02 |