기본 콘텐츠로 건너뛰기

drf-yasg 또는 drf-spectacular로 Swagger 문서 자동화하기

API 개발하다 보면 Swagger 문서 작업이 정말 골치 아프죠. 일일이 수작업으로 작성하다 보면 시간도 오래 걸리고, 실수도 잦고… 그래서 저는 Django REST Framework(DRF)에서 Swagger 문서를 자동으로 만들어주는 DRF-Yasg랑 DRF-Spectacular 두 라이브러리를 써봤는데, 솔직히 후자가 훨씬 낫더라고요. 이 글에서 제 경험을 바탕으로 두 라이브러리를 비교해보고, DRF-Spectacular을 중심으로 사용법을 알려드릴게요. 자, 시작해볼까요?

먼저, 핵심 개념부터 간단히 짚고 넘어가죠. DRF-Yasg는 좀 오래된 친구인데, 안정적이고 많이 쓰이는 만큼 나름 장점이 있어요. 하지만 최신 OpenAPI 규격을 완벽하게 지원하지 않는 경우가 있고, 내가 원하는 대로 바꾸려면(커스터마이징) 좀 복잡할 수 있다는 단점이 있죠. 반면 DRF-Spectacular은 최신 라이브러리라서 OpenAPI 3.x 규격을 완벽하게 지원하고, 문서 생성도 훨씬 깔끔하고 직관적이에요. 사용하기도 쉽고, 내 마음대로 바꾸기도 편하죠. 단점이라면… 음… 아직 새로운 라이브러리라 가끔 버그를 만날 수도 있다는 점? 저는 아직 큰 문제는 없었지만요.

그럼 어떤 걸 써야 할까요? 솔직히 프로젝트 상황에 따라 다르지만, 저라면 최신 기능과 편의성을 중요하게 생각해서 DRF-Spectacular을 추천할 것 같아요. 안정성이 절대적으로 중요한 프로젝트라면 DRF-Yasg도 나쁘지 않겠지만요.

자, 이제 DRF-Spectacular을 실제로 사용하는 방법을 알려드릴게요. 설치는 pip install drf-spectacular 명령어 하나면 끝! 정말 쉽죠? 설치 후에는 settings.py 파일에 몇 줄만 추가하면 됩니다. 어려운 거 없어요, 그냥 따라 하세요! 설정 파일을 열고 다음 코드를 추가해 보세요. (설정 파일 위치는 프로젝트 구조에 따라 다를 수 있으니, 찾아보셔야 해요!)

INSTALLED_APPS = [
    # ... other apps ...
    'drf_spectacular',
    'rest_framework',
]

SWAGGER_SETTINGS = {
    'TITLE': 'My API',
    'DESCRIPTION': 'API documentation',
    'VERSION': '1.0.0',
}

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

TITLE, DESCRIPTION, VERSION 부분은 여러분의 API 정보에 맞게 바꿔주세요. 그리고 urls.py에도 몇 줄 추가해야 합니다. 이 부분은 꼭 기억해주세요!

from django.urls import path, include
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView

urlpatterns = [
    # ... other urls ...
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
]

마지막으로 간단한 serializer와 view를 만들어서 테스트해볼게요. 여기서 MyModel은 여러분이 사용하는 모델로 바꿔야 합니다. 잊지 마세요!

from rest_framework import serializers, viewsets
from rest_framework.response import Response

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel # MyModel 은 적절한 모델을 대체해야 합니다.
        fields = '__all__'

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

이제 서버를 실행하고 /api/docs/ 에 접속하면 Swagger UI가 짠! 하고 나타날 거예요. 직접 API 문서를 확인해보세요. 신기하지 않나요?

몇 가지 주의할 점이 있는데요. 복잡한 모델이나 커스텀 필드가 있다면 schema_generator를 조금 손봐야 할 수도 있어요. 그리고 Swagger UI에서 API를 테스트하려면 인증(Authentication) 설정도 필요하고요. API가 너무 크다면 문서 생성 시간이 오래 걸릴 수 있으니 캐싱을 고려해보는 것도 좋습니다. 마지막으로 API 버전 관리도 중요해요. 버전 정보를 명확하게 표시해야 나중에 혼란을 막을 수 있답니다.

결론적으로, DRF-Yasg와 DRF-Spectacular 모두 장단점이 있지만, 개인적으로는 DRF-Spectacular이 훨씬 편리하고 효율적이라고 생각합니다. 특히 새로운 프로젝트를 시작한다면 DRF-Spectacular을 강력 추천해요! 더 자세한 내용은 각 라이브러리의 공식 문서를 참고하시면 좋습니다. 이 글이 여러분의 API 개발에 도움이 되었으면 좋겠네요! 궁금한 점 있으면 언제든지 물어보세요!

댓글

이 블로그의 인기 게시물

Django에서 트랜잭션 관리하기

Django에서 트랜잭션 관리하기 안녕하세요! 오늘은 Django에서 데이터베이스 트랜잭션을 효과적으로 관리하는 방법에 대해 알아보겠습니다. 1. 트랜잭션의 중요성 트랜잭션은 데이터베이스의 일관성과 무결성을 보장하는 중요한 개념입니다. Django에서는 여러 가지 방법으로 트랜잭션을 관리할 수 있습니다. 1.1 기본 개념 원자성(Atomicity) : 트랜잭션은 모두 실행되거나 모두 실행되지 않아야 합니다. 일관성(Consistency) : 트랜잭션 전후로 데이터베이스의 일관성이 유지되어야 합니다. 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않아야 합니다. 지속성(Durability) : 완료된 트랜잭션의 결과는 영구적으로 저장되어야 합니다. 2. Django의 트랜잭션 관리 2.1 기본 설정 # settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'myuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '5432', 'ATOMIC_REQUESTS': True, # 모든 뷰를 트랜잭션으로 래핑 } } 2.2 데코레이터 사용 from django.db import transaction @transaction.atomic def create_order(user, items): order = Order.objects.create(user=...

AWS S3 + CloudFront로 정적 파일 서빙 완전 가이드

AWS S3 + CloudFront로 정적 파일 서빙 완전 가이드 안녕하세요! 오늘은 AWS S3와 CloudFront를 사용하여 정적 파일을 효율적으로 서빙하는 방법에 대해 알아보겠습니다. 왜 S3와 CloudFront를 사용할까요? 높은 가용성 : AWS의 글로벌 인프라를 활용 빠른 전송 속도 : CloudFront의 CDN 기능으로 전 세계 사용자에게 빠른 전송 비용 효율성 : 사용한 만큼만 지불 보안 : AWS의 보안 기능 활용 확장성 : 트래픽 증가에 자동 대응 1. S3 버킷 설정 1.1 버킷 생성 및 설정 import boto3 def create_s3_bucket(): s3 = boto3.client('s3') # 버킷 생성 bucket_name = 'your-static-files-bucket' s3.create_bucket( Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': 'ap-northeast-2' } ) # 버킷 정책 설정 bucket_policy = { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObje...

Python에서 asyncio 완전 정복 (await, async, gather 등)

어휴, 요즘 파이썬으로 비동기 프로그래밍 하는 재미에 푹 빠졌어요! 특히 asyncio 는 정말 마법 같더라고요. 처음엔 좀 낯설었는데, 익숙해지니까 속도 향상이 눈에 띄게 느껴져서 완전 반해버렸습니다. 이 글에선 제가 asyncio 를 배우면서 깨달은 점들을 풀어놓을게요. 혹시 비동기 프로그래밍이 뭔지 잘 모르시겠다면, 간단히 말해 여러 작업을 동시에 처리해서 프로그램 속도를 엄청나게 높이는 기술이라고 생각하시면 돼요. 마치 여러 요리사가 동시에 음식을 만들어서 손님에게 빨리 제공하는 것과 비슷하죠! 일단 async 와 await 라는 녀석들이 핵심인데요, async 는 함수 앞에 붙여서 "얘는 비동기 함수야!"라고 선언하는 거예요. 그리고 await 는 다른 비동기 함수가 끝날 때까지 기다리라고 지시하는 역할을 하죠. 예를 들어, 네트워크에서 데이터를 가져오는 함수가 있다면, await 를 사용해서 데이터가 다 가져올 때까지 기다렸다가 다음 작업을 진행할 수 있어요. 그 동안 다른 작업을 처리할 수 있으니, 마치 멀티태스킹을 하는 것처럼 느껴져요. 신기하지 않나요? 그리고 asyncio.gather 는 여러 비동기 함수를 동시에 실행하고 결과를 모아주는 아주 유용한 친구입니다. 제가 웹사이트 여러 개에서 데이터를 동시에 가져와야 할 때 정말 요긴하게 썼어요. 하나씩 순서대로 가져오는 것보다 훨씬 빠르더라고요! 마치 여러 개의 탭을 동시에 열어놓고 작업하는 것과 같다고 생각하시면 될 것 같아요. 실제로 제가 썼던 코드를 보여드릴게요. 세 개의 웹사이트에서 데이터를 가져오는 예제인데요. (아래 코드 삽입) 이 코드를 보시면, fetch_data 함수가 각 웹사이트에서 데이터를 가져오는 역할을 하고, asyncio.gather 가 이 함수들을 동시에 실행하도록 도와주는 것을 볼 수 있을 거예요. asyncio.sleep(2) 는 네트워크 지연을 시뮬레이션하기 위해 넣...