FastAPI 서버개발, 파일 다운로드 및 스트리밍 처리

FastAPI는 성능이 뛰어나고 사용하기 쉬운 웹 프레임워크로, Python으로 웹 API를 구축하는 데 많은 인기를 끌고 있습니다. 본 글에서는 FastAPI를 사용하여 파일 다운로드 및 스트리밍을 구현하는 방법에 대해 다루겠습니다. 파일 다운로드 기능은 웹 애플리케이션에서 사용자의 데이터를 쉽게 받을 수 있게 해주며, 대용량 파일 스트리밍 처리 또한 많은 경우에 중요합니다.

1. FastAPI 소개

FastAPI는 Python에서 API를 쉽고 빠르게 생성할 수 있도록 도와주는 모던한 웹 프레임워크입니다. 많은 기능이 내장되어 있으며, 특히 자동으로 문서화하는 기능과 유효성 검사를 지원합니다. FastAPI의 장점은 다음과 같습니다:

  • 높은 성능과 비동기 처리를 지원
  • 자동 문서화
  • 유효성 검사 및 데이터 검사기 지원
  • 간단한 설정과 직관적인 API 디자인

2. 필요한 라이브러리 설치

먼저 FastAPI와 파일 처리를 위한 Uvicorn 및 aiofiles를 설치해야 합니다. Uvicorn은 ASGI 서버로, FastAPI 앱을 실행하는 데 필요한 서버입니다. aiofiles는 비동기 파일 처리를 도와줍니다.

bash
pip install fastapi uvicorn aiofiles

3. 기본 FastAPI 서버 설정

FastAPI 애플리케이션을 설정하고 기본 엔드포인트를 생성하는 방법에 대해 설명하겠습니다.

python
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Welcome to FastAPI!"}

위의 코드를 사용하여 기본 FastAPI 서버를 생성했습니다. 이제 Uvicorn을 사용하여 이 앱을 실행할 수 있습니다.

bash
uvicorn main:app --reload

4. 파일 다운로드 구현

이제 파일 다운로드 기능을 구현해 보겠습니다. 사용자가 특정 파일을 요청할 때 해당 파일을 클라이언트로 다운로드할 수 있게 하는 API를 제작합니다.

python
import os
from fastapi import FastAPI
from fastapi.responses import FileResponse

app = FastAPI()

@app.get("/download/{file_name}")
async def download_file(file_name: str):
    file_path = os.path.join("files", file_name)  # 'files' 디렉토리에서 파일을 찾습니다.
    if os.path.exists(file_path):
        return FileResponse(file_path)
    return {"error": "File not found"}

위의 코드는 ‘files’ 디렉토리 내의 파일을 다운로드할 수 있도록 합니다. 파일이 존재하지 않을 경우 오류 메시지를 반환합니다. FastAPI의 FileResponse 클래스를 사용하여 파일을 클라이언트에 전송합니다.

5. 파일 스트리밍 처리

파일 스트리밍은 대용량 파일을 클라이언트에 전달할 때 중요합니다. FastAPI에서 파일 스트리밍을 구현하는 방법을 알아보겠습니다. 스트리밍 처리는 StreamingResponse 클래스를 사용하여 구현됩니다.

python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse

@app.get("/stream/{file_name}")
async def stream_file(file_name: str):
    file_path = os.path.join("files", file_name)
    if os.path.exists(file_path):
        def iter_file():
            with open(file_path, "rb") as file:
                yield from file  # 파일을 읽어서 스트리밍합니다.
        
        return StreamingResponse(iter_file(), media_type="application/octet-stream")
    return {"error": "File not found"}

위 코드는 요청된 파일을 스트리밍 방식으로 전달합니다. iter_file 함수는 파일의 내용을 바이트 스트림 형태로 읽어 클라이언트에 전송하는 역할을 합니다. 이를 통해 고객은 대형 파일을 점진적으로 받을 수 있습니다.

6. 멀티프레드 다운로드

파일 다운로드를 최적화하기 위해 멀티프레드 다운로드를 구현할 수 있습니다. 이는 파일을 여러 개의 작은 조각으로 나누어 동시에 다운로드하도록 하는 것입니다. 하지만 FastAPI에는 기본적으로 멀티프레드 다운로드 기능이 제공되지 않으므로 클라이언트 측에서 이를 구현해야 합니다.

7. 결론

이글에서는 FastAPI를 사용하여 파일 다운로드 및 스트리밍 기능을 구현하는 방법에 대해 알아보았습니다. FastAPI는 이러한 기능을 쉽게 구현할 수 있게 해주며, 비동기 처리로 성능을 극대화할 수 있습니다. 여러분의 프로젝트에서도 FastAPI를 활용해 보시기 바랍니다.

이제 여러분은 FastAPI의 파일 다운로드 및 스트리밍 처리에 대한 기본적인 이해를 얻으셨습니다. 더 깊이 있는 조사를 통해 FastAPI의 모든 기능을 활용해 보시기 바랍니다.