본문 바로가기
Web framework/FastAPI

FastAPI 공부하기

by Tarake 2024. 12. 7.

서론


FastAPI란 무엇이고 어떻게 사용하는지 간단히 정리하고자 합니다.

 

https://github.com/hosunghyun/Smart_Makeup_Web.git

 

GitHub - hosunghyun/Smart_Makeup_Web: 웹으로 캠을 사용하여 서버로 화장 시뮬레이션을 제공

웹으로 캠을 사용하여 서버로 화장 시뮬레이션을 제공. Contribute to hosunghyun/Smart_Makeup_Web development by creating an account on GitHub.

github.com

  최근에 진행한 Smart MakeUP 프로젝트에서 팀원이 서브 서버로 FastAPI를 사용하여 화장하기 기능을 구현하였습니다. 어느 정도 설명을 들어 FastAPI를 이해하고 있지만 이해하는 것과 아는 것은 다르다는 말이 있듯이 이해하는 것을 넘어서 아는 단계로 넘어가기 위해서 FastAPI라는 프레임워크를 공부해보고자 합니다.

 

FastAPI란?

FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트에 기초한 Python의 API를 빌드하기 위한 웹 프레임워크입니다.

https://fastapi.tiangolo.com/ko/

 

FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com

FastAPIPython 기반이 웹 프레임워크로 REST API를 빠르게 개발할 수 있도록 설계되었습니다. FlaskDjango와 같은 기존의 웹 프레임워크보다 2배 정도 빠른 성능과 간편한 사용성을 제공하며 Python타입 추정을 적극적으로 활용하여 코드의 가독성과 유지보수성을 높였습니다.

 

FastAPI의 특징

고성능

  • FastAPI는 Starlette와 Pydantic을 기반으로 하고 있어 속도가 매우 빠릅니다.
  • Python의 asyncio를 활용하여 비동기적 처리가 가능하여 이를 통해 성능을 향상시킬 수 있습니다.

자동화된 문서화

  • Swagger UIReDoc을 통해 API 문서를 자동으로 생성할 수 있습니다.

비동기 지원 (Async/Await)

  • FastAPI는 비동기 프로그래밍을 지원합니다. async def 를 사용하여 비동기 엔드포인트를 작성할 수 있습니다.

오류 처리 및 예외 처리

  • FastAPI는 내장된 예외 처리 기능을 제공하여 HTTP 상태 코드와 오류 메시지를 쉽게 반환할 수 있습니다.

보안

  • FastAPIOAuth2, JWT(Json Web Tokens), HTTP Basic 인증 등 다양한 인증 및 권한 부여 방법을 지원합니다.

 

FastAPI 사용 방법

FastAPI 설치하기

pip install fastapi

위에 코드를 터미널에 입력해주면 Python 패키지로 제공되는 FastAPI를 설치할 수 있습니다.

 

기본 구조

from fastapi import FastAPI
app = FastAPI()

FastAPI 앱은 기본적으로 위에 코드로 시작합니다.

 

@app.get("/")
def 함수명():
    return 반환할 데이터

FastAPI 기본 구조는 위에 코드와 같습니다. Spring Boot와 비슷하게 동작합니다. get 안에 부분은 브라우저 입력창에 작성된 주소를 받는 부분으로 FastAPI 주소 다음에 / 를 입력하면 위에 코드가 동작하게 됩니다.

 

def 한 다음에는 동작에 맞는 함수명을 작성하면 됩니다. 함수가 동작하면서 메시지를 반환하게 됩니다.

 

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

/items/{item_id}는 URL 경로 매개변수 item_id를 정수형으로 받으며, 선택적인 쿼리 매개변수 q를 추가로 받을 수 있습니다.

 

HTML 파일 전송

from fastapi.responses import FileResponse

FastAPI에서는 FileResponse를 사용해서 HTML 파일을 클라이언트에게 전송할 수 있습니다. 이 방식은 HTML 뿐만 아니라 이미지, PDF 파일 등 다른 유형의 파일도 전송할 수 있습니다.

 

# 예시 HTML 파일 경로
html_file_path = os.path.join(os.getcwd(), "index.html")

@app.get("/")
def read_html():
    # FileResponse를 사용하여 HTML 파일을 응답으로 전송
    return FileResponse(html_file_path)

이런식으로 HTML 파일을 클랑이언트에게 전송할 수 있습니다.

 

비동기 지원

FastAPI는 비동기 요청을 쉽게 처리할 수 있습니다. 비동기 처리를 위해 async def를 사용하면, 다른 비동기 작업을 병렬로 실행할 수 있습니다.

@app.get("/async-endpoint")
async def async_endpoint():
    # 비동기 작업 예시
    return {"status": "Async task completed"}

 

데이터 검증과 Type Hints

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    description: str = None
    tax: float = None

@app.post("/items/")
def create_item(item: Item):
    return {"item_name": item.name, "item_price": item.price}

이 코드에서 Item 클래스는 요청 본문 데이터의 구조를 정의하며, FastAPI는 이를 자동으로 검증하고 타입에 맞는 데이터만을 처리합니다.

 

자동 문서화

FastAPIOpenAPI 스펙을 기반으로 하는 자동 문서화를 제공합니다. 위에서 정의한 엔드포인트는 /docs에서 Swagger UI를, /redoc에서 ReDoc을 통해 확인할 수 있습니다.

 

CORS 및 보안 설정

웹 애플리케이션의 보안을 위해 CORS 설정이 필요할 수 있습니다. FastAPI starlette.middleware.cors.CORSMiddleware를 통해 쉽게 설정할 수 있습니다

from starlette.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 필요한 경우 특정 도메인만 허용
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

 

배포

pip install uvicorn

먼저 배포하기 전에 uvicorn을 설치해야 합니다.

 

uvicorn main:app --host 0.0.0.0 --port 8000

위에 코드를 터미널에 작성하거나 따로 main함수를 제작하여 작성하면 FastAPI는 ASGI 서버를 통해 배포할 수 있습니다.