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