개요

어플을 만들기 위해 필수 불가결했던 서버

구성은 AWS + Nginx + Gunicorn + Uvicorn을 통해 웹 서버를 구동하고 그 안에는 Django, Django REST Framework, Django Chnnel, Baton, Redoc, Redis, Celery, Firebase Admin, Sentry 등 다양한 편의성 기능을 추가한 Django 서버로 채웠다.

중요 포인트

사용자 로그인

사용자 로그인은 JWT 방식을 활용했다. 이를 위해서 Django rest auth, rest jwt 등을 사용했고, 많은 부분을 커스텀해서 사용했다.

가장 먼저 사용자 네임 대신 이메일을 사용하는데, 이를 위해서 이메일 서비스를 세팅하고 이메일 인증 후 회원 가입을 진행할 수 있도록 진행했다.

그리고 SNS 계정 사용했는데 SNS에 어플로 로그인 시 받아 올 수 있는 이메일 정보와 토큰 정보를 토대로 기존 회원에 연결하거나 새로이 가입할 수 있도록 진행했다.

커뮤니티

처음에는 간단한 포스트와 댓글 기능을 토대로 진행했다.

중고 거래 기능이 추가됨에 따라 가격정보, 상품 이미지, 거래 진행 상황을 표시할 수 있는 기능이 추가되었다.

알람을 추가하기 위해서 Firebase를 활용하는 Firebase Admin을 도입했다. 처음에는 토큰을 어플에서 가져와 저장하는 방식만을 채택했지만, 유저가 많아짐에 따라서 topic을 구독하는 방식도 채용해서 사용하고 있다.

채팅

채팅에는 Django Channel과 Redis가 필수였다. Django REST Framework는 비동기처리를 도와주지 않았고 채팅 기능에 필요한 실시간 통신인 Webscoket 역시 지원하지 않았다. Django에서 실시간 처리를 도와주는 Django Channel을 추가해서 비동기 기능을 추가할 수 있었다. 이를 위해 웹 서버도 기존 Gunicorn만 이용하던 서비스에서 비동기처리를 도와주는 Uvicorn을 추가하여 돌아가도록 만들었다. 그리고 비동기적으로 처리할 때 데이터 베이스를 로드하는 것이 아닌 캐시 서버에서 로드하기 위해 방의 ID를 기록하는 Redis 서버를 적용했다.

처음에는 Websocket에 빠른 처리가 필요하다는 부분을 간과하고, 채팅방이라는 구조 안에 채팅을 집어넣어 로딩하는 구조로 만들다보니 채팅을 잘라서 불러오기도 어렵고, 무조건 채팅방을 다 로딩해야 하다보니 너무 많은 시간을 잡아먹는 기능이 되었다.

시간을 최대한 빨리 로딩하기 위해서 채팅방과 채팅을 분리하도록 했고, 채팅방은 채팅방의 껍데기 정보만 가져오고, 채팅은 불러온 마지막 채팅을 기록해서 필요한 부분만 가져오도록 했다.

상품

크롤링한 데이터를 그대로 보여주는 것을 토대로 설계했다.

지금은 그룹, 카테고리 등 다양한 부분에서 데이터를 크롤링 할 수 있게 설계함에 따라 그룹별로 혹은 카테고리 별로 확인하여 상품들을 뿌려줄 수 있도록 설계했다.

구독