본문 바로가기

FastAPI 채팅 개발 일지

(6)
21. 05. 12 친구 관계 설정 API, Query logging, jwt 로그아웃 친구 관계 설정 API, Query logging, jwt 로그아웃 친구 관계 설정 API 이 부분을 하면서 뭔가 다양한 것을 찾아본 것 같다. 쿼리 로깅을 달고 쿼리 횟수를 보면서 쿼리 횟수를 최대한 줄이기 위해서 orm 로딩 전략도 찾아보고 많은 것을 공부해볼 수 있었다. api 작성 자체는 어렵지 않았다. 하지만 쿼리를 어떻게 날릴 건지에 대한 많은 고민을 했다. 친구 상세 조회 현재 로그인 된 유저와 친구 관계인지 먼저 확인하는 것이 필요했다. 그렇다면 현재 로그인 된 유저의 친구 목록을 모두 순회를 하면서 찾는 것은 비효율적이다. 그래서 조인으로 뭔가 해보려고 했다. 중간 관계 테이블과 유저 테이블을 조인해서 로그인 유저-목적 유저가 존재할 때만 목적 유저의 객체만 가져오도록 했다. 친구 목록 ..
21.04.28 친구 관계 설정, EC2, RDS, nginx, gunicorn 설정 최근 자소서와 코테 때문에 많이 진행하지 못했다... 곧 면접도 있어서 cs 공부도 해야되어서 예전만큼 시간을 할애하지 못할 것 같다.. ㅠ 그래도 할때는 열심히! 채팅방이나 인증 등을 직접 테스트 해보려면 프론트가 있으면 좋겠어서 팀원을 구했다. 프론트 갓 시작하는 2명을 영입했다. 회의에서 뭐 더 넣어보고 싶은 기능이 있으면 말해달라고 했었는데, 친구 추가 같은 기능도 있었으면 좋겠다고 해서 친구 관계도 추가했다. 친구 관계 설정, EC2, RDS, nginx, gunicorn 설정 친구 관계 설정 유저 N : M 관계로 일반적인 1: N 관계와는 다르게 선언해줬어야 했다. RDS에서 N:M 관계를 중간 관계 테이블을 두어 N:1, 1:M 두는 것처럼, 중간 테이블을 두어 user_id, friend..
21.04.23 - 소켓 통신 테스트 및 소켓 인증 방식 리서치, Authentication / TrustedHost Middleware 추가 소켓 통신 테스트 및 소켓 인증 방식 리서치, Authentication / TrustedHost Middleware 추가 소켓 통신 테스트 데이터 송수신 테스트 및 채팅방 여러개 테스트 (아직 유저 구분은 하지 않았음) 클라이언트가 페이지를 나가면 소켓 객체 삭제 → 이 부분은 나중에 알림과 같은 부분이 어떻게 구현되는지 보고 다시 봐야되겠다. JSON 형식으로 데이터 주고 받기 → 인코딩 문제 있는데 서버에서 출력하면 제대로 나온다. 그럼 클라이언트에서 디코딩 해야되나? 미들웨어 추가 TrustedHost == allowed host 지금 당장은 필요 없지만 보인 김에 같이 했다. Authentication Django에서처럼 request.user를 하면 현재 로그인 된 유저가 나올 수 있도록 하기..
21.04.21 - 메시지 조회 및 생성 기능, 다른 api 버그 수정 채팅방을 만들었으니 이제 메시지를 만들어볼 차례이다. 별다른 어려움은 없었다. 고민해야 될 점 메시지 생성 시기 및 처리 방법 1 웹 소켓이 유저로부터 메시지를 받음 메시지 생성을 함 완료되면 채팅방에 연결된 소켓들에게 뿌림 방법 2 메시지를 받음 채팅방 소켓에서 바로 뿌림 메시지를 생성함 → background task로 하는 메시지 전송 에러 감지 방법 1에서는 손쉽게 가능 방법 2에서는 어떻게 해야되지....?
21.04.20 - 채팅방 생성 및 조회 기능, Class Based View 유저를 만들 수 있게 되었으니 이제 채팅방 crud를 만들어볼 차례. CBV 인턴에서 FastAPI 사용했을때는 함수형으로 작성했었다. 그러다보니 main.py 파일이 너무 길어지고 수정이 필요할 때 찾기도 불편했다. 그래서 Flask에서처럼 클래스로 뷰를 관리하는 게 있었으면 좋겠다고 생각했는데, 역시 있었다. Class Based Views 생각보다 너무 좋았다. 매번 함수에서 공통적으로 필요한 부분(db, request, user_id)을 선언하지 않아도 클래스 변수로 가져올 수 있다니 신세계다. 한가지 좀 애를 먹었던 것은 user_id를 가져오는 부분이었는데, 나는 해당 함수의 파라미터 이름을 맘대로 지어도 되는줄 알았는데 안되는 것이었다... token: str = Header(...) 이렇게..
21.04.16 - 채팅에 관한 간단한 리서치, JWT 인증 구현 채팅에 관한 간단한 리서치, JWT 인증 구현 인턴을 하면서 저번에 리더님이 나에게 해보고 싶은 것 있냐고 물어보셨을 때, 웹소켓이나 인증 부분을 다뤄보고 싶다고 말했었다. 그래서 리더님이 그걸 기억하시고, 이번 NIPA 챗봇 외주 개발 프로젝트에 나를 넣어주셨다. 해당 프로젝트는 기존 서비스에 장고로 연결되어 있던 것을 떼와서 FastAPI로 바꾸는 것이었어서 처음부터 끝까지 다뤄보지는 못했다. 그래서 뭔가 아쉬워서 혼자라도 간단한 채팅을 구현해보고 싶어서 이 프로젝트를 시작했다. NIPA에서는 웹소켓은 Node.js로 이루어져있었고, REST API로 Fast API한테 메시지를 전달하면 AI의 응답을 담아 다시 웹소켓에 쏴주는 형식이었다. 즉, FastAPI 는 socket client 역할을 했었..