개발환경

Mac + Visual Studio Code + Python 3.10.5

 

django REST framework를 사용해 구현할 때 핵심은 Serializer 이다.

django 내부의 복잡한 로직을 Serializer가 간단하게 구현해준다.

 

 

백엔드 API를 구현할 때 구현한 서버는 사용자와 정보를 주고 받아야 하고 정보를 주고 받을때 사용되는 통일된 규칙을 JSON이라고 한다.

백엔드 서버는 사용자로 부터 요청을 받으면 데이터베이스에서 정보를 꺼내와 JSON형태로 프론트엔드로 건내주거나

혹은 사용자로부터 JSON을 받아 데이터베이스에 추가하는 식으로 작동한다.

 

장고에서 데이터베이스에 접근하고 관리할 때에는 model이라는 클래스를 만들어 사용한다.

model 클래스와 메소드 덕분에 따로 SQL문을 배우지 않아도 장고는 데이터베이스를 쉽게 관리할 수 있다.

 

그리고 Serializer은 model 클래스와 JSON을 연결해주는 도구라고 생각하면 될 것 같다.

JSON -> model로 혹은 반대인 model-> JSON으로 변경을 쉽게 할 수 있도록 해준다.

 

 

Serializer 사용법

1. 생성

Serializer 생성을 위해선 우선 데이터베이스를 관리할 model 클래스부터만들어야 한다.

앱 파일의 models.py 에서 간단한 예시를 만들어 봤다. (모델 생성후 migration을 잊지 말자)

from django.db import models

class Student(models.Model):
	name = models.CharField(max_length=20)
    number = models.CharField(max_length=30)
    grade = models.IntegerField(default = 1)

 

생성을 하고 간단하게 사용하기 위해선 장고 앱 파일 속에 serializers.py 라는 파일을 생성하고 내용을 작성한다.

from rest_framework import serializers
from app.models import Student

class StudentSerializer(serialiers.Serializer):
	class Meta:
    	model = Student
        fields = ['name', 'number', 'grade']

 

2. 사용

이렇게 생성된 Serializer 은 아까 말했던 것 처럼 크게 두 가지의 일을 수행할 수 있다.

첫번째는 사용자에게 JSON을 받아와 model 클래스(Student)로 바꿔 데이터 베이스를 관리

두번째는 데이터 베이스의 정보인 Student를 JSON으로 바꿔 사용자에게 전송

 

이 과정은 views.py에서 이루어진다.

 

1) 사용자 -> 서버

data = JSONParser().parse(request)
serializer = StudentSerializer(data = data)
serializer.save()

 2)서버 -> 사용자

obj = Student.object.get(name = 'kim') #이름이 kim인 Student
serializer = StudentSerializer(obj)
JsonResponse(serializer.data, option)

3) 수정 및 삭제

#수정
obj = Student.object.get(name='kim')
data = JSONParser().parse(request)
serializer = StudentSerializer(obj, data = data)
serializer.save()

#삭제
obj = Student.object.get(name='kim')
obj.delete()

 

 

3. 사용 예시

 

urls.py(프로젝트 파일)

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app.urls')), #앱 파일의 urls.py에 연결
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

 

urls.py (앱 파일)

from django.urls import path
from . import views

urlpatterns = [
    path('students',views.student_list), #학생 목록 읽기, 학생 추가
    path('students/<int:pk>',views.student) #개별 학생 목록 읽기, 수정, 삭제
]

 

 

views.py

from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from app.models import Student 	# 앱파일의 models.py
from app.serializers import StudentSerializer # 앱 파일의 serializesr.py

# Create your views here.

@csrf_exempt
def student_list(request):
    if request.method == 'GET': # 학생 목록 읽기
        query_set = Student.objects.all()
        serializer = StudentSerializer(query_set,many = True)
        return JsonResponse(serializer.data, safe = False)

    elif request.method == 'POST': # 학생 새로 추가
        data = JSONParser().parse(request)
        serializer = StudentSerializer(data = data)
        if serializer.is_valid(): #serializer
            serializer.save()
            return JsonResponse(serializer.data, status=200)
        else:
            return JsonResponse(serializer.error, status=400)

@csrf_exempt
def student(request,pk):
    if request.method == 'GET':
        obj = Student.objects.get(pk = pk)
        serializer = StudentSerializer(obj)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'PUT':
        obj = Student.objects.get(pk = pk)
        data = JSONParser().parse(request)
        serializer = StudentSerializer(obj,data = data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=200)
        else:
            return JsonResponse(serializer.error, status=400)

    elif request.method == 'DELETE':
        obj = Student.objects.get(pk=pk)
        obj.delete()
        return HttpResponse(200)

사용 예시에서 설명을 안 했던 부분을 간단하게 짚자면

@csrf_exempt는 사용자가 마음대로 데이터베이스에 접근하는 것을 막기 위한 csrf 보안을 무시하는 명령어로

POST, PUT 메소드를 사용하는 함수 앞에 붙여서 사용해야한다.(없으면 오류가 생긴다)

 

 

serializer.is_valid()는 serializer.save()를 사용하기 전에 반드시 확인해봐야 한다고

공식 문서에 나와있는데 사실 왜 하는지는 아직 잘 모르겠다.

더 공부 해봐야겠다.

 

 

저렇게 코드를 구성한 후 'Insomnia'를 이용해 JSON을 전송해보면 제대로 작동해서

HTTP 메소드(GET, POST, PUT, DELETE)와 JSON을 이용해 데이터베이스를 관리하는 아주 간단한 REST API가 만들어졌다.

 

이번 연습 프로젝트는 https://grape-blog.tistory.com/14?category=473970 이 블로그를 참고했고

Insomnia 에 대한 자세한 사용법도 알려주고 있다.

+ Recent posts