JNHS Finance 암호화폐 모의투자 거래소 개발 회고

이원찬·2025년 1월 15일
2

⚙️ 도입

다른 학교들의 교내 행사들을 보면 참여하는 학생들만 참여하고 적극적으로 참여하지않아 보였다.
그럼 참여율을 높이려면 어떻게 해야할까?
나는 아래의 3가지 조건을 만족해야 참여율이 증가할 것 같았다.

· 언제 어디서든 할 수 있어야 한다.
· 재미가 있어야한다 (도파민이 나와야한다?)
· 중독성이 있어야한다.

위 3가지 조건을 만족하면서 생각해낸 아이디어가 "가상화폐 모의투자 대회" 였다.
모의투자대회는 인터넷만 되면 언제 어디서든 할 수 있고, 투자를 하여 이익을 실현하였을때 성취감을 느낄 수 있으며, 심지어 흥미를 깊게 유발하는 아주 매력적인 아이디어였다.

🚀 개발 시작!

DB 설계

트레이딩에서 중요한 것은 정확하고 오류 없는 거래 기록이기 때문에 잠깐 잠깐 여유 시간을 내어 DB 설계를 어떻게 해야 정확하고 오류 없이 할 수 있을지 고민을 많이 하였다.

블루존은 각 코인별 캔들차트를 생성하기위한 분별 종가(close), 시가(open), 상한가(high), 하한가(low), 거래량(volume)을 저장할 수 있도록 테이블을 설계했다.

오렌지존은 서비스를 운영하기위한 테이블인 Acc_Trade_Price_24h(24시간 거래대금), 거래기록을 저장하는 transactions 테이블, 증시캘린더를 위한 events 테이블, 현제가를 기록하는 price 테이블, 가입한 유저 데이터를 저장하는 테이블인 user 테이블로 구성하였다.

UI/UX 디자인

메인


위와같이 반응형 웹 디자인으로 디자인하였다. 메인 화면에 국내 외경제와 가상자산 시장의 흐름을 알 수 있는 다양한 지수를 한눈에 볼 수 있도록 하였고 상단 헤더부분에는 한국증권거래소(KRX) 로비의 전광판처럼 현재 종목들의 시세가 나오며 움직이는 것으로 디자인하였다.

거래소


좌측에는 코인 목록 우측에는 뉴스를 배치하였다. 트레이딩에서 뉴스의 영향력은 크기 때문에 빠르게 접근할 수 있도록 거래소 우측에 배치하였다.

내 자산


내 자산은 국내 가상자산 거래소 중 하나인 빗썸(Bithumb)의 내 자산 UI/UX을 참고하여 디자인 하였다.
보유 중인 가상자산의 평가손익이 실시간으로 업데이트되어 표시되는 등 사용자 편의성을 고려한 디자인하였다.

시세 차트는 TradingView의 Lightweight-charts 라이브러리를 활용하여 구현했다. 실시간 데이터 수신해야하기 때문에 웹소켓을 이용해 체결 내역과 호가 정보를 실시간으로 차트에 반영하고 화면에 표시했다. 사용자가 과거 시세를 조회할 경우, 이벤트 리스너를 통해 과거 캔들 데이터 API를 자동으로 호출하여 히스토리 캔들 데이터를 로드하는 방식으로 구현하였다.

백엔드

실시간 시세 데이터 처리


시스템의 실시간 데이터 처리 흐름은 위 사진과 같다. Upbit 거래소와 전남고 서버가 웹소켓으로 연결되어, 호가 정보, 체결 내역, 거래 대금, 거래 유의사항, 투자 현황 등 다양한 데이터를 실시간으로 수신한다. 이렇게 수신된 데이터는 전남고 실시간 시세 처리 서버에서 처리 과정을 거친 후 최종적으로 사용자들에게 전달된다.

Upbit 거래소로부터 실시간으로 수신된 데이터는 Gateway를 통해 호가 데이터와 체결 기록 데이터로 분류되며, 각각 필요한 목적지로 라우팅된다. 먼저, 체결 기록 데이터는 사용자가 ws.jeonnam.school/에 연결하면, 현재 JNHS Finance에 상장된 가상화폐의 체결 기록 메시지가 실시간으로 사용자에게 전달된다. 또한, 체결 기록 데이터는 1분 동안 변수에 저장되며, 이후 종가, 시가, 최고가, 최저가, 거래량 등을 계산하여 데이터베이스(DB)에 전송해 캔들 차트를 생성한다. 호가 데이터의 경우, 사용자가 ws.jeonnam.school/orderbook에 연결한 뒤 구독할 종목 코드 메시지를 전송하면, 서버는 해당 종목의 호가 데이터를 실시간으로 사용자에게 전송한다. 체결 데이터와 달리, 호가 데이터는 사용자가 요청한 종목에 한해서만 전송되기 때문에 서버의 대역폭을 크게 절감할 수 있었다. 이 모든 과정은 거래소에서 수신된 데이터가 전남고등학교 서버에 도착한 후 평균 0.005초(5ms) 만에 처리되어 사용자에게 전송된다.

국내 외 경제 지표, 가상자산 시장 지표 가져오기


일정시간마다 토스증권 API, 한국투자증권 API, yahoo finance API를 이용하여 증시캘린더, 원 달러 환율, KOSPI, KOSDAQ, UBMI, 가상자산 거래 종목 경보, 24h 거래대금, 가상화폐 공포탐욕지수, NYSE종합지수, 다우존스, 나스닥, 유로스톡스 50 지수를 일정시간마다 API에 요청하여 가져온 정보를 DB에 캐싱해서 유저에 보여주는 구조이다.

Q. 각 증권거래소에 요청해서 지수를 가져오면 안되나요? 왜 각 증권사의 API를 이용하나요?

A. 각 증권거래소에 데이터를 바로 요청하면 좋지만, 거래소에 데이터를 요청하려면 별도의 계약이나 라이선스가 필요하다. 그래서 무료로 제공되는 각 증권사의 API를 사용하였다.

거래 기록만으로 보유자금, 보유자산, 총평가, 평가손익 계산하기


보유자금 계산: (coin_symbol이 provision에 해당되는 행의 total값들을 합산한 값) + (각 코인별 Total 값 합산)

총평가 계산: 각 코인별 amount값 합산 * 각 코인별 시세

보유자산 계산: 보유자금 + 총평가 평가손익 계산: 총평가 + 각 코인별 Total 값 합산
(Buy일 경우: total값 음수 처리 | Sell일 경우: total값 양수 처리)

현재는 위처럼 계산하고 있지만 거래 건수가 10만건이 넘으면서 느려지는 문제가 발생하고 있다. 따로 각 유저의 계좌 테이블을 만들어서 거래를 할때 보유자금, 총 평가, 보유자산을 계산하여 저장하도록 로직을 개선 해야겠다

전체 서버 아키텍쳐

결론

JNHS Finance 모의투자 대회는 여기서 끝이 아니다. 대회 운영 기간 동안 발생하였던 다양한 운영 문제, 프로그램 오류들이 발생하였는데, 이를 분석하고 해결하면서 나는 더 발전하였다. 또한 대규모 트래픽을 신속하고 안전하게 처리하는 방법도 연구하며 배우고, 운영하는 도중 대응하는 방법도 익히며 전보다 성장하였다. 이제 다음 단계는 교내에서 개최한 모의투자 대회를 바탕으로 이것을 다른 학교도 참여 할 수 있게 하여 반 별 경쟁, 좀 더 나아가 학교 별 경쟁으로 발전 시키는 것이다!

profile
매우 평범한 인문계 고등학생 엔지니어

0개의 댓글

관련 채용 정보