본문으로 건너뛰기
김신건의 로그

[DRF] Tutorial + Quickstart: 첫 API 서버 5분

· 수정 · 📖 약 3분 · 916자/단어 #drf #tutorial #quickstart #django #api
DRF quickstart, DRF tutorial, 첫 REST API, DRF 시작, django rest framework tutorial

정의

Django REST Framework (DRF)처음 사용 하는 사람을 위한 순차 시작 가이드. 5분 안에 동작하는 API 서버 완성.

DRF 개요는 django-rest-framework. Django 기본은 django-tutorial.

DRF는 무엇인가

한 줄로: Django 위에 REST API 를 짜기 위한 배터리 포함 라이브러리.

Django 자체는 웹앱 (HTML 페이지) 을 잘 만들지만, JSON API 는 손이 많이 간다. DRF 는 그 반복을 자동화한 사실상 표준 도구.

목적

없을 때 (순수 Django)DRF 사용 시
Model → dict 수동 변환Serializer 자동
Body JSON 파싱 수동request.data 자동
CRUD view 6개 손으로ModelViewSet 한 줄
URL 매핑 손으로Router.register() 한 줄
인증 코드 수동authentication_classes 선언만
API 문서 손으로drf-spectacular 자동

대안 비교

flowchart TB
    Q{Django에서 REST API}
    Q --> Plain["순수 Django (JsonResponse)"]
    Q --> DRF["Django REST Framework"]
    Q --> Ninja["Django Ninja"]
    Q --> FastAPI["FastAPI (별개 프레임워크)"]
    Plain --> P1["직렬화 수동, 검증 수동, 문서화 없음"]
    DRF --> D1["Serializer, ViewSet, Router 자동, OpenAPI 자동"]
    Ninja --> N1["FastAPI 스타일 (type hint), Django ORM 그대로"]
    FastAPI --> F1["가장 빠름, Django ORM은 별도 통합 필요"]
옵션장점단점언제?
DRF성숙, 커뮤니티 최대, 문서/책 많음학습 곡선, 클래스 계층 복잡Django 프로젝트에 REST API 얹을 때 기본 선택
Django Ninja빠름, FastAPI 스타일, 코드 간결상대적으로 신생, 라이브러리 생태계 작음작은 Django 프로젝트, type hint 선호
FastAPI가장 빠름, 비동기 우선, 타입 안전Django ORM 통합 별도, ecosystem 다름Django 종속성 없을 때
Plain Django학습 곡선 낮음, 의존성 없음매번 boilerplate 반복endpoint 1-2개 짜리 프로토타입

DRF 는 대규모 Django 프로젝트의 REST API 표준. 새 프로젝트에 REST 필요 → DRF 기본 선택.

요청이 어떻게 흐르는가 (한눈에)

DRF는 다음 파이프라인으로 매 요청을 처리한다. 이 순서 를 알면 후속 페이지 이해가 쉽다.

각 스테이지 상세:

단계하는 일다음 페이지
1. URL Routerpath 매칭 후 View 선택drf-routers
2. AuthenticationAuthorization 헤더 읽고 request.user 세팅drf-authentication
3. Permission이 user 가 이 view 접근 가능?django-drf-permissions
4. Throttle이 user 너무 자주 요청? (429)drf-pagination-throttling
5. View실제 비즈니스 로직drf-views, django-drf-viewset
6. SerializerModel ↔ dict 변환, 검증django-drf-serializers
7. RendererAccept 헤더 보고 JSON/HTML 등 선택drf-request-response

요구사항 (2026)

  • Django 4.2, 5.x, 6.0
  • Python 3.10-3.14

설치

pip install djangorestframework
pip install markdown           # Browsable API 마크다운
pip install django-filter      # 필터링
# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    ...,
    'rest_framework',           # ← 추가
    'rest_framework.authtoken', # Token auth 쓸 때
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
}

Quickstart: User API (5분 완성)

1. Serializer (Model → JSON)

# quickstart/serializers.py
from django.contrib.auth.models import User, Group
from rest_framework import serializers

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups', 'is_staff']

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ['url', 'name']

자세한 건 django-drf-serializers.

2. ViewSet (Endpoint)

# quickstart/views.py
from django.contrib.auth.models import User, Group
from rest_framework import viewsets, permissions
from .serializers import UserSerializer, GroupSerializer

class UserViewSet(viewsets.ModelViewSet):
    """전체 CRUD 자동!"""
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]

class GroupViewSet(viewsets.ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

자세한 건 django-drf-viewset.

3. Router (URL 자동)

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

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'groups', GroupViewSet)

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

자세한 건 drf-routers.

4. 실행

python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

브라우저에서 http://127.0.0.1:8000/ 접속 → Browsable API 자동 렌더링!

Browsable API

flowchart LR
    Browser -->|Accept: text/html| DRF
    DRF -->|HTML rendering| Browsable[Browsable API<br/>인터랙티브 UI]
    Browser -->|Accept: application/json| DRF
    DRF -->|JSON| JSON[JSON 응답]

TIP

Browsable API 는 DRF 만의 큰 장점. 별도 도구 없이 브라우저에서 API 탐색 + 테스트. FastAPI 의 /docs 와 유사하지만 실제 endpoint 이동 가능.

API 호출 예시

# 목록 조회
curl -H 'Accept: application/json' http://127.0.0.1:8000/users/

# 생성 (session auth)
curl -X POST http://127.0.0.1:8000/users/ \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -u admin:admin \
  -d '{"username": "koa", "email": "koa@example.com", "groups": []}'

# 상세
curl http://127.0.0.1:8000/users/1/

# 삭제
curl -X DELETE http://127.0.0.1:8000/users/1/ -u admin:admin

Tutorial 순서 (권장 학습)

flowchart LR
    S["1. Quickstart<br/>(이 페이지)"] --> Ser["2. Serialization<br/>(drf-serializers)"]
    Ser --> RR["3. Requests/Responses<br/>(drf-request-response)"]
    RR --> CBV["4. Class-based views<br/>(drf-views)"]
    CBV --> Auth["5. Auth + Permissions<br/>(drf-authentication, drf-permissions)"]
    Auth --> Rel["6. Relationships<br/>(nested serializers)"]
    Rel --> VS["7. ViewSets + Routers<br/>(drf-viewset, drf-routers)"]

FBV vs APIView vs GenericView vs ViewSet

flowchart TD
    Q{복잡도 vs 자유도}
    Q -->|"최대 자유도"| FBV["@api_view (FBV)"]
    Q -->|"OO + 자유"| APIView["APIView (CBV)"]
    Q -->|"CRUD 반복"| Gen["Generic Views (ListAPIView 등)"]
    Q -->|"완전 자동 CRUD"| VS["ViewSet + Router"]

각 4개 스타일:

# 1. FBV
@api_view(['GET', 'POST'])
def user_list(request):
    if request.method == 'POST':
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=201)
    users = User.objects.all()
    return Response(UserSerializer(users, many=True).data)

# 2. APIView
class UserList(APIView):
    def get(self, request):
        users = User.objects.all()
        return Response(UserSerializer(users, many=True).data)

# 3. Generic Views
class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

# 4. ViewSet
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

다음 학습 순서

이 튜토리얼 후 순서:

  1. django-drf-serializers - Serializer 심화
  2. drf-request-response - Request/Response 객체
  3. drf-views - Views 종류
  4. drf-authentication - 인증
  5. django-drf-permissions - 권한
  6. drf-pagination-throttling - Pagination + Rate limit
  7. drf-filtering - 필터링
  8. django-drf-viewset - ViewSet 심화
  9. drf-routers - Router 심화
  10. drf-schemas-openapi - OpenAPI 문서화
  11. drf-testing - 테스트

다른 프레임워크 비교

FrameworkSerializerAuto CRUDBrowsable API
DRFSerializerViewSet
FastAPIPydantic없음Swagger UI
Django NinjaPydantic없음Swagger UI
RailsActive Model SerializersScaffold없음
Spring BootJacksonSpring Data REST없음
NestJSclass-validator없음Swagger 통합

흔한 함정

WARNING

  1. INSTALLED_APPSrest_framework 안 넣음 = 500 error.
  2. HyperlinkedModelSerializer 사용 시 basename 없이 register = URL 생성 실패.
  3. CSRF token session 인증에서 안 넣음 = 401. Browsable API 는 session 이라 필요.
  4. DEFAULT_PERMISSION_CLASSES 미설정 = 기본 모두 접근 가능 (AllowAny).

관련 위키

이 글의 용어 (13개)
[Django] 첫 프로젝트 튜토리얼: 순차 학습django
정의 Django 를 처음 접하는 사람 을 위한 순차 학습 페이지. 투표 앱 (polls) 을 만들며 Django 의 핵심 개념을 익힌다. 먼저 로 MTV 패턴과 프로젝트 구조를…
[Django] DRF 개요: Serializer, ViewSet, Routerdjango
학습 로드맵 이 페이지는 개요. 처음 접하는 사람은 아래 순서로 읽으면 자연스럽다: DRF 는 파이프라인이 핵심. 한번 그림으로 보면 이해가 쉽다: 정의 Django REST F…
[Django] DRF Permission, Throttle, Filterdjango
정의 DRF는 view 호출 전 인증(Authentication) → 권한(Permission) → 스로틀(Throttle) 순으로 검사. 각 단계가 통과해야 view 메서드 실…
[Django] DRF Serializer 심화django
정의 DRF Serializer는 JSON ↔ Python ↔ Model의 변환과 검증을 담당한다. Django Form과 비슷한 인터페이스이나 API/JSON에 특화. 검증, …
[Django] DRF ViewSet, Router, @actiondjango
정의 ViewSet은 같은 리소스의 관련 view들을 클래스 하나로 묶는다. Django의 generic views와 비슷하나 / / / / / action 메서드로 통일. Ro…
[DRF] Authentication: Session, Token, JWT, OAuth2django
정의 Authentication = 누가 요청했는지 식별. Authorization () 과 별개. 흐름 자세한 permission 은 . 내장 Authentication Cla…
[DRF] Filtering: django-filter, SearchFilter, OrderingFilterdjango
정의 Filtering = 쿼리 파라미터로 결과 제한. 3가지 backend + custom. 3가지 내장 Backend 설치 + 설정 1. DjangoFilterBackend …
[DRF] Pagination + Throttlingdjango
정의 Pagination = 큰 목록을 페이지 단위로 나눔. Throttling = 요청 빈도 제한. 둘 다 API 안정성의 기본. Pagination 3종 언제 어느 것을 쓸까…
[DRF] Request + Response 객체django
정의 DRF 의 = Django 의 확장. = 의 확장. 자동 content negotiation + renderer 처리. 요청이 뷰에 도달하기까지 에 값이 실제로 들어가려면 …
[DRF] Routers: DefaultRouter, SimpleRouter, custom actionsdjango
정의 Router = ViewSet 에 대한 URL 자동 생성. Rails 의 와 유사. 왜 Router? 종류 DefaultRouter 생성되는 URL: | URL | Meth…
[DRF] Schemas + OpenAPI: 자동 문서화django
정의 OpenAPI (전 Swagger) = REST API를 기계 가독 스펙으로 기술하는 표준. DRF는 이 스펙을 ViewSet / Serializer 로부터 자동 추출할 수…
[DRF] Testing: APIClient, APITestCase, force_authenticatedjango
정의 DRF의 테스트 도구는 Django 위에 API 특화 helper 를 얹은 것. 로 real endpoint 를 호출하거나 로 View 단위 테스트가 가능. 테스트 도구 계…
[DRF] Views: APIView, GenericViews, Mixins, FBVdjango
정의 DRF View 4가지 스타일. 자유도 vs 자동화 트레이드오프. 4가지 스타일 | 스타일 | 코드량 | 자유도 | |---|---|---| | | 유사 Django FBV…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기