작성자 | 이재영 |
일 시 | 2024. 3. 21 (목) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 |
목차
- REST API 란?
- DRF (Django Rest Framework)
- Viewset로 CRUD 구현
REST API 란?
REST API : Representational State Transfer API의 약자로 REST 기반으로 만들어진 API를 의미한다.
그렇다면 REST란 무엇일까?
REST 란?
- 정의 : 자원의 표현에 의한 상태 전달을 말하며, 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미한다.
- 네트워크 상에서 CS 사이의 통신 방식 중 하나이다.
- 기본적으로 HTTP 프로토콜을 사용하고 URI를 통해 자원을 명시하고, Method를 통해 자원에 대한 CRUD Operation을 적용한다.
CRUD Opertaion 이란?
- 정의 : 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 말한다.
- 동작예시 및 Method
- Create : 데이터 생성(POST)
- Read : 데이터 조회(GET)
- Update : 데이터 수정(PUT, PATCH)
- Delete : 데이터 삭제(DELETE)
자원 : 해당 소프트웨어가 관리하는 모든 것. 예) 문서, 그림, 데이터 등등
자원의 표현 : 그 자원을 표현하기 위한 이름
API 란?
- 정의 : Application Programming Interface 의 약자로 컴퓨터나 컴퓨터 프로그램 사이의 연결 및 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다.
DRF (Django Rest Framework)
DRF : Django 안에서 REST API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리이다.
장점
- 쉬운 직렬화 : Django와 ORM 모델과 호환되는 기능을 제공하여 복잡한 데이터 유형을 JSON 또는 XML로 쉽게 렌더링 할 수 있다.
- 강력한 보안 : 사용자 인증과 권한 관리를 위한 시스템을 제공하여 토큰 기반 인증, 세션 기반 인증 등으로 강력한 보안을 제공한다.
- 편한 디버그 : Browsable API 인터페이스를 통해 개발자는 웹 브라우저에서 API를 탐색할 수 있어서 프론트와 연결없이 작동을 테스트할 수 있다.
개발 순서
Model을 이용해 Database의 ORM을 설계하고, 이것을 Serialize한다. 그런 다음 views를 로직으로 설계하고 마지막으로 url로 매핑한다.
- models.py
- 데이터베이스를 정의하는 것으로 앞으로 직렬화하여 데이터를 관리할 필드들을 정의한다.
- serializers.py
- model에서 정의한 데이터를 JSON 또는 XML 데이터로 변환해준다.
- views.py
- serializer에서 받은 데이터를 표시해준다.
- urls.py
- view를 정의한 이후 url에 등록해주며 API를 이용할 수 있게 해준다.
자, 이제 Django에서 실제로 DRF를 사용해 Rest API를 구현해보자.
Viewset으로 CRUD 구현
APIView 클래스의 추상화 정도
APIView < Mixins < generics APIView < ViewSet
∙ APIView : 자주 쓰이는 view들의 패턴을 패턴화 시켜 최소한의 코드로 Model에 대한 view를 구현하는 방법
∙ Mixins : APIView를 상속받아서 request method 마다 직접 serializer 처리를 해주며 중복이 발생하던 부분을 미리 구현하여 재사용성을 높임
∙ generics APIView : Mixin을 상속함으로서 반복되는 내용을 더 줄인 클래스
∙ ViewSet : generics APIView를 상속받아 더욱 코드를 간소화시킨 클래스
DRF 설치
VScode 터미널에서 다음 명령어를 입력한다.
pip install djangorestframework
그리고 project/settings.py 안에 INSTALLED_APPS 안에 'rest_framework'를 작성해서 사용할 앱을 알린다.
이렇게하면 이제 DRF를 사용할 준비가 되었다.
Models
DRF 개발 순서에 맞춰서 처음으로 Model을 정의해준다.
from django.db import models
class Video(models.Model):
id = models.AutoField(primary_key=True, verbose_name="영상번호")
date = models.DateTimeField(verbose_name="영상날짜")
Video라는 클래스에 Model을 상속시켜주고 모델에 들어갈 필드들을 선언해준다. 필드에는 다양한 종류가 있는데 이는 추후에 다루도록 하겠다.
이후 마이그레이션을 진행해준다.
마이그레이션(Migration) : Model의 변경 내역을 데이터베이스에 적용시키는 장고의 방식이다.
마이그레이션을 진행할 때도 순서가 존재하는데 첫 번째로 모델 변경사항을 파일로 저장시켜야 한다.
다음 명령어를 입력하여 실행할 수 있다.
python manage.py makemigrations
다음으로 저장된 마이그레이션 파일을 토대로 자동으로 데이터베이스 스키마를 관리해주는 명령어를 실행시킨다.
명령어는 다음과 같다.
python manage.py migrate
여기까지 Django에서 마이그레이션을 진행하는 방법이다.
Serializers
다음 개발 순서로 데이터를 직렬화해주기 위해서 serializer를 선언해준다.
from rest_framework import serializers
from .models import Video
class VideoSerializer(serializers.ModelSerializer):
class Meta:
model = Video
fields = '__all__'
여기서 사용한 Serializer는 ModelSerializer인데 보통 Django에서 사용하는 것은 Serializer이다. ModelSerializer는 일반적인 Serializer에서 반복되는 번거로움을 없앤 Serializer이다.
class Meta는 모델 클래스내에 배치된 내부 클래스이다. 이 Meta 클래스를 정의하는 것으로 Django 모델의 취급 방법을 변경하는 것이 가능하다. 안에 내용을 살펴보면 model과 fields가 있는데 model은 지금 이 Serializer가 직렬화시킬 모델을 설정해주고 fields는 설정한 모델안에 어떤 필드들을 직렬화할지 골라준다. 여기서 '__all__'은 모든 필드를 직렬화 시키겠다는 의미이다.
Views
다음으로 View.py 를 수정해보겠다.
from .models import Video
from .serializers import VideoSerializer
from rest_framework import viewsets
# Create your views here.
class VideoViewSet(viewsets.ModelViewSet):
queryset = Video.objects.all()
serializer_class = VideoSerializer
코드를 보면 ModelSerializer와 비슷하게 코드가 형성되어 있는 것을 확인할 수 있다. 여기서 사용한 추상화 클래스로 ViewSet을 사용했는데 위에서 설명했다시피 반복되거나 재사용되는 코드들을 줄여 간소화시킨 클래스이다.
VideoViewSet 클래스 내부를 보면 queryset과 serializer_class 가 있다. queryset에서는 이 View에서 보여줄 모델의 오브젝트들을 받아주고 serializer_class에서는 Serializers.py에서 선언한 serializer 중 이 View에서 사용할 serializer를 받아준다.
URLs
마지막으로 url 설정이다. ViewSet을 사용해서 URL을 설정하는 방법은 크게 2가지 정도가 있지만 이번에는 router를 사용하였다.
from django.urls import path, include
from .views import VideoViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('video', VideoViewSet)
urlpatterns = [
path('', include([
path('', include(router.urls)),
])),
]
router는 자동으로 url 라우팅 해주는 기능을 가진다. 사용하는 방법은 우선 라우터 객체를 하나 생성해준 이후 register 메서드를 사용해서 viewset을 등록해준다. 여기서 'video'는 url 접두사이다. 그 이후에 urlpatterns 에 URL 패턴을 정의해주면 끝이다.
실행결과
자 이제 개발용 서버를 열어보자. 다음 코드를 터미널에 입력해보자.
python manage.py runserver
이후 웹 브라우저에 http://127.0.0.1:8000/video/ 를 입력하여 들어가보면 다음과 같은 화면을 볼 수 있다.
자, 그럼 기능이 잘 만들어졌는지 확인해보자.
CREATE - POST
id 1에 설정한 날짜 데이터도 date에 잘 들어가는 것을 확인할 수 있다.
READ - GET
링크에 /id 자원을 추가해주는 것으로 GET 기능을 확인할 수 있다. http://127.0.0.1:8000/video/1/
UPDATE - PUT
영상날짜의 값을 바꾸기 위해서 다른 날짜로 선택 후 PUT을 한 결과 값이 잘 바뀌는 것을 확인할 수 있다.
DELETE - DELETE
마지막으로 삭제까지 잘 되는 것을 확인할 수 있다.
이번 주차 모각코에서는 실제 Django BackEnd 개발 도구인 DRF를 사용하여 기본적인 모델 생성과 간단한 API를 구현해보았다. 확실히 강력한 기능들이 많은 프레임워크라는 것을 확인할 수 있었고, 남은 모각코 기간동안 다양한 API를 개발해나갈 것이다.