기본 콘텐츠로 건너뛰기

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...

RDS에서 Django 앱 성능을 높이는 데이터베이스 설정 팁

RDS에서 Django 앱 성능을 높이는 데이터베이스 설정 팁 안녕하세요! 오늘은 AWS RDS를 사용하는 Django 애플리케이션의 성능을 최적화하는 방법에 대해 알아보겠습니다. 1. RDS 인스턴스 최적화 1.1 인스턴스 타입 선택 # RDS 인스턴스 크기 조정 import boto3 def resize_rds_instance(): rds = boto3.client('rds') response = rds.modify_db_instance( DBInstanceIdentifier='your-db', DBInstanceClass='db.t3.large', # 워크로드에 맞는 인스턴스 타입 선택 ApplyImmediately=True ) return response['DBInstance'] 1.2 파라미터 그룹 설정 def create_parameter_group(): rds = boto3.client('rds') # PostgreSQL 파라미터 그룹 생성 response = rds.create_db_parameter_group( DBParameterGroupName='django-optimized', DBParameterGroupFamily='postgres13', Description='Optimized parameters for Django applications' ) # 성능 관련 파라미터 설정 parameters = [ { 'ParameterName': 'shared_buffers', 'ParameterValue': '2GB...