코인 가상 거래 만들어보기! (4) coin 모델 생성

HEYDAY7·2021년 5월 21일
0

coin data를 꾸준히 적재할 수 있도록 CoinPrice model을 만들고 task를 통해서 서버가 켜져있을 때 지속적으로 BitCoin 가격을 가져와 데이터를 쌓도록 하는 코드를 작성한다.

CoinPrice model 작성

coin/models.py

class Coin(models.Model):
    name = models.CharField(max_length=100, null=True)
    ticker = models.CharField(max_length=10)
    description = models.TextField(default=None, null=True)

    def __str__(self):
        return self.ticker



class CoinPrice(models.Model):
    coin = models.ForeignKey(Coin, on_delete=models.CASCADE)
    opening_price = models.FloatField()
    closing_price = models.FloatField()
    min_price = models.FloatField()
    max_price = models.FloatField()
    units_traded = models.FloatField()
    acc_trade_value = models.FloatField()
    prev_closing_price = models.FloatField()
    units_traded_24H = models.FloatField()
    acc_trade_value_24H = models.FloatField()
    fluctate_24H = models.FloatField()
    fluctate_rate_24H = models.FloatField()
    date = models.DateTimeField(auto_now=True)

먼저 등장하는 Coin model의 경우에는 향후에 여러 Coin으로 확장이 가능하기 때문에 Coin의 종류를 나타낼 수 있는 모델이다. API 사용되는 'ticker'와 Coin의 fullname을 칭하는 'name', 그리고 설명 'description'을 추가해두었다.

CoinPrice의 경우 빗썸 API에서 기본으로 제공하는 response의 데이터를 그대로 저장할 수 있도록 field를 구성했다. 다만 date의 경우 생성되는 시점으로 잡는다.

CoinPrice serializer & view & urls.py

coin/serializers.py
serializer의 경우 아주 간단하다.

#coin/serializers.py
class CoinPriceSerializer(serializers.ModelSerializer):

    class Meta:
        model = CoinPrice
        fields = '__all__'


#coin/views.py

from rest_framework import generics, serializers
from .models import Coin, CoinPrice
from .serializers import CoinPriceSerializer

class CoinPriceView(generics.ListAPIView):
    queryset = CoinPrice.objects.all().order_by('-date')
    serializer_class = CoinPriceSerializer


# coin/urls.py
from django.urls import path, include
from rest_framework import urlpatterns
from .views import *

urlpatterns = [
    path('coin', CoinPriceView.as_view(), name='coin'),
]

설명은 생략한다.

Task를 통해서 데이터 적재하기

우선 coin/utils.py를 생성하고 거기에 함수를 하나 만든다.

# coin/utils.py

import requests

def get_coin_price(ticker):
    url = f'https://api.bithumb.com/public/ticker/{ticker}_KRW'
    response = requests.get(url)
    data = response.json()
    return data
    
# coin/tasks.py
@shared_task
def get_coin_data(ticker):
    data = get_coin_price(ticker)
    coin, already = Coin.objects.get_or_create(ticker=ticker)
    data['data']['coin'] = coin
    if data['status'] == '0000':
        CoinPrice.objects.create(**data['data'])

utils.py에 함수를 만들어 두고, 전 글에서 작성한 task를 위와 같이 수정한다.
이렇게까지 수정을 하고서 서버를 켜보면 celery log가 계속 나올 것이고, CoinPrice api로 get을 보내보면 데이터가 적재되고 있는 것이 보일 것이다.

마무리

데이터가 적재되는 것을 보고나서 잠시 task를 주석처리해서 꺼두었다. 아직 모델링이 완료되지 않았기에 의미없이 쌓아도 쓸 데가 없고, 성공적으로 쌓이는 것을 확인한 것에 의의를 둔다.

다음 글에서는 프로젝트의 핵심이 될 거래 부분의 모델링을 진행한다.

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글