채팅에 관한 간단한 리서치, JWT 인증 구현

인턴을 하면서 저번에 리더님이 나에게 해보고 싶은 것 있냐고 물어보셨을 때, 웹소켓이나 인증 부분을 다뤄보고 싶다고 말했었다.

그래서 리더님이 그걸 기억하시고, 이번 NIPA 챗봇 외주 개발 프로젝트에 나를 넣어주셨다.

해당 프로젝트는 기존 서비스에 장고로 연결되어 있던 것을 떼와서 FastAPI로 바꾸는 것이었어서 처음부터 끝까지 다뤄보지는 못했다.

그래서 뭔가 아쉬워서 혼자라도 간단한 채팅을 구현해보고 싶어서 이 프로젝트를 시작했다.

NIPA에서는 웹소켓은 Node.js로 이루어져있었고, REST API로 Fast API한테 메시지를 전달하면 AI의 응답을 담아 다시 웹소켓에 쏴주는 형식이었다.

즉, FastAPI 는 socket client 역할을 했었다. 하지만 지금은 FastAPI에서 웹 소켓 서버를 만들고 api까지 1개의 서버에서 하니, REST API 통신이 필요 없지 않을까?

채팅 구조는 어떻게 되어야하는가....

웹 소켓과 api가 같이 있으니 그냥 소켓에서 메시지를 보내기 전에 메시지 저장하고 뿌리면 되는건가?

채팅서버의 부하 분산 사례

LINE LIVE 채팅 기능의 기반이 되는 아키텍처 - LINE ENGINEERING

흐음.. 아직 잘 모르겠다...

그리고 파이썬에서 소켓 모듈은 왜이렇게 많은가...? websocket, websockets, socket, socket.io... 이 중 뭘써야되지...

우선은 FastAPI docs에 나와있는 starlette Websocket을 사용하여 개발해봐야겠다.

채팅 환경은 우선 공식 문서에서 나와있는 것 그대로 가져오면 작동했다.

그럼 우선 유저를 만들어야하니 모델링이랑 인증을 먼저 구현해봤다.

DB 모델링

DB는 우선 회사에서 쓰던 postgresql을 써보기로 했다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5f1c9310-cff7-4a3f-9256-12a9ea697207/Untitled.png

postgres는 관계형 DB에 NoSQL 느낌이 약간 더해진 DB인데, 아직까지는 그것을 잘 활용을 못하겠다.