본문 바로가기
[Django]/Django 개념

[Djnago] Django-rest-framework 활용하여 API 서버 만들기

by 코드몽규 2022. 4. 29.
반응형

 

 

Django Rest Framework란?

  • DRF(Django Rest Framework, http://www.django-rest-framework.org)란 RESTful API 서버를 Django 안에서 쉽게 구축할 수 있도록 도와주는 오픈 소스 라이브러리이다.
  • RESTful 이란?: Representational Satate Transfer 규칙을 잘 지킴
  • REST 란 HTTP의 URL과 HTTP Method(GET, POST, PUT, DELETE)를 사용해서 API 사용 가독성을 높인 구조화된 시스템 아키텍쳐(Framework)이다.
  • 하나의 URL로 우리는 최소 4가지의 HTTP Method를 전송할 수 있다.
  • GET은 정보를 읽을 때, POST는 정보를 추가할 때, PUT은 정보를 업데이트할 때, DELETE는 정보를 삭제할때 사용하며 이를 이용하여 URI를 설계한다.

 

초기세팅하기 

(1). 프로젝트를 관리 할 빈 폴더를 생성한다.

 

(2). 생성한 폴더에서 가상환경을 생성하고 실행한다. 

*가상환경 실행시 만들어진 디렉터리내에서 실행한다.

python -m venv [가상환경 이름]

#windows
[가상환경 이름]/scripts/activate.bat 실행

#mac
source [가상환경 이름]/bin/activate

#가상환경 비활성화
/deactivate

(3). 필요한 패키지 설치하기 

pip install django

pip install djangorestframework

 

(4). Djnago proejct 생성하기 & Django app 생성하기

*가상환경 디렉터리에서 빠져나온 후 진행한다.

# django-admin startproject [프로젝트이름] .
django-admin startproject mydjango .

# python manage.py startapp [앱이름]
python manage.py startapp api

 

(5). project생성 & app 생성 후 디렉터리 구조 

디렉터리 구조

 


settings.py 설정하기

- mydjango 프로젝트의 settings.py에 들어가 필요한 부분을 설정을 해준다.

 

  1. settings.py에 추가 및 변경
ALLOWED_HOSTS = ["*"]

# 생성한 api앱과 rest_framework를 추가해준다.
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api',
    'rest_framework'
]

#언어를 한국어로 변경해준다.
LANGUAGE_CODE = 'ko'

#시간
TIME_ZONE = 'Asia/Seoul'

 

2. 서버 실행 

*mange.py가 있는 디렉터리에서 작업

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

*runserver후 로컬주소를 통해 들어가본다.

* 추가설명 

  • makemigrations : 모델 변경사항 감지 및 기록 
  • migrate : 변경사항을 DB에 적용 (Django는 dbsqlite3 를 기본 db로 제공한다)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

 

위와 같은 페이지가 나오면 정상작동하는 것이다. 이제 장고를 사용할 가장 기초적인 준비가 끝났다.


REST API MODEL 만들기 

1. Models.py

- 만들어놓은 api app의 models.py에 들어가 model을 작성한다.

- django에서 Model은 데이터 서비스를 제공하는 하나의 layer이다. django에서 생성되는 app의 models.py에 의해 정의 할 수 있다. 쉽게 말해 models.py에서 모델 클래스를 설정하면 데이터베이스에 테이블이 생성되는 것이다. 

 

  • api에서 사용할 모델 클래스를 만들어준다.
from django.db import models

# Create your models here.
class Item(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=300)
    cost = models.IntegerField()

 

  • 모델의 필드 타입 & 옵션

- model의 필에는 다양한 타입과 그에따른 옵션이있다. 참고해서 사용해보자

 

Field Type설명 💻

CharField 제한된 문자열 필드 타입. 최대 길이를 max_length 옵션에 지정해야 한다. 문자열의 특별한 용도에 따라 CharField의 파생클래스로서, 이메일 주소를 체크를 하는 EmailField, IP 주소를 체크를 하는 GenericIPAddressField, 콤마로 정수를 분리한 CommaSeparatedIntegerField, 특정 폴더의 파일 패스를 표현하는 FilePathField, URL을 표현하는 URLField 등이 있다.
TextField 대용량 문자열을 갖는 필드
IntegerField 32 비트 정수형 필드. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField 을 사용할 수도 있다.
BooleanField true/false 필드. Null 을 허용하기 위해서는 NullBooleanField를 사용한다.
DateTimeField 날짜와 시간을 갖는 필드. 날짜만 가질 경우는 DateField, 시간만 가질 경우는 TimeField를 사용한다.
DecimalField 소숫점을 갖는 decimal 필드
BinaryField 바이너리 데이타를 저장하는 필드
FileField 파일 업로드 필드
ImageField FileField의 파생클래스로서 이미지 파일인지 체크한다.
UUIDField GUID (UUID)를 저장하는 필드

 

필드 옵션설명 💻

null (Field.null) null=True 이면, Empty 값을 DB에 NULL로 저장한다. DB에서 Null이 허용된다. 예: models.IntegerField(null=True)
blank (Field.blank) blank=False 이면, 필드가 Required 필드이다. blank=True 이면, Optional 필드이다. 예: models.DateTimeField(blank=True)
primary_key (Field.primary_key) 해당 필드가 Primary Key임을 표시한다. 예: models.CharField(max_length=10, primary_key=True)
unique (Field.unique) 해당 필드가 테이블에서 Unique함을 표시한다. 해당 컬럼에 대해 Unique Index를 생성한다. 예: models.IntegerField(unique=True)
default (Field.default) 필드의 디폴트값을 지정한다. 예: models.CharField(max_length=2, default="WA")
db_column (Field.db_column) 컬럼명은 디폴트로 필드명을 사용하는데, 만약 다르게 쓸 경우 지정한다.

 

2. Serializer 생성

- 만들어 놓은 앱 폴더 내에 serializers.py를 생성해준다. 

- serialiezer란 장고 모델 데이터를 json타입으로 바꿔주는 작업을 해준다. 즉 직렬화 작업을 해준다.

- 장고 모델 데이터를 json으로 바꿔주면 api 통신을 할 때 훨씬 편하게 작업할 수 있다.

 

  • app 폴더 내에 serializers.py를 만든다.

- 설치한 rest_framework에서 serializers를 import한다.

- 설정한 models.py의 Item class를 import한다.

from rest_framework import serializers
from .models import Item

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ("__all__")
        #fields = ('name', 'description', 'cost')

 

3. Viewset 생성

- 만들어 놓은 앱 폴더 내에 views.py에 작성한다.

- ModelViewSet은 기본적으로 CRUD를 지원한다. 

- 모델명.objects.all() : 해당 모델에 존재하는 테이블의 데이터를 전부 갖고 오겠다는 뜻이다.

- serializer_class: 위에서 생성한 ItemSerializer를 사용하겠다는 뜻이다.

 

from django.shortcuts import render
from rest_framework import viewsets
from .serializers import ItemSerializer
from .models import Item

# Create your views here.
class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer
  • Viewset 장점
    • queryset 사용으로 반복되는 CRUD 로직을 한번에 정의할 수 있음
    • Router를 사용함으로써, URL설정을 다룰 필요가 없음

 

4. Router 등록

- 만들어 놓은 앱 폴더 내에 urls.py를 생성한다. #api/urls.py

from django.urls import include, path
from rest_framework import routers
from . import views #views.py import

router = routers.DefaultRouter() #DefaultRouter를 설정
router.register('Item', views.ItemViewSet) #itemviewset 과 item이라는 router 등록

urlpatterns = [
    path('', include(router.urls))
]

 

-만들어 놓은 프로젝트 폴더내에 urls.py를 설정해준다.  #mydjango/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('api.urls')), #api/urls.py 를 사용
]

 


REST API 테스트 

- 위에서 Models.py를 설정하고 migrate를 해주지 않은 상태이기 때문에 db에 테이블이 형성되지 않은 상태이다.

- 아래 명령어 순서대로 다시 migrate 해준 후 runserver해주자

python manage.py makemigrations

python manage.py migrate

python manage.py runserver

 

 

주소 클릭 (GET)

POST

 

DELETE

PUT

 

간단한게 REST API를 테스트 해보았다.

반응형

댓글