SSAFY 과정을 진행하면서 여러 프로젝트들을 진행했는데, 전부 큰 문제점이 있었다.
바로 유저가 없으면 백엔드 서버가 논다는 것이다.(모든 서비스들이 그렇긴 하다..)
그래서 든 생각은 유저의 적어도 서버가 많이 일하게 하는 방법은 없을까..? 하다가 코인 모의투자 프로젝트를 생각하게 되었다.
마침 Upbit에서도 Websocket을 통해서 데이터를 받을 수 있었다.
https://docs.upbit.com/docs/upbit-quotation-websocket
계산해보니 체결 건만 1초에 약 10개정도의 데이터를 받게 되었다.
그 말은 유저의 주문 1개당 1초에 최대 10개의 DB query를 날리게 되는 것이다.
이거 재미있겠는데..? 하는 마음으로 프로젝트를 시작하게 되었다.
아키텍처는 다음과 같다.
Docker까지 건드는 건 욕심같아서 일단 AWS에서 메모리 약 4GB정도의 서버를 대여해서 구동하였다.
(도메인까지 사버렸다...)
Github Main branch에서 커밋이 일어나면 Jenkins에 요청을 보내고, 서버에서 git pull 실행 뒤 build 후 기동되도록
CI/CD를 구축했다.
Redis는 Session 저장용, mongoDB는 코인 가격 정보 저장용 그리고 PostgreSQL은 유저 데이터 저장용이다.
로그인 / 회원가입의 경우 이전 프로젝트에서 진행했던 방식대로 간단하게 구성했다.
새로 건드려보는 건 Spring Session을 통해 Redis에 저장하는 정도이다.(구글링 열심히 하면 되겠지..)
이 프로젝트의 기본 로직이다.
Upbit한테서 Websocket으로 받은 정보들을 프론트엔드로 그대로 전달하고, 그 중에서 현재 시세는 mongoDB에 저장한다.
체결 내역들은 유저의 주문목록들을 보고 조건에 맞으면 체결시키고, SSE를 통해 유저에게 전달하는 방식이다.
굉장히 간단해 보이지만, 체결 내역을 통해 주문들을 체결시키는 로직은 전혀 간단하지 않았다..
1. Upbit로부터 체결 내역들을 받아와서 유저의 주문 목록들 중 조건에 맞는 주문들만 Select한다.
2. Select된 주문들의 실제 체결량을 계산하고
3. 주문 Update, 현금, 코인 Update, 체결 Insert 후 SSE로 체결 내역 전달
이외에도 레버리지 주문도 구현할 예정이다. 앞으로 블로그를 포스팅하면서 해당 로직 구현 방법과 마주한 문제들을 포스팅 할 예정이다.
'Back-end > Spring boot' 카테고리의 다른 글
코인 모의투자 프로젝트(5) - 퍼포먼스 향상 - 2 (1) | 2024.04.28 |
---|---|
코인 모의투자 프로젝트(4) - 퍼포먼스 향상 - 1 (0) | 2024.04.23 |
코인 모의투자 프로젝트(3) - 유저와 웹소켓 연결 (0) | 2024.04.18 |
코인 모의투자 프로젝트(2) - Upbit Websocket 연결 (0) | 2024.04.17 |