Django REST Framework 개요

김주언·2022년 7월 3일
0

Django

목록 보기
5/9
post-thumbnail

Django REST Framework 개요

Django REST Framework는 Django 기반으로 REST API 서버를 만들기 위한 라이브러리

API는 다양한 플랫폼의 백엔드 서비스를 위해 JSON과 같은 규격화된 데이터를 제공한다. 즉 Django REST Framework를 사용하면 기존의 템플릿 태그를 사용해서 자체 웹 템플릿에게 데이터를 전달해주었던 한정적인 방식에서 벗어나 JSON과 같은 양식으로 다양한 플랫폼의 클라이언트에게 데이터를 제공할 수 있는 API 서버를 만들 수 있는 것

Django REST Framework 예제 프로젝트

1. 프로젝트 Setup

개념 실습을 위한 Book API 서버 구축하기

1.1 가상환경 생성

  • 파이참 프로젝트 생성 시 virtaul env 선택
  • 또는 명령어 사용
    python3 -m venv env
    source env/bin/activate

가상환경이 활성화되면 위 화면처럼 터미널에서 확인가능하다

1.2 Django 설치 후 Django 프로젝트 생성

터미널에 명령어 입력

pip install django
django-admin startproject bookApi .

프로젝트 생성 명령어 사용 시 마지막에 . 붙여주면 현재 디렉터리 위치에 장고 프로젝트 설정한다. 마침표 사용하지 않으면 현재 위치 기준 아래에 프로젝트를 생성하기 때문에 cd로 이동해줘야 함

1.3 Django REST framework 설치 및 실행

장고 설치 시와 동일하게 pip 명령어 사용하여 설치하며 이후 settings.py에 앱을 등록해준다.

pip install djangorestframework

1.4 django 프로젝트 내부에 앱 생성

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'		   # 추가
]

1.5 마이그레이션

마이그레이션 과정을 통하여 데이터베이스를 동기화

 python manage.py migrate


2. 프로젝트 구조 파악

DRF 프로젝트의 기본 구조 파악하기

2.1 helloAPI 생성

현재 예제는 모델이 존재하지 않기 때문에 뷰 먼저 생성한다

뷰 생성

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는 응답에 대한 상태가 나타난다.

URLs

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/ 로 이동해본다


  1. http://127.0.0.1:8000 경로를 읽고 DRF API 서버로 이동

  2. DRF API 서버에서 내부에서 example/ 경로에 대한 자원을 찾기 위해 프로젝트의 urls.py를 확인한다.
    2-1. 해당 경로에 대한 자원 ( include("example.urls") ) 을 발견
    2-2. include("example.urls") : 다른 URL 설정을 포함한다.
    2-3. example.urls : example 앱의 URL 설정들을 의미한다

  3. example 앱의 URL 설정을 확인한다.

  4. example 앱의 URL 설정에는 / 경로에 대한 자원이 정의되어 있지 않다.

  5. 404 에러

그렇다면 현재 example 앱의 URL 설정에 정의되어 있는 hello 경로로 이동해본다.


  1. example 앱의 URL 설정에서 hello/ 경로에 대한 자원을 찾는다.
  2. 해당 경로에 대한 자원이 helloAPI인데, 이는 뷰파일에서 import된 것이다.
  3. view 파일을 확인해보면, 찾은 자원인 helloAPI는 GET요청과 매핑되어있다.
  4. 현재 메소드가 HTTP GET이기 때문에 helloAPI와 일치한다.
  5. helloAPI 실행

Response로 문자열 주니까 그것만 출력된다.


Django와의 차이점?

DRF는 Response를 제공하는 API의 형태로 결과물이 생성된다. 즉, Pure Django처럼 템플릿의 형태를 반환하는 것이 아니라 JSON 형태의 응답을 제공한다는 것.

그렇다면 사용자에게 화면을 보여주기 위해서 필요한 템플릿이 없다는 뜻인데, 기존에 뷰에서 템플릿으로 데이터를 전달했던 것처럼 사용자에게 데이터 처리가 된 화면을 보여주기 위해서 다른 무언가가 필요하다. DRF에서는 Serializer가 기존의 템플릿 역할을 수행하게 된다

DRF Serializer

Serialize는 직렬화하는 것을 의미한다. 이를 DRF의 관점에서 보면 직렬화는 Django 프로젝트에서 생성한 모델로부터 추출한 모델 인스턴스를 JSON 타입으로 바꾸는 것을 말한다.

DRF 내에서 데이터를 저장할 때에는 Django의 모델을 통하여 저장한다. Django 모델은 파이썬 객체이기 때문에 이 모델 데이터를 아무 처리를 하지 않고 다른 클라이언트에게 그대로 전달하면 상대 클라이언트는 자신이 알지 못하는 파이썬 객체를 받게 되는 것이다.
따라서 파이썬 객체 데이터를 문자열로 직렬화하여 (JSON은 문자열이니까) 클라이언트에게 전달하는 것

반대로 클라이언트로부터 데이터를 전달받는 경우는 위의 경우와 반대 작업을 수행하면 된다. 클라이언트가 보낸 직렬화된 데이터 ( = 문자열 = JSON)를 받아서 역직렬화 하는 과정을 거쳐 파이썬 객체 데이터로 변환하면 된다.

DRF Serializer는 이러한 직렬화와 역직렬화 기능을 제공한다.

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글