1. 사전 준비 사항 및 패키지 관리
개발 환경은 Python 인터프리터가 이미 구축되어 있고, 가상 환경 (virtual environment) 을 활성화한 상태로 가정합니다. 프로젝트 생성 절차는 생략하며, 주요 라이브러리 설치에 집중합니다.
국내 네트워크 환경에서의 다운로드 속도를 높이기 위해 소스 경로를 지정하여 패키지를 가져올 수 있습니다. 아래 명령어들을 통해 필요한 컴포넌트를 확보합니다.
pip install virtualenvwrapper\npip install django==4.2\npip install djangorestframework추가적으로 브라우저 기반 API 문서 기능을 위해 Markdown 모듈과 필터링 기능을 위한 도구를 함께 설치 권장합니다.
pip install markdown django-filter2. 프레임워크 등록 및 권한 설정
설치가 완료되면 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 를 포함시켜 토큰 기반 인증 등을 위한 진입점을 제공하게 됩니다.