해당 글은 모의 주식 투자 프로젝트에서 real time DB (실시간 DB)를 적용하는 과정을 회고하는 글이다.
주로 어떤 고민을 했고, real time을 선택하게 된 과정을 적어놓은 글이니 가볍게 읽을 수 있는 포스팅이라 생각한다.
최근 진행한 프로젝트는 모의 주식 투자 시뮬레이션 프로젝트다.
해당 프로젝트의 특성상 실제 주식 가격을 실시간으로 받아와야만 했다.
내가 선택한 방법은 KIS, 한국투자증권에서 제공하는 실시간 주식 체결가 API를 통해 KIS에서 제공하는 web socket으로 데이터를 받아오는 방식이었다.
따라서 초기에 실시간으로 변경되는 주식의 가격을 저장하기 위해 위와 같은 플로우로 계획했었다.
이러한 방식에서 만약 사용자가 현재 실시간으로 전체 주식들의 가격을 보고자 한다면, 나는 어떻게 해야할까 고민했다.
나는 이러한 고민을 할 때, 처음에는 정말 단순하게 생각한 다음, 단점들을 찾고 보완시켜 가면서 좋은 결과물을 만들어가는걸 선호하기 때문에 처음에는 매우 간단하게 생각했다.
정말 단순하고 근본적이다.
사용자가 원하는 전체 주식 가격을 조회하는 API를 개발하여, 사용자가 전체 주식 가격을 받아볼 수 있도록 하는 것이다.
하지만 여기에는 문제가 있었다.
내 목표는 사용자가 실시간으로 변경되는 주식의 정보를 받아보게 하는 것인데, 이러한 방식은 사용자가 주식 가격이 업데이트 될 때마다 새로고침을 통해 전체 주식 가격 조회 API를 다시 서버에게 요청해야만 했다.
이는 사용자의 불편함뿐만이 아니라, 만약 많은 사용자가 몰렸을 경우에은 실시간 주식 가격 조회 api의 응답속도가 느려지면서 더이상 실시간이 아니게 될 수 있다.
따라서 나는 더 성능이 좋고, 사용자가 더 편할 수 있는 방법으로 바꿔야 했다.
그래서 생각해낸 방법은 WebSocket을 이용하는 방법이었다.
어떻게 하면 실시간으로 사용자들에게 업데이트되는 주식 정보를 전달 할 수 있을까 고민하던 찰나, 나도 KIS의 WebSocket을 통해 실시간으로 업데이트 되는 주식 정보를 받고 있다는걸 깨달았다.
따라서 나는 서버측에 WebSocket을 추가한 뒤 실시간 주식 가격을 조회하는 API에 WebSocket에 연결하는 로직을 추가하였고, 만약 주식 가격이 업데이트 되었다면, WebSocket에 연결된 사용자들에게 변경된 주식 가격 정보를 전달하여, 실시간으로 변경되는 주식 정보를 볼 수 있도록 하였다.
이렇게 한다면 주식 가격을 보고 있는 사용자는 주식의 가격이 바뀔 때 마다 변경된 정보를 바로바로 볼 수 있게 된다.
하지만 사용자가 많이 몰린다면 WebSocket에서 발송하는 속도가 늦춰질 것이기에 이 방법 또한 성능 문제는 해결할 수 없었다.
또한 주식의 종류는 매우 많고 1초마다 가격이 변경되는 주식의 수는 몇백, 몇천가지 일텐데, 그럴 때마다 DB에 접근하여, 가격을 비교하고, 업데이트 한 뒤 WebSocket에 연결된 사용자에게 메세지를 전송한다??
이건 생각만 해도 성능상에 이슈가 분명히 존재한다. (성능 테스트를 해봐야 했었는데.....못함.....)
이걸 어떻게 해결해야할지 고민을 했지만, 마땅히 떠오르는 방안이 없었고, 나는 다른 사람들은 모의 투자 프로그램을 만들 때 어떤 방식으로 하는지, Toss에서는 어떻게 이를 해결했는지, 많은 자료들을 찾아보기 시작했다.
그 결과 나는 RealTime DB 라는걸 발견했다.
RealTime DB는 Firebase에서 지원하는 실시간 데이터베이스로, 데이터를 JSON 형태로 저장하는 NoSQL DB이며, 실시간동기화라는 특별한 기능을 제공하고 있었다.
기존의 DB들을 요청/응답 모델로 작업하게 되어 있지만, RealTime DB의 경우에는 변경이 발생하면, DB가 사용자들에게 그 사실을 모두 알려주기 때문에, 실시간성이 중요한 프로젝트에는 제격이었다.
RealTime DB에 관한 더 자세한 내용이 궁금하다면
https://developers-kr.googleblog.com/2016/08/have-you-met-realtime-database.html
아래 링크를 참고하면 될 듯 싶다.
나는 RealTime DB를 바로 내 프로젝트에 도입했고, 그 결과는 놀라울 정도로 프로젝트가 간결해졌다.
앞서 KIS에서 받아오던 데이터를 MySQL에 업데이트를 해주는 방식 또한 주식의 종류가 굉장히 많기 때문에, MySQL에 걸리는 부하가 너무 클 것 이라는 걱정도 있었지만, DB를 분리해줌으로써 회원, 거래정보 등을 담고 있는 MySQL DB에 대한 부하를 줄여줄 수 있었을 뿐더러, 사용자가 실시간 주식 가격을 원할 때에도 WebServer에 요청하는 방식이 아닌 RealTime DB에 직접적으로 접근하여 데이터를 받아오기 때문에, WebServer에서 관리하던 WebSocket이나 변경된 주식 정보를 사용자에게 알려주는 로직, 관련 API등 모든 기능이 삭제되어도 되었기에, DB의 부하 뿐만 아니라 서버의 부하 또한 줄일 수 있었다.
즉, RealTime DB를 사용함으로써 내가 고민하던 실시간성 문제와 성능 문제를 둘 다 해결할 수 있었다.
만약 실시간으로 변경되는 데이터를 사용자들에게 제공해야하거나, 혹은 실시간으로 변경되는 데이터를 관리하고자 한다면, Firebase의 RealTime DB를 사용해 보는것을 추천한다.
이 글에서는 firebase를 사용하는 구체적인 방법은 적어놓지는 않았지만, 아래에 적용시 사진을 첨부하고자 한다.
위 사진처럼 실시간으로 데이터가 표시되고 있으며, 이는 클라이언트가 직접적으로 접근할 수 있게 되어 있다.
또한 서버에서 데이터의 변경이 있다면 해당 사진의 데이터들이 실시간으로 변경되며, 이는 사용자에게 전달되는 방식이다.
'백엔드 멘토링' 카테고리의 다른 글
주식 프로젝트 influx DB 도입 ADR 과정 (0) | 2024.10.30 |
---|---|
[회고록] Triple Clone 프로젝트 API 완성도 기록지 (3) | 2024.09.28 |
계좌 잔액 업데이트 동시성 문제 해결 과정 (5) | 2024.09.03 |
객체지향적 Refactoring 과정의 기록 (1) | 2024.07.11 |
순환 참조를 해결해보기 (0) | 2024.02.28 |