[python] Django REST framework에서의 예외 처리 방법

Django REST Framework은 RESTful API를 구축하는 데 매우 유용한 도구입니다. 그러나 때로는 API 요청 중에 예외가 발생할 수 있습니다. 이러한 예외를 적절하게 처리하는 것은 안전한 API를 구축하는 데 필수적입니다. 이 글에서는 Django REST Framework에서 예외 처리를 하는 방법을 알아보겠습니다.

1. 기본 예외 처리

Django REST Framework는 기본적으로 예외 처리를 제공합니다. 일반적인 예외는 exception_handler 함수에 의해 처리됩니다. 이 함수는 settings.py 파일에서 수정할 수 있습니다.

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'myapp.views.custom_exception_handler'
}

위의 예시에서는 myapp.views.custom_exception_handler 함수가 예외 처리를 담당함을 알 수 있습니다. 따라서 이 함수를 views.py 파일에 구현해야 합니다.

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)

    if response is not None:
        response.data['status_code'] = response.status_code

    return response

위의 코드에서는 기본적인 예외 처리를 수행하고, 반환되는 응답에 상태 코드를 추가하여 전달합니다.

2. 특정 예외 처리

특정 예외를 처리하기 위해서는 APIView 클래스를 상속받은 뷰에서 handle_exception 메서드를 오버라이딩하여 예외 처리를 수행할 수 있습니다.

from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response

class MyAPIView(APIView):
    def handle_exception(self, exc):
        if isinstance(exc, MyCustomException):
            # 특정 예외 처리 로직 구현
            return Response({"error": "Something went wrong"},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        return super().handle_exception(exc)

위의 예시에서는 MyCustomException이 발생한 경우, 해당 예외를 처리하는 로직을 구현하고 500 상태 코드로 응답합니다. 다른 예외는 부모 클래스의 handle_exception 메서드에게 처리를 맡깁니다.

3. 전역 예외 처리

전역 예외 처리는 모든 뷰에서 예외가 발생했을 때 동일한 로직을 실행할 수 있게 해줍니다. 이를 통해 코드 중복을 줄이고 일관된 예외 처리를 구현할 수 있습니다.

Django Middleware를 사용하여 전역 예외 처리를 구현할 수 있습니다. middleware.py 파일을 생성하고 다음과 같이 코드를 작성합니다.

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status

def global_exception_handler(get_response):
    def middleware(request):
        response = get_response(request)
        return response

    def process_exception(request, exception):
        response = exception_handler(exception, None)
        if response is None:
            return Response(
                {"error": str(exception)},
                status=status.HTTP_400_BAD_REQUEST
            )
        return response

    middleware.process_exception = process_exception
    return middleware

위의 코드에서는 process_exception 함수를 구현하여 예외 처리 로직을 작성합니다. 예외가 발생한 경우, 해당 함수가 호출되고 예외 처리를 수행한 후 응답을 반환합니다.

다음으로, settings.py 파일에서 Middleware를 추가합니다.

MIDDLEWARE = [
    ...
    'myproject.middleware.global_exception_handler',
    ...
]

이제 전역 예외 처리가 구현되었습니다. 모든 뷰에서 예외가 발생하면 해당 함수가 실행되어 예외 처리를 수행합니다.

결론

Django REST Framework에서는 기본 예외 처리 및 특정 예외 및 전역 예외 처리를 위한 다양한 기능을 제공합니다. 이러한 기능을 활용하여 안정적이고 예외 처리 기능이 강화된 RESTful API를 구축할 수 있습니다.

참고 문서: Django REST Framework Exception Handling