[TIL] socket.io로 실시간 채팅 구현, API 설계
TIL
📌 Issues encountered
Issue #1
- original repository의 main이 아닌 develop branch에 pull request 보내기
* git flow 전략에서 우리가 필요한 branch인 develop과 feature 브랜치를 원본 repo에서 사용하기로 결정
Issue #2
- 소켓을 통해 실시간으로 구현되는 채팅 record를 어떻게 DB에 저장할까?
📌 What I tried
Issue #1
- forked repo에서는 각자 feature/chats와 같이 feature/ 뒤에 역할을 붙여서 브랜치를 관리하기로 하였다.
- 먼저 forked repo에서 original repo의 sync를 맞춰서 develop 브랜치를 만든다. 즉, forked repo는 main, develop, feature/chats 이 3개의 브랜치가 존재한다.
- 내가 맡은 모든 코드는 feature/chats에서 관리한다.
- feature/chats의 commit 기록들을 original repo develop 브랜치에 PR하기 전, forked repo의 develop 브랜치의 sync를 맞춰준다. => 여기서 sync를 맞추지 않으면 PR창에서 cannot merge ERROR가 뜬다.
- feature/chats에서 바로 원본 repo의 develop 브랜치에 PR을 날린다.
Issue #2
- 프론트에서 시간 간격을 두고 PATCH 요청을 보내는 것으로 결정하였다.
setInterval()을 통해서 시간 간격을 두어 PATCH요청을 보내고, 이미 DB에 저장되어 있는 채팅의 마지막 인덱스를 저장하여 이를 기준으로 저장되지 않은 채팅 목록들을 배열 안에 집어넣고 그 배열을 body로 서버에 전달해준다.
- 서버는 이 배열을 body에서 받아서 stringify로 가공해준 후 content라는 column에 새로 업데이트된 채팅 내역에 대해 추가해준다.
- 우리같이 소규모 프로젝트는 RDBMS에 이렇게 INSERT 요청을 많이 보내주어도 크게 문제는 없지만, 대규모 실시간 채팅 서비스의 경우 부하가 심할 것이기 때문에 json 형태로 채팅 내역을 저장할 수 있는 noSQL이나 아예 serverless 실시간 DB인 firebase를 사용해서 프론트에서 바로 DB로 채팅 내역을 전송해주고 내용을 받아오는 방법을 사용할 수도 있다.
- 소켓 프론트와 연결 완료 후 잘 동작하고 시간이 남는다면 mongoDB로 채팅 내역 저장을 시도해보려고 한다.