[TIL] 두 번째 프로젝트 시작

dev.soo·2020년 10월 11일
0

TIL

목록 보기
7/10

두 번째 프로젝트가 시작되었다.
지난 프로젝트와 다르게, 커머스 사이트가 아니라 가상화폐를 거래하는 사이트를 클론하게 되었다.

지난 프로젝트와의 차이점, 프로젝트 진행 기간동안 나의 목표를 정리해 본다.

차이점

1. 데이터 구축

지난 프로젝트는 크롤링을 해서 각각 개별적이고 독립적인 데이터(상품이 있다면 상품의 이미지, 가격, 색상 등은 다른 상품에 영향을 주지 않음)를 데이터 베이스에 저장하였다. 그러나 가상화폐 거래는 상품=코인 이라고 했을 때, 코인들은 서로 영향을 주지 않지만 코인이 가지고 있는 속성들(시가, 종가, 고가 등)은 매도/매수 주문 내역을 기반으로 하기 때문에, 매도 매수 주문내역을 직접 생성해야 했다. 매도/매수 주문은 유저가 가지고 있는 코인/유저가 가지고 있는 돈에 따라 수량을 정해주어야 했고, 가격은 시작금액을 임의로 지정하고 그 시작금액의 일정 범위 내에서 거래를 하는 게 자연스럽기 때문에 이것도 로직으로 구현해야 했다.

정리하자면 순서는 아래와 같다.

  1. 유저/유저가 가지고 있는 코인/유저 지갑의 현금을 임의로 넣어줌
  2. 유저가 보유한 코인을 매도하는 주문을 생성 (수량은 유저가 가지고 있는 코인 수량보다 적게 랜덤으로)
  3. 유저가 코인을 매수하는 주문을 생성 (유저의 현금에서 다른 매수 주문건이 이미 존재한다면 그 가격만큼 제외해서 실제로 사용 가능한 금액 내애서 매수 가능하게 함. 이 때 가격은 초기 가격의 93~105%의 가격, 가격에 따라 수량도 정해짐)
  4. 매도/매수 주문이 쌓이게 되면 거래를 생성함(10~30초에 한 번씩 거래 시도)
    1) 매도/매수 주문들을 주문 시간순으로 줄을 세움
    2) 두 번째 주문부터, 이전에 일어났던 주문들 중 반대 주문을 가져옴(매수하는 주문일 경우, 이전에 일어났던 매도 주문들을 가져옴)
    3) 반대 주문 중, 가격이 같은 주문들을 가져옴
    4) 이렇게 추려진 주문들을 주문 시간별로 줄 세워서, 내 주문의 수량이 0이 되거나, 더이상 줄 선 주문이 없을 때까지 거래를 일으킴
    5) 거래가 일어난 경우, 매도자의 자산을 줄이고 보유코인수량을 증가
    6) 거래가 일어난 경우, 매수자의 자산을 늘리고 보유코인수량을 감소
  5. 거래들의 데이터가 구축 되었으니, 레포트를 작성해줌
    1) 매 분 00초마다, 그 직전 1분동안 일어난 거래를 불러옴
    2) 고가, 저가, 종가, 거래량을 계산하여 저장
    3) 이전 1분동안 일어난 거래에 대한 레포트(직전 레포트)의 종가를 시가로 저장

거래가 자주 일어나야 했고, 고가/저가의 차이가 어느 정도 나야 레포트를 토대로 그래프를 작성하였을 때 보기 좋은 결과가 나올 수 있다. 그래서 거래가 자주 일어나게 하기 위해선 많은 사람이 최초가격과 큰 차이가 나지 않는 가격의 매도/매수가 일어나야 했고, 매도와 매수 주문의 가격이 서로 너무 범위가 다르면 거래가 잘 일어나지 않기 때문에 중간값을 찾아서 거래를 일으켜야 했다. 이를 위해 데이터를 n 번 갈아앞었고, 마음에 쏙 들지는 않아도 지금까지 만든 데이터를 쓰기로 했다. 유저는 무려 만명이고, 그 만명이 각각 두 건의 매도와 매수 주문을 걸어놓는데도, 1분동안 거래가 아얘 일어나지 않을때도 너무 많다. 정말 고통스럽다..

2. 모델링

데이블 자체는 많지 않고 포린키로 연결된 것도 그렇게 복잡하지 않지만, 하나의 데이터를 생성하기 위한 로직이 너무나도 복잡하여 어려운 수학 문제를 1분동안 푼 것 같다.

3. 로직 구현

데이터 구축한 것은 과거 데이터고, 우리는 실제로 작동하는 사이트를 만드는 것이기 때문에, 과거의 매도/매수 주문들을 만들어 준 이후에 새로운 매도와 매수 주문을 걸었을 때, 줄 선 매도/매수와 거래를 일으켜야 한다. 즉, 매도/매수 주문이 일어나는 request 한 건에 매도/매수 주문 생성, 거래 생성, 자산 변경, 보유 화폐 수량 변경이 연쇄적으로 일어나야 한다.
레포트도 request 없이 매 분 00초마다 자동으로 생성해주는 함수를 스케쥴러로 작성해서 자동화해야 한다.
외부에서 request 로 받는 요청은 결국 매도/매수밖에 없게 된다. 나머지는 전부 GET 으로 처리.

나의 목표

  1. 소셜 로그인 해보기 - 카카오로 소셜 로그인을 할 계획인데 아직도 못 했다. ㅠㅠ
  2. 스케쥴러 사용하여 자동화 - 함수를 어떻게 작성해야 하는지 아직 모른디 ;;
  3. Unit test 구현
  4. Git rebase 왕왕 해보기

일주일 후에 후기로 뵙겠습니다.. 총총

1개의 댓글