Django REST Framework 기반 백엔드 초기 세팅 가이드

1. 사전 준비 사항 및 패키지 관리

개발 환경은 Python 인터프리터가 이미 구축되어 있고, 가상 환경 (virtual environment) 을 활성화한 상태로 가정합니다. 프로젝트 생성 절차는 생략하며, 주요 라이브러리 설치에 집중합니다.

국내 네트워크 환경에서의 다운로드 속도를 높이기 위해 소스 경로를 지정하여 패키지를 가져올 수 있습니다. 아래 명령어들을 통해 필요한 컴포넌트를 확보합니다.

pip install virtualenvwrapper\npip install django==4.2\npip install djangorestframework

추가적으로 브라우저 기반 API 문서 기능을 위해 Markdown 모듈과 필터링 기능을 위한 도구를 함께 설치 권장합니다.

pip install markdown django-filter

2. 프레임워크 등록 및 권한 설정

설치가 완료되면 Django 메인 프로젝트의 설정 파일인 settings.py 를 수정해야 합니다. 먼저 애플리케이션 목록에 DRF 모듈을 포함시킵니다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    # ... 기존 앱 목록
    'rest_framework',
]

API 접근 제어 정책은 REST_FRAMEWORK 설정 딕셔너리를 통해 정의합니다. 기본적으로 인증되지 않은 사용자에게는 읽기 전용 권한을 부여하고, 모델 권한을 적용하는 방식을 예시로 작성했습니다.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

3. 데이터 직렬화 (Serializer) 정의

API 응답 구조를 정의하기 위해 시리얼라이저 파일을 생성합니다. 여기서는 사용자 정보를 다루는 대신, 일반적인 상품 데이터를 매핑하는 ProductSerializer 예시를 사용합니다. HyperlinkedModelSerializer 는 관계형 필드를 URL 과연결하여 표현하는 방식입니다.

from rest_framework import serializers
from .models import Product

class ProductInfoMapper(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price', 'created_at']
        
        # 복잡한 관계를 가진 경우 깊이를 제한하여 성능 보호
        depth = 1 

특수한 URL 매핑이 필요할 경우 extra_kwargs 옵션을 활용하여 뷰셋의 경로와 조회 필드를 명시할 수 있습니다.

extra_kwargs = {
    'link_url': {'view_name': 'product-detail', 'lookup_field': 'pk'},
}

4. 뷰셋 (ViewSet) 구현

CRUD 연산을 자동화하려면 ModelViewSet 을 확장합니다. 이는 여러 HTTP 메서드 (GET, POST, PUT 등) 에 대한 로직을 한곳에서 처리하게 해줍니다.

from rest_framework import viewsets
from .models import Product
from .serializers import ProductInfoMapper

class ProductManager(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductInfoMapper
    
    def get_queryset(self):
        # 검색 파라미터에 따른 동적 쿼리 추가 가능
        query = self.request.query_params.get('search')
        qs = self.queryset
        if query:
            qs = qs.filter(name__icontains=query)
        return qs.all()

5. 자동 라우팅 구성

각 뷰 클래스별로 URL 패턴을 직접 정의하는 대신, 루팅어를 사용하여 자동으로 경로를 생성합니다. 응용 프로그램 내부의 urls.py 에 다음 구조를 적용합니다.

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProductManager

router = DefaultRouter()
router.register(r'goods', ProductManager, basename='goods-view')

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

위 설정으로 인해 '/goods/' 경로로 요청이 들어오면 자동으로 해당 뷰셋의 리스트 또는 상세 페이지가 처리됩니다. 또한 rest_framework.urls 를 포함시켜 토큰 기반 인증 등을 위한 진입점을 제공하게 됩니다.

태그: Django django-rest-framework api-design python-web serializers

7월 10일 19:44에 게시됨