API Docs

TIL Day 89

By polaris0208

API 문서

API 사용 설명, 사용되는 인자, 결과, 오류 처리 등

개념

  • API를 사용하는 방법 및 결과, 발생 가능한 오류에 대한 상세한 설명 제공
    • 해당 문서를 바탕으로 프론트엔드에 적용
요청 인증 엔드포인트 인자 결과 오류
POST User ~/accounts/login/ username, password token vaild error

종류

  • 정해진 형식, 도구는 없음

노션(Notion)

  • 업무 소통 도구
  • 검색, 필터 정렬 등 데이터 작성

포스트맨(Postman)

  • 태스트 및 결과를 그대로 반영하여 작성 가능
  • 2인 초과 시 유료
  • 버그 또는 오류가 종종 발생하여 저장되지 않는 경우 존재

etc

  • Git book
  • 엑셀, 워드

Django REST Framework

  • Swagger-UI / Redoc 기반 툴 제공
    • 코드를 기반으로 API Doc을 만들고, 이 문서를 사용자가 보기 편하게 UI로 변환하는 도구
  • drf-spectacular : OpenAPI 3 기반
  • drf-yasg : OpenAPI 2 기반
    • 업데이트 중지
  • OpenAPI
    • OAS(OpenAPI Specification)
    • 사용자 또는 프로그램이 소스코드나 글로 작성된 문서를 보지 않고도 서비스의 기능들을 이해할 수 있도록 JSON 형태로 표현하려는 프로젝트

DRF-Spectacular

  • drf-yasg 보다 최신 OpenAPI 기반
  • 업데이트 유지중

설치

  • pip install drf-spectacular
  • settings.py 등록
    • App 등록
    • REST Framework 등록
    • DRF Spectacular 설정 등록
INSTALLED_APPS = [
    ...
    'drf_spectacular',
]

...

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

...

SPECTACULAR_SETTINGS = {
    'TITLE': 'MY Django API',
    'DESCRIPTION': 'Django DRF API Doc',
    'VERSION': '1.0.0',
    ...
}

기본 사용

  • urls.py : 프로젝트 파일
  • ~/api/schema/swagger-ui/ 에 접속해 문서 확인
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView

urlpatterns = [
    # YOUR PATTERNS
    ...
    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
    # Optional UI:
    path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
]

커스텀

  • @extend_schema : 클래스형 뷰, 요청 함수 앞에 붙여 사용
  • tags, description : 분류 및 설명 추가
  • request : 문서에 테스트 기능 추가
class ArticleListCreateAPIView(APIView):
    permission_classes = [IsAuthenticated]

    @extend_schema(
        tags=["Articles"],
        description="Article 목록 조회를 위한 API",
    )
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    @extend_schema(
        tags=["Articles"],
        description="Article 생성을 위한 API",
        request=ArticleSerializer,
    )
    def post(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)

결론

정해진 방법은 없다.

  • 노션, 엑셀등의 도구가 상황에 따라 전문적인 도구보다 유효할 수 있음
    • API 구현이 우선
    • API 문서를 작성하기 위해 과도한 학습이 요구되면 안됨
    • 인원변동이 잦은 업무환경일 경우 매번 API문서 도구 사용법을 익히는 것이 비효율적
Tags: TIL Tools