[문제점] 플레이어 접속시 현재 지역(동)의 퀘스트를 만들어서 보내줍니다. 퀘스트를 만드는데 필요한 좌표와 주소를 외부 API(카카오, 공공)로 받아오기 때문에 시간 단축에 어려움이 있습니다.
[현재상황] 역삼동 같은 경우 4,800여개의 주소 중에 48개(1%)의 좌표와 주소를 가져오는데 1초 내외가 걸립니다만, 카카오API의 경우 한번에 너무 많은 요청을 보내면 429 Too Many Requests 응답을 보내기 때문에 요청을 20회씩 나누어 보내고 결국 4~5초 정도 소요됩니다.
[해결방안#1] 퀘스트가 24시를 기준으로 업데이트 되기 때문에, 24시 전에 다음날 퀘스트를 미리 생성해두어 플레이어는 조회만 할 수 있게 하는 방법을 생각 중입니다.
[해결방안#2] 퀘스트 생성 시간을 단축시키기 어려울 경우 로딩 페이지를 활용하는 것도 고려중입니다.
인프라
무중단 배포 PM2 → 오버 스펙인지
현업에서 보통 무중단 배포를 하면 ec2에서 docker로 nginx로 구현하는지? 아니면 aws elastic을 사용하는지 궁금합니다.
토큰 보안 관련
Local 로그인, 카카오 로그인, 구글 로그인의 각각 효율적인 토큰 관리 방법에 대해 고민하고 있습니다.
[현재상황] local 이메일 로그인만 구현된 상황이고 Refresh토큰 구현할 예정입니다.
[로직] access 토큰의 유효시간을 2시간으로 설정해 놓고 클라이언트에서 토큰의 기간이 만료가 될때 서버에 새로운 토큰을 요청하고, 백에서는 클라이언트에 Refresh 토큰이 있다면 바로 새로운 토큰을 발급하는 방식을 생각하고 있습니다.
그 이후 카카오톡 인증, 구글인증을 할때 각각 토큰이 발생하게 되는데, 백에서 인증된 사용자만 서비스를 이용하게 하려면 3개의 인증을 모두 거쳐야 하는가에 대한 고민을 하고 있습니다.
채팅기능 관련(Socket)
접속할 때마다 socket id가 바뀌게 되는데, 유저가 나갔다가 들어와도 기존에 썼던 메세지가 자신의 메세지인지 확인하는 방법 질문.
현재 테이블 Users, ChatRooms, Messages
[현재방법] Users 테이블에 유저id와 소켓id를 저장하고 유저가 입장했을 때 전에 사용한 유저인지 유저 테이블에서 조회 후, 유저id가 존재하면 소켓 id만 update하고 없을 경우 유저 정보(소켓id 포함)를 create합니다. 이 소켓 id는 ChatRooms 테이블의 socketId 칼럼(array) 에 insert합니다.
답변
퀘스트 생성 시간 단축
AWS Elasticsearch 활용한 캐싱 ⇒ 검토 후 적용
DB화
1안) DB에 다음날 퀘스트 생성해두기 (2~3일)
2안) DB에 우리나라 전체 주소, 좌표 데이터 저장해 두기
카카오/구글 JWT
카카오/구글 토큰은 이사람이 로그인 됐나 안됐나만 확인하는 것
나머지는 백에서 로그인 처리 하는 방식
리프레쉬 토큰
두개다 LocalStorage에 저장을 추천,
그러나 Refresh토큰을 쿠키에 저장하면 이점도 있음, 따로 정답은 없음
프런트/백엔드 협의 후 결정
무중단 배포
AWS Elastic Beanstalk 사용 권장 (docker) 를 이용해서 하면 더욱 좋음 ⇒ EB 검토 후 적용
(쿠버네티스 사용하기전에 선행학습에 효과적임)
CI/CD는 모든 회사에서 대부분 하고 있음
PM2, Nginx 사용 안해도 됨 편한게 짱임
(빠른 개발환경구성으로 실 개발에 더 집중 할 수 있을거라 생각됨)