본문 바로가기

Django

[Django] RESTful API

RESTful API 란 ?

ChatGPT : Restful API에 대해 알려줘

REST(Representational State Transfer)는 웹 기반 애플리케이션에서 클라이언트와 서버 사이의 통신 방식 중 하나입니다. RESTful API는 이러한 REST 원칙을 따르는 API를 의미합니다.

RESTful API는 자원(Resource)을 URI(Uniform Resource Identifier)로 표현하며, HTTP 프로토콜을 이용하여 해당 자원을 조작하는 방식으로 동작합니다. HTTP Method인 GET, POST, PUT, DELETE 등을 사용하여 자원을 조작할 수 있습니다.

RESTful API에서는 자원을 표현하는 URI와 HTTP Method를 통해 리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행합니다. 예를 들어, /users URI는 모든 사용자 자원을 나타내며, GET 메서드를 사용하여 모든 사용자를 조회할 수 있습니다. POST 메서드를 사용하여 새로운 사용자를 생성하거나 PUT/PATCH 메서드를 사용하여 사용자 정보를 업데이트하고, DELETE 메서드를 사용하여 사용자를 삭제할 수 있습니다.

RESTful API의 장점으로는 URI와 HTTP Method를 이용하여 자원을 명확하게 표현할 수 있어 개발자가 API를 이해하기 쉽고, 캐싱 등의 기술을 활용하여 성능을 개선할 수 있습니다. 또한, 다양한 클라이언트와 서버 사이에서 사용하기 쉽고 유연하며, 다른 서비스와의 통합에 용이합니다.

하지만 RESTful API를 설계할 때 URI를 어떻게 정의할 것인지, 어떤 HTTP Method를 사용할 것인지 등 다양한 설계 결정을 내려야 하며, 이러한 결정이 서로 다른 개발자들 사이에서 불일치할 가능성이 있어 API 호환성에 문제가 생길 수 있습니다.

 

즉, 이전 포스팅에서 살펴본 Django REST framework(DRF)는 Django 에서 RESTful API를 구현 하는 대표적인 방법이다 !

 

DRF를 사용하여 RESTful API 구현하는 방법

1. Serializer 정의

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

    def create(self, validated_data):
        profile = Profile.objects.create(**validated_data)
        profile.save()
        return profile

    def update(self, instance, validated_data):
        return super().update(instance, validated_data)
  • Serializer는 Django 모델 데이터를 JSON, XML 등의 형식으로 변환함
  • Serializer를 정의하여 데이터를 직렬화함

2. View 정의

class ProfileRetrieveUpdateView(APIView):
    permission_classes = (IsAuthenticated,)
    serializer_class = ProfileSerializer

    @swagger_auto_schema(
        responses=ProfileRetrieveUpdateDocs.GET['responses'],
    )
    def get(self, request):
        return Response(ProfileSerializer(Profile.objects.get(user_id=request.user.id)).data)

    @swagger_auto_schema(
        request_body=ProfileRetrieveUpdateDocs.PATCH['request_body'],
        responses=ProfileRetrieveUpdateDocs.PATCH['responses'],
    )
    def patch(self, request):
        serializer = ProfileSerializer(Profile.objects.get(user_id=request.user.id), data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)
  • View는 URL 요청에 대한 처리를 정의함
  • DRF는 RESTful API를 지원하는 View를 제공
  • APIView 등

3. URL 설정

from django.urls import path

urlpatterns = [
	path('profiles/', ProfileRetrieveUpdateView.as_view(), name='profile_retrieve_update'),
]
  • URL 설정은 Django에서 URL 요청을 View에 연결하는 역할을 함
  • urls.py에서 URL 설정을 정의

4. API 문서화

  • API문서화는 API사용자가 API를 쉽게 이해하고 사용할 수 있도록 도움
  • Swagger