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
모델에서 가지고 있는 id
와 title
을 필드로 전달해준다.
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함수가 제대로 동작했음을 알 수 있다.
Uploaded by Notion2Tistory v1.1.0