Develop/Django

[Django Rest Framework] To Do List

Gr00t 2021. 3. 16. 18:44

DRF로 To Do List 앱 제작

Django Rest Framework를 사용해 REST API 형태의 To do list 앱을 위한 백엔드 서버를 제작한다.

이후 React를 사용해 만든 프론트 엔드와 연동할 예정이다.


프로젝트 설정

먼저 가상 환경을 설정한다. 여기서는 PyCharm에서 Conda를 사용해 설정해주었다.

1️⃣ Django 설치

다음으로 장고를 설치해준다.

$ pip install django

2️⃣ 프로젝트 생성

장고를 설치했으면 이제 장고 명령어를 통해 프로젝트를 생성한다.

$ django-admin startproject django_rest

생성하면 다음과 같이 기본적인 프로젝트 구성이 완료된다. 여기다 앱을 만들어 추가해보도록 하자.

3️⃣ 앱 생성

프로젝트 폴더로 이동한다.

$ cd django_rest/

manage.py를 사용해 앱을 생성한다.

django_rest$ python manage.py startapp todos

앱은 프로젝트 내부에 생성되며 앱 이름을 폴더로 그 하위에 아래와 같이 기본적으로 구성된다.

4️⃣ 프로젝트에 앱 추가

장고는 앱을 만들면 프로젝트에 추가해줘야한다.

프로젝트를 만들며 기본적으로 생성된 django_rest폴더에 settings.py로 들어가 앱을 추가해주도록 하자. INSTALLED_APPS에 생성한 앱 이름을 추가해주고 저장한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'todos' # 추가한 앱 이름
]

5️⃣ Rest Framework 설치

여기까지는 Django 앱을 만드는 순서와 같다. 여기다 REST framework를 추가해주면 된다.

이제 Rest framework를 설치하자.

$ pip install djangorestframework

Rest framework도 앱처럼 장고 설정에 추가해야한다. 앱 추가랑 같은 방법으로 추가해주도록 한다.

INSTALLED_APPS = [
		'rest_framework', # 추가한 rest framework
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'todos' # 추가한 앱 이름
]
# 새로 추가할 내용
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}

6️⃣ 서버 동작 확인

환경 구성을 제대로 했다면 프로젝트 폴더로 올라와 서버를 실행했을때 아래와 같은 화면이 나와야한다. 나오지 않는다면 빠진 부분이 없는지 체크해보자.

$ python manage.py runserver

이제 To do list 앱을 만들 준비가 모두 끝났다.

앱을 만들어보도록 하자.


todos 앱 만들기

앱을 만드는 방식도 그냥 장고 앱을 만드는 것과 기본적인 내용은 동일하다.

  • 데이터를 저장할 model을 생성하고
  • 화면으로 보여질 view를 작성하고
  • 외부와 연결될 url을 생성하고 프로젝트 url에 포함시킨다.

여기서 json형식으로 반환될 수 있도록 model을 직렬화(serializer)하는 것과 view를 작성하는 방식이 조금 다르다.

1️⃣ 모델 생성

데이터를 관리하기 위해서 먼저 models.py에 데이터를 담을 클래스를 생성한다.

  • 기본키로 사용하기 위해 id는 AutoField를 사용
  • 할 일을 기록하는 title은 50글자까지 허용
from django.db import models


class Todo(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50)

생성한 모델을 적용하기위해서 migration해준다.

$ python manage.py makemigrations
$ python manage.py migrate

2️⃣ 직렬화 추가

데이터를 JSON형식으로 전달하기 위해서 데이터를 직렬화해주는 클래스를 정의한다.

serializer.py를 생성하고 아래 내용을 추가한다. serializer는 여러 종류가 있으니 공식 문서를 참고해 결정하면 된다. 여기서는 기본적으로 사용되는 ModelSerializer를 사용했다.

Todo모델에서 가지고 있는 idtitle을 필드로 전달해준다.

from rest_framework import serializers
from .models import Todo

class TodoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Todo
        fields = ['id', 'title']
🌏
여기서 직렬화란 클래스 형식으로 작성된 데이터를 통신에 적합한 형태로 재구성해주는 것을 말한다.

3️⃣ 뷰 추가

화면으로 데이터를 전달하는 함수를 작성한다.

뷰를 작성하는 방법은 다양하다. 크게 클래스 기반 뷰(CBV)함수 기반 뷰(FBV)로 나뉘는데 여기서는 직관적인 이해를 위해 함수 기반 뷰로 작성하도록 하겠다.

  • @api_view는 FBV에 대한 표시이며 인자로 API의 operator을 받는다.
  • serializer를 통해 직렬화한 데이터의 경우 is_valid함수를 통해서 확인하는 과정이 없으면 저장할 수 없다. 반드시 is_valid로 확인해줘야 한다.
  • Response를 사용해 직렬화한 데이터를 전달한다.

    ❗rest framework에서 새로 import한 함수로 기존 Response와 다르다.

함수는 기본적인 CRUD에 해당하는 함수만 작성했다.

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializer import TodoSerializer
from .models import Todo


@api_view(["GET"])
def todolist(req):
    todos = Todo.objects.all()
    serializer = TodoSerializer(todos, many=True)
    return Response(serializer.data)


@api_view(["POST"])
def todocreate(req):
    serializer = TodoSerializer(data=req.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors)


@api_view(["DELETE"])
def tododelete(req, pk):
    todo = Todo.objects.get(id=pk)
    todo.delete()
    return Response("Delete Success")


@api_view(["PUT"])
def todoupdate(req, pk):
    todo = Todo.objects.get(id=pk)
    serializer = TodoSerializer(todo, data=req.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors)

4️⃣ URL 추가

url에 맞춰 뷰를 호출하기 위해서 urls.py를 생성하고 패턴을 추가한다.

from django.urls import path
from .views import *

urlpatterns = [
    path('', todolist, name='list'),
    path('create/', todocreate, name='create'),
    path('update/<str:pk>/', todoupdate, name='update'),
    path('delete/<str:pk>/', tododelete, name='delete')
]

만든 앱이 프로젝트에서 동작하기위해서 프로젝트의 urls.py에 추가해야한다.

원래대로라면 앱이름을 path에 추가하지만 지금은 앱이 하나밖에 없으므로 path를 ('')으로 두었다. 나중에 앱이 더 추가된다면 저 부분에 앱 이름을 추가하면 된다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('todos.urls')) # 앱 url 추가
]

5️⃣ 동작 확인

Rest API로 동작하는 앱을 작성했다. 프로젝트 폴더로 올라가 서버를 실행시키고 CRUD가 다 제대로 동작하는지 확인하도록 하자.

프로젝트 폴더에서 서버를 실행한다.

$ python manage.py runserver

서버가 실행되면 localhost:8000을 통해서 접근이 가능해진다.

todolist 동작 확인

접속해보면 아래와 같이 리스트를 출력하는 것을 볼 수 있다. 아직 아무런 데이터도 넣지 않았기때문에 빈 리스트가 반환되는데 여기에 api_view를 통해 작성한 함수들로 데이터를 관리할 수 있다.

todocreate 동작 확인

데이터가 아무것도 없으니 일단 localhost:8000/create로 접속해 데이터를 추가해보도록 하자.

데이터를 추가할 때는 모델에 적용한 데이터 형식을 JSON형식으로 입력해주면 된다. 입력 후 POST를 눌러 서버에 데이터를 전송한다.

다시 localhost:8000으로 돌아가면 create명령이 제대로 수행됐음을 알 수 있다.

tododelete 동작 확인

데이터를 추가해 총 3개의 데이터가 있다. localhost:8000/delete 명령으로 2번째 할 일을 삭제해보자.

접속해보면 위와 같은 페이지가 뜨고 DELETE버튼을 누르면 한 번 더 확인한 뒤에 삭제를 진행한다.

이전 데이터와 비교해보면 delete명령이 제대로 동작했음을 알 수 있다.

todoupdate 동작 확인

마지막으로 수정을 확인하도록 하자. 첫번째 할 일 다음에 세번째 할 일이 위치한게 조금 불편하니 두번째로 수정해보도록 한다.

localhost:8000/update/3으로 들어가보면 아래 쪽에 데이터를 넣어 수정이 가능하다. 그곳에 수정할 데이터를 넣고 PUT버튼을 눌러서 서버에 전송한다.

이전 데이터와 다시 비교해보면 update함수가 제대로 동작했음을 알 수 있다.

'Develop > Django' 카테고리의 다른 글

Django - To Do List 만들기  (0) 2021.02.01
Django - APP 만들기  (0) 2021.01.15
Django 설치  (0) 2021.01.15