[Django] 서버의 DB를 RESTful API로 접근하기: Django-rest-framework

2022. 8. 25. 12:40Back-end/Django

반응형

Django-rest-framework

  • RESTful API에 해당합니다.
  • Model-View-Controller(MVC) 패턴을 따릅니다.

RESTful API

  • REST의 원리*를 따르는 API입니다.
    * HTTP URI/ HTTP Method/ HTTP message pay load

  • REST API의 설계 규칙을 지켜야 합니다.
    1. URI는 정보의 자원을 표현해야 합니다.
    2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현해야 합니다.

Django-rest-framework 사용하기

1. Django-rest-framework를 설치합니다.

pip install djangorestframework


2. Django 프로젝트와 앱을 생성합니다.

3. settings.py에 다음을 추가합니다.

INSTALLED_APPS = [
    ...
    'rest_framework',  # REST API
    '앱 이름',
    ...
]


4. 터미널에서 마이그레이션을 진행합니다.

python manage.py makemigrations
python manage.py migrate

4-1. http://127.0.0.1:8000/admin에 로그인 할 슈퍼유저도 생성해줍니다.

python manage.py createsuperuser


5. models.py에 다음을 추가합니다. 데이터베이스 모델 'Person'은 name과 age, id로 구성됩니다. id는 기본키로 자동 할당되며 name은 char, age는 int 데이터를 입력해야 합니다.

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=50)
    age = models.IntegerField()

    def __str__(self):
        return self.name


6. 앱 폴더의 하위에 serializers.py를 생성하고 다음을 추가합니다. serializer는 데이터베이스 모델 및 queryset을 JSON, XML 등의 형태로 변환해줍니다.

from dataclasses import field
from rest_framework import serializers
from .models import Person

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = '__all__'


7. views.py에 다음을 추가합니다. API의 동작을 구현하는 단계입니다.
APIView에는 Classs-Based-View(CBV)와 Function-Based-View(FBV)가 있으며 아래의 예제에서는 CBV로 구현하였습니다.
GET 요청을 받으면 우선 Person.objects.all()로 모든 데이터를 가져옵니다. 이후 PersonSerializer로 이 데이터를 JSON 형식으로 변환합니다. 변환된 데이터는 REST API 형식의 Response로 반환합니다.
GET뿐만 아니라 POST, PUT, DELETE 등도 구현 가능합니다.

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Person
from .serializers import PersonSerializer

class PersonListAPI(APIView):
    def get(self, request):
        queryset = Person.objects.all()
        serializer = PersonSerializer(queryset, many=True)
        return Response(serializer.data)


8. "프로젝트 폴더"/ urls.py를 다음과 같이 수정합니다.

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

from "앱 이름".views import PersonListAPI

urlpatterns = [
    path('admin/', admin.site.urls),
    
    # API - URL 맵핑
    path('api/person/', PersonListAPI.as_view()),
]


9. 데이터를 http://127.0.0.1:8000/admin에서 추가하기 쉽게하기 위해서 admin.py를 다음과 같이 수정합니다. Person 모델을 관리자 사이트에서 직접 수정할 수 있습니다.

from django.contrib import admin
from .models import Person

admin.site.register(Person)


10. 5번에서 모델을 새로 정의하였기 때문에 마이그레이션을 진행해줍니다.

python manage.py makemigrations "앱 이름"
python manage.py migrate "앱 이름"


11. 서버를 실행하고 http://127.0.0.1:8000/admin 으로 이동합니다.

python manage.py runserver


12. Person을 추가하기 위해 Add 버튼을 클릭합니다.


13. 데이터를 추가하고 저장합니다.

14. http://127.0.0.1:8000/api/person/ 으로 이동하여 model이 JSON으로 변환된 모습을 확인합니다. GET 요청 시 JSON 형식으로 데이터를 받을 수 있습니다.


반응형