우선 배달 애플리케이션을 만들기 위한 django프로젝트를 만들어 보겠습니다.
$django-admin startproject fastcampus
으로 프로젝트를 만들고 바로 주문을 위한 order앱을 그 안에 만들어 보겠습니다.
$python manage.py startapp order
그리고 order에서 models.py를 수정하겠습니다.
/fastcampus/order/models.py
from django.db import models
# pk는 자동으로 생성된다.
class Shop(models.Model):
shop_name = models.CharField(max_length=20)
shop_address = models.CharField(max_length=40)
# 이렇게 하면 Menu에는 1번 sho에 해당하는 많은 음식 메뉴들이 있을 것이다.
class Menu(models.Model):
shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
food_name = models.CharField(max_length=20)
class Order(models.Model):
shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
order_date = models.DateTimeField('date ordered')
address = models.CharField(max_length=40)
# 일단 estimated_time의 defualt값은 -1인데 가게 사장님이 예상 소요시간을 입력하지 않았기 때문
estimated_time = models.IntegerField(default=-1)
delever_finish = models.BooleanField(default=0)
class Orderfood(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
food_name = models.CharField(max_length=20)
다음과 같이 크게 4개의 Model을 만들었습니다. Shop은 가게의 이름, 가게의 주소를 나타내기 위한 모델입니다. Menu는 가게를 외래키로서 음식의 이름도 함께 저장합니다. 그리고 Order는 Shop을 외래키로 해서, 주문날짜, 배달 주소, 소요시간, 배달이 완료되었는지를 나타내는 필드를 저장합니다. 그리고 Orderfood는 원래 Order에 들어가도 되지만 그냥 보기 좋게 분리했습니다. Orderfood에는 외래키로 Order로 하고, 배달할 음식 이름을 저장하도록 했습니다.
이 다음에 makemigration을 하고 migrate를 하는 명령어를 쳐주도록 하겠습니다.
$python manage.py makemigrations
$python manage.py migrate
REST API
이제 django에서 rest api을 위한 setting을 해주도록 하겠습니다.
이를 위해 일단 djangorestframework라는 python모듈을 anaconda 가상환경에 설치해 주도록 하겠습니다.
/fastcampus/settings.py
...
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'order',
'rest_framework',
]
...
/fastcampus/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('order/', include('order.urls')),
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
이렇게 기본 rest API를 위한 셋팅이 끝났습니다.
다음 단계로 Shop을 serialize를 진행해 보도록 하겠습니다.
/fastcampus/order/serializer.py
from rest_framework import serializers
from order.models import Shop, Menu, Order, Orderfood
class ShopSerializer(serializers.ModelSerializer):
class Meta:
model = Shop
fields = '__all__'
이렇게ShopSerializer를 만들어 주었습니다. 왜 Serialize를 해야 하냐면 결국엔 json으로 객체를 나타내기 위함입니다. ShopSerializer를 통해 Shop객체를 객체화 할 수 있습니다. 여기에서는 fields는 그냥 모든 필드를 대상으로 Serialize시킨다고 명시했습니다.
그다음엔 order의 view.py파일에 /order/shops로 GET/POST요청이 들어왔을 떄 처리해줄 로직을 작성해 주도록 하겠습니다.
/fastcampus/order/views.py
from django.shortcuts import render
from order.models import Shop, Menu, Order, Orderfood
from order.serializer import ShopSerializer
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
# Shop객체들을 다 serialize한 결과를 json으로 parsing해서 json형태로 이를 반응하겠다
@csrf_exempt
def shop(request):
if request.method == 'GET':
shop = Shop.objects.all()
serializer = ShopSerializer(shop, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = ShopSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
GET요청이 들어오면 Shop의 객체를 다 가져와서 Serialize시키고, JSON으로 response를 쏴주었습니다. 그리고 POST요청이 들어오면 body의 객체를 JSON으로 파싱하고 Serialize해서 테이블 데이터로 변환한 다음에 이 값이 유효한 경우에만 JSON으로 response를 쏴주 었습니다.
그리고 이를 urls.py에 삽입시켜 주도록 하겠습니다.
/fastcampus/order/urls.py
from django.urls import path
from order import views
urlpatterns = [
path('shops/', views.shop),
]
이제 다 만들어 진 거 같으니까 Shop테이블에 shop_name, shop_address필드를 POST요청으로 삽입하고, GET으로 조회하는 걸 Postman으로 진행해 보도록 하겠습니다.
django서버를 실행시켜주고 다음 값을 넘겨주어 값을 삽입시켜주었습니다. 이 외에도 임의의 값을 넣어서 총 2개를 추가시켜 주었습니다.
그리고 이를 GET으로 받아보면 정확히 Shop테이블에 삽입된 것을 확인할 수 있습니다.
그 다음 포스팅에서는 백엔드를 추가로 개발하고 Menu도 Shop과 같이 Serializer를 만들고 로직을 작성해 보도록 하겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Order백엔드 개발 2 (0) | 2022.06.29 |
---|---|
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Order백엔드 개발 1 (0) | 2022.06.29 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Django 기초 - 3 (0) | 2022.06.28 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Django 기초 - 2 (0) | 2022.06.28 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Django 기초 - 1 (0) | 2022.06.28 |