[python] Django REST framework에서의 대용량 파일 처리 방법

Django REST framework은 웹 애플리케이션과 API를 구축하는 데 사용되는 강력한 도구입니다. 그러나 대용량 파일을 처리해야 할 때, 일부 추가적인 고려 사항이 필요합니다. 이 글에서는 Django REST framework에서 대용량 파일을 처리하는 방법에 대해 알아보겠습니다.

1. 파일 업로드 설정

먼저, settings.py 파일에서 파일 업로드에 대한 설정을 확인해야 합니다. 아래와 같이 설정해야 합니다:

# settings.py

# 파일 크기 제한 설정
FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 10  # 10MB

# 임시 디렉토리 설정
FILE_UPLOAD_TEMP_DIR = '/tmp/uploads'

위의 설정에서 파일 업로드의 최대 메모리 크기를 FILE_UPLOAD_MAX_MEMORY_SIZE 변수로 설정하고, 임시 디렉토리를 FILE_UPLOAD_TEMP_DIR 변수로 설정합니다. 이 설정은 대용량 파일 업로드의 원활한 처리를 돕습니다.

2. Chunked 업로드 사용

Django REST framework는 큰 파일을 여러 작은 청크로 나누어 업로드하는 “Chunked 업로드”를 지원합니다. 이를 사용하면 대용량 파일이 메모리에 전체적으로 로드되지 않아도 되므로, 서버의 성능에 큰 영향을 미칠 수 있는 대용량 파일 업로드 문제를 방지할 수 있습니다.

Django REST framework에서 Chunked 업로드를 사용하려면 아래와 같이 설정해야 합니다:

# settings.py

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',  # Chunked 업로드를 위한 parser 추가
    ]
}

위의 설정을 적용하면, 클라이언트에서 Chunked 업로드를 지원하는 요청을 보낼 수 있습니다.

3. Chunked 업로드 처리

Django REST framework는 Chunked 업로드를 처리하기 위한 다양한 방법을 제공합니다. 가장 일반적인 방법은 FileUploadView를 상속하여 사용자 정의 View를 만드는 것입니다. 아래는 예시입니다:

# views.py

from rest_framework.views import APIView

class LargeFileUploadView(APIView):
    parser_classes = [ChunkedUploadParser]  # Chunked 업로드를 위한 parser 사용

    def post(self, request, format=None):
        file_obj = request.data['file']
        
        # 파일 처리 로직 작성

        return Response('File uploaded successfully')

위의 예시에서는 LargeFileUploadView라는 사용자 정의 View를 만들고 ChunkedUploadParser를 사용하여 Chunked 업로드를 처리합니다. post() 메서드에서는 업로드된 파일을 가져와 실제 파일 처리 작업을 수행할 수 있습니다.

4. static_chunk_size 설정

대용량 파일 업로드 시, 기본적으로 Chunked 업로드 크기가 1MB로 설정되어 있습니다. 만약 더 큰 크기의 청크를 사용하고 싶다면, settings.py에서 REST_FRAMEWORK 설정에 static_chunk_size를 추가하여 원하는 크기로 설정할 수 있습니다. 아래는 예시입니다:

# settings.py

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',
    ],
    'STATIC_CHUNK_SIZE': 5 * 1024 * 1024  # 5MB로 Chunked 업로드 크기 설정
}

위의 예시에서는 STATIC_CHUNK_SIZE를 5MB로 설정하였습니다.

결론

위에서 소개한 방법을 따르면 Django REST framework에서 대용량 파일을 처리하는데 도움이 될 것입니다. 파일 업로드 설정, Chunked 업로드 사용, Chunked 업로드 처리 등을 고려하여 안정적이고 효율적인 대용량 파일 처리가 가능합니다.

참고 자료