Django REST Framework는 Django 기반으로 REST API 서버를 만들기 위한 라이브러리
API는 다양한 플랫폼의 백엔드 서비스를 위해 JSON과 같은 규격화된 데이터를 제공한다. 즉 Django REST Framework를 사용하면 기존의 템플릿 태그를 사용해서 자체 웹 템플릿에게 데이터를 전달해주었던 한정적인 방식에서 벗어나 JSON과 같은 양식으로 다양한 플랫폼의 클라이언트에게 데이터를 제공할 수 있는 API 서버를 만들 수 있는 것
개념 실습을 위한 Book API 서버 구축하기
python3 -m venv env
source env/bin/activate
가상환경이 활성화되면 위 화면처럼 터미널에서 확인가능하다
터미널에 명령어 입력
pip install django
django-admin startproject bookApi .
프로젝트 생성 명령어 사용 시 마지막에 .
붙여주면 현재 디렉터리 위치에 장고 프로젝트 설정한다. 마침표 사용하지 않으면 현재 위치 기준 아래에 프로젝트를 생성하기 때문에 cd로 이동해줘야 함
장고 설치 시와 동일하게 pip 명령어 사용하여 설치하며 이후 settings.py에 앱을 등록해준다.
pip install djangorestframework
example이라는 이름의 앱을 하나 생성
python manage.py startapp example
프로젝트의 settings.py에 앱을 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 추가
'example' # 추가
]
마이그레이션 과정을 통하여 데이터베이스를 동기화
python manage.py migrate
DRF 프로젝트의 기본 구조 파악하기
현재 예제는 모델이 존재하지 않기 때문에 뷰 먼저 생성한다
example/views.py
from rest_framework import viewsets, permissions, generics, status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.decorators import api_view
@api_view(['GET'])
def helloAPI(request):
return Response("hello, world!")
@api_view(['GET'])
@
와 함께 작성된 코드를 데코레이터 라고 합니다. 말 그대로 함수를 꾸미는 역할을 한다. helloAPI라는 함수가 HTTP GET 요청을 받는 API라는 것을 @api_view라는 표기법으로 나타낸다.
[ 데코레이터 ]
함수를 감싸는 일종의 wrapper이다. 작성한 함수의 앞 뒤에 어떠한 기능을 덧붙여서 함수를 포함하는 함수 형태로 만드는 것
즉, 데코레이터는 함수를 인자로 받는 하나의 함수이다. 위 코드의 helloAPI()
는 단순히 응답을 반환하는 함수인데, 이 함수가 API로 동작하기 위해서 앞뒤로 전후처리 코드를 덧붙여서 실제로 API로 동작할 수 있도록 @api_view(['GET'])
데코레이터로 함수를 감싼 것이다.
request
객체
DRF API 서버로 전송된 요청에 대한 정보를 담고 있는 객체이다. 예를 들어 해당 요청이 어떤 타입인지 (GET, POST, DELETE 등), 사용자가 요청을 보낼 때 어떤 데이터를 함께 전송했는지를 담고 있다. 즉, 사용자 요청에 관한 정보를 사용하고자 할 때 request를 활용하면 된다.
예를 들어 request.method
를 사용하면 요청의 타입을 알 수 있고, request.data
를 사용하면 사용자가 전송한 데이터를 알 수 있다.
Response
클래스
DRF의 결과 반환 방식. 응답에 대한 정보를 저장한다. response.data
에는 응답에 포함되는 데이터, response.status
는 응답에 대한 상태가 나타난다.
url 연결해준다~
bookAPI/urls.py
# 프로젝트에 대한 url 설정
urlpatterns = [
path('admin/', admin.site.urls),
path('example/', include('example.urls'))
]
example/urls.py
# example 앱에 대한 url 설정
from django.urls import path, include
from .views import helloAPI
urlpatterns = [
path("hello/", helloAPI)
]
python manage.py runserver
설정 끝내고 서버 시작하면 아직 페이지를 지정하지 않아서 404 에러 발생한다. 즉 /
경로에 대한 url을 설정하지 않았기 때문에 페이지를 찾을 수 없다고 하는 것
admin은 관리자 페이지니까 이는 제외하고 프로젝트의 URL 중 설정이 되어 있는 example/
로 이동해본다
http://127.0.0.1:8000
경로를 읽고 DRF API 서버로 이동
DRF API 서버에서 내부에서 example/
경로에 대한 자원을 찾기 위해 프로젝트의 urls.py를 확인한다.
2-1. 해당 경로에 대한 자원 ( include("example.urls")
) 을 발견
2-2. include("example.urls")
: 다른 URL 설정을 포함한다.
2-3. example.urls
: example 앱의 URL 설정들을 의미한다
example 앱의 URL 설정을 확인한다.
example 앱의 URL 설정에는 /
경로에 대한 자원이 정의되어 있지 않다.
404 에러
그렇다면 현재 example 앱의 URL 설정에 정의되어 있는 hello 경로로 이동해본다.
hello/
경로에 대한 자원을 찾는다.Response로 문자열 주니까 그것만 출력된다.
DRF는 Response를 제공하는 API의 형태로 결과물이 생성된다. 즉, Pure Django처럼 템플릿의 형태를 반환하는 것이 아니라 JSON 형태의 응답을 제공한다는 것.
그렇다면 사용자에게 화면을 보여주기 위해서 필요한 템플릿이 없다는 뜻인데, 기존에 뷰에서 템플릿으로 데이터를 전달했던 것처럼 사용자에게 데이터 처리가 된 화면을 보여주기 위해서 다른 무언가가 필요하다. DRF에서는 Serializer가 기존의 템플릿 역할을 수행하게 된다
Serialize는 직렬화하는 것을 의미한다. 이를 DRF의 관점에서 보면 직렬화는 Django 프로젝트에서 생성한 모델로부터 추출한 모델 인스턴스를 JSON 타입으로 바꾸는 것을 말한다.
DRF 내에서 데이터를 저장할 때에는 Django의 모델을 통하여 저장한다. Django 모델은 파이썬 객체이기 때문에 이 모델 데이터를 아무 처리를 하지 않고 다른 클라이언트에게 그대로 전달하면 상대 클라이언트는 자신이 알지 못하는 파이썬 객체를 받게 되는 것이다.
따라서 파이썬 객체 데이터를 문자열로 직렬화하여 (JSON은 문자열이니까) 클라이언트에게 전달하는 것
반대로 클라이언트로부터 데이터를 전달받는 경우는 위의 경우와 반대 작업을 수행하면 된다. 클라이언트가 보낸 직렬화된 데이터 ( = 문자열 = JSON)를 받아서 역직렬화 하는 과정을 거쳐 파이썬 객체 데이터로 변환하면 된다.
DRF Serializer는 이러한 직렬화와 역직렬화 기능을 제공한다.