Django는 파이썬으로 작성된 웹 프레임워크로, 빠른 개발과 간편한 유지 보수를 제공합니다. Django는 내장된 관리 시스템, ORM(Object-Relational Mapping), 사용자 인증 시스템, 다양한 미들웨어 등을 제공하여 개발자가 보다 효율적으로 웹 애플리케이션을 구축할 수 있도록 도와줍니다. 본 글에서는 Django를 이용해 RESTful API를 구축하고, 시리얼라이저를 활용하는 방법에 대해 자세히 설명하겠습니다.
1. Django 프로젝트 시작하기
먼저, Django 프로젝트를 시작하기 위해 필요한 패키지를 설치해야 합니다. 아래의 커맨드를 통해 Django와 Django REST Framework를 설치할 수 있습니다.
pip install django djangorestframework
다음으로, Django 프로젝트를 생성합니다. 아래의 명령어를 터미널에 입력하여 새로운 Django 프로젝트를 생성하고, 해당 프로젝트 디렉토리로 이동합니다.
django-admin startproject myproject
cd myproject
프로젝트가 생성되면, 기본적인 Django 애플리케이션을 하나 생성해 보겠습니다. 아래의 명령어를 입력하여 `myapp`이라는 앱을 생성합니다.
python manage.py startapp myapp
2. Django REST Framework 설정하기
생성한 `myapp` 디렉토리의 `settings.py` 파일을 열어, INSTALLED_APPS 목록에 `rest_framework`와 `myapp`을 추가합니다.
# myproject/settings.py
INSTALLED_APPS = [
...
'rest_framework',
'myapp',
]
3. 데이터베이스 모델 생성하기
이제 RESTful API에서 사용할 데이터베이스 모델을 생성합니다. `myapp/models.py` 파일을 열어 아래의 코드를 추가하세요.
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
위의 모델에서는 제목, 내용, 생성 날짜를 포함하는 `Article` 모델을 정의했습니다. 다음으로, 데이터베이스에 반영하기 위해 마이그레이션을 진행합니다.
python manage.py makemigrations
python manage.py migrate
4. 시리얼라이저(Serializer) 생성하기
Django REST Framework에서는 API를 통해 데이터를 주고받기 위해서 시리얼라이저를 사용합니다. 시리얼라이저는 복잡한 데이터 타입을 JSON과 같은 기본 데이터 타입으로 변환하는 도구입니다. `myapp/serializers.py` 파일을 생성한 후 아래의 코드를 추가합니다.
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
위 코드에서 `ArticleSerializer`는 `Article` 모델을 위한 시리얼라이저입니다. `fields`는 변환할 모델의 필드를 지정합니다. `__all__`을 사용하면 모든 필드를 포함합니다.
5. RESTful API 뷰(View) 생성하기
이제 시리얼라이저를 활용하여 API 뷰를 구현할 차례입니다. `myapp/views.py` 파일을 열어 아래의 코드를 추가합니다.
from rest_framework import generics
from .models import Article
from .serializers import ArticleSerializer
class ArticleListCreate(generics.ListCreateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
class ArticleDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
위에서 `ArticleListCreate` 클래스는 GET 요청 시 모든 기사를 조회하고, POST 요청 시 새로운 기사를 생성하는 API 뷰를 제공합니다. `ArticleDetail` 클래스는 특정 기사를 조회(GET), 업데이트(PUT), 삭제(DELETE)하는 API 뷰입니다.
6. URL 라우팅 설정하기
이제 생성한 API 뷰를 사용할 수 있도록 URL을 설정해야 합니다. `myapp/urls.py` 파일을 생성하고 아래의 코드를 추가합니다.
from django.urls import path
from .views import ArticleListCreate, ArticleDetail
urlpatterns = [
path('articles/', ArticleListCreate.as_view(), name='article-list-create'),
path('articles//', ArticleDetail.as_view(), name='article-detail'),
]
프로젝트의 메인 URL 설정 파일인 `myproject/urls.py` 파일에 다음과 같이 `myapp`의 URL 모듈을 포함시킵니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')),
]
7. API 테스트하기
이제 모든 설정이 완료되었습니다. Django 서버를 실행해 보겠습니다.
python manage.py runserver
서버가 실행되면, 브라우저나 Postman과 같은 API 클라이언트를 통해 아래의 URL로 요청을 보내 API를 테스트할 수 있습니다.
- GET 요청:
http://127.0.0.1:8000/api/articles/
(모든 기사 조회) - POST 요청:
http://127.0.0.1:8000/api/articles/
(새로운 기사 생성) - GET 요청:
http://127.0.0.1:8000/api/articles/1/
(ID가 1인 기사 조회) - PUT 요청:
http://127.0.0.1:8000/api/articles/1/
(ID가 1인 기사 업데이트) - DELETE 요청:
http://127.0.0.1:8000/api/articles/1/
(ID가 1인 기사 삭제)
8. 인증 및 권한 설정
Django REST Framework는 기본적으로 인증 및 권한 관리를 지원합니다. `settings.py` 파일에서 기본 인증 클래스를 설정할 수 있습니다.
# myproject/settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
]
}
위의 설정은 기본 인증을 사용하고, 모든 사용자에게 API 접근을 허용합니다. 필요에 따라 더 세부적인 권한 설정을 할 수 있습니다.
9. 결론
이제 Django를 이용한 RESTful API 구축과 시리얼라이저 사용법에 대한 기본적인 이해를 돕기 위한 설명을 마치겠습니다. Django REST Framework는 RESTful API를 구축하는 데 매우 유용한 도구이며, 이를 통해 데이터 처리를 간편하게 할 수 있습니다. 이후에는 인증, 필터링, pagination 등의 기능을 추가하여 더욱 완성도 높은 API를 구축해 보시면 좋겠습니다.
이 글이 Django를 활용한 백엔드 개발에 도움이 되었기를 바라며, 더 궁금한 사항이 있다면 언제든지 질문해 주세요!