본문으로 건너뛰기

FastAPI 소개

FastAPI는 표준 Python 타입 힌트를 기반으로 한 Python 3.7+용 현대적이고 빠른 (고성능) 웹 프레임워크입니다. 사용하기 쉽고 효율적이며, NodeJS 및 Go 프레임워크와 비교할 만큼 높은 성능을 제공하는 것이 목표로 설계되었습니다.

FastAPI는 고성능 비동기 프레임워크인 Starlette와 강력한 데이터 유효성 검사 및 직렬화 라이브러리인 Pydantic을 기반으로 구축되었습니다. 이러한 라이브러리의 최상의 기능을 결합하여 직관적이고 효율적인 API 구축 방법을 제공합니다.

역사

FastAPI는 Sebastián Ramírez에 의해 2018년에 만들어졌으며, 그 빠른 속도와 사용 편의성으로 인해 빠르게 인기를 얻었습니다. 이제 FastAPI는 API 구축을 위한 가장 인기 있는 Python 프레임워크 중 하나입니다.

FastAPI의 기능

  1. 빠름: FastAPI는 비동기 프로그래밍과 고성능 구성 요소의 사용으로 인해 사용 가능한 가장 빠른 Python 프레임워크 중 하나로 설계되었습니다.

  2. 사용하기 쉬움: FastAPI는 사용하기 쉽도록 설계되었으며, 간단하고 직관적인 API를 제공합니다. OpenAPI 및 JSON Schema를 사용하여 API 문서를 자동으로 생성합니다.

  3. 타입 검사: FastAPI는 Python 타입 힌트를 활용하여 자동 데이터 유효성 검사 및 직렬화를 제공합니다. Pydantic 모델을 사용하여 요청 및 응답 유형을 정의하므로 데이터 유효성 검사와 직렬화를 쉽게 처리할 수 있습니다.

  4. 비동기 지원: FastAPI는 비동기 프레임워크인 Starlette 위에 구축되었습니다. 이를 통해 Python의 asyncawait 키워드를 사용하여 비동기 코드를 작성할 수 있으므로 고성능 및 동시 API 작업이 가능합니다.

  5. 의존성 주입: FastAPI는 의존성 주입을 지원하여 API 엔드포인트에서 의존성을 쉽게 관리하고 주입할 수 있습니다. 이를 통해 코드를 구성하고 모듈화하는 것이 간단해집니다.

  6. WebSocket 지원: FastAPI는 WebSocket 통신을 내장하여 실시간 애플리케이션을 쉽게 구축할 수 있습니다.

  7. 인증 및 권한 부여: FastAPI는 API 엔드포인트에 인증 및 권한 부여를 추가하기 위한 내장 지원을 제공합니다. OAuth2, JWT 등 다양한 인증 방법을 지원합니다.

이제 몇 가지 예제를 통해 이러한 기능을 실제로 확인해 보겠습니다.

예제 1: FastAPI를 사용하여 간단한 API 생성

FastAPI를 사용하여 간단한 API를 생성하는 방법부터 시작해 보겠습니다. /hello 엔드포인트를 만들어 인사 메시지가 포함된 JSON 응답을 반환하는 예제입니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/hello")
def hello():
return {"message": "안녕하세요, FastAPI!"}

이 예제에서는 fastapi 모듈에서 FastAPI 클래스를 가져옵니다. 그런 다음 FastAPI의 인스턴스를 생성하고 @app.get 데코레이터를 사용하여 엔드포인트를 정의합니다. hello 함수는 /hello 엔드포인트의 핸들러로, 인사 메시지가 포함된 JSON 응답을 반환합니다.

API를 실행하기 위해 다음 명령을 사용할 수 있습니다:

uvicorn main:app --reload

이제 브라우저에서 http://localhost:8000/hello를 방문하면 JSON 응답인 {"message": "안녕하세요, FastAPI!"}를 볼 수 있습니다.

예제 2: 요청 유효성 검사 및 직렬화

FastAPI는 요청 유효성 검사와 직렬화를 위해 Pydantic 모델을 사용합니다. 이전 예제를 수정하여 요청 데이터를 유효성 검사하고 직렬화하는 방법을 알아보겠습니다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class HelloRequest(BaseModel):
name: str

@app.post("/hello")
def hello(request: HelloRequest):
return {"message": f"안녕하세요, {request.name}!"}

이 예제에서는 Pydantic을 사용하여 HelloRequest 모델을 정의합니다. 이 모델은 str 유형의 name 하나의 필드를 가지고 있습니다. 그런 다음 /hello 엔드포인트를 수정하여 HelloRequest 객체를 요청 본문으로 받도록 합니다. FastAPI는 요청 본문을 자동으로 모델과 비교하여 유효성을 검사하고 직렬화합니다.

http://localhost:8000/hello로 POST 요청을 보내면 {"name": "John"}과 같은 JSON 본문을 함께 보내면, API는 {"message": "안녕하세요, John!"}라는 응답을 반환합니다.

예제 3: 비동기 엔드포인트

FastAPI를 사용하면 Python의 asyncawait 키워드를 사용하여 비동기 코드를 작성할 수 있습니다. 이를 통해 고성능 및 동시 API 작업이 가능합니다. 이전 예제를 수정하여 /hello 엔드포인트를 비동기로 만들어 보겠습니다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class HelloRequest(BaseModel):
name: str

@app.post("/hello")
async def hello(request: HelloRequest):
return {"message": f"안녕하세요, {request.name}!"}

이 예제에서는 hello 함수에 async 키워드를 추가하여 비동기로 만듭니다. 이를 통해 함수는 await를 사용하여 실행을 일시 중단하고 다른 비동기 작업을 기다릴 수 있습니다.

예제 4: 의존성 주입

FastAPI는 의존성 주입을 지원하여 API 엔드포인트에 의존성을 쉽게 관리하고 주입할 수 있습니다. 이전 예제를 수정하여 /hello 엔드포인트에 의존성을 주입해 보겠습니다.

from fastapi import Depends, FastAPI
from pydantic import BaseModel

app = FastAPI()

class HelloRequest(BaseModel):
name: str

def get_greeting():
return "안녕하세요"

@app.post("/hello")
async def hello(request: HelloRequest, greeting: str = Depends(get_greeting)):
return {"message": f"{greeting}, {request.name}!"}

이 예제에서는 인사 메시지를 반환하는 get_greeting 함수를 정의합니다. 그런 다음 /hello 엔드포인트를 수정하여 인사 메시지를 의존성으로 주입하도록 합니다. FastAPI는 의존성을 자동으로 해결하고 엔드포인트 함수에 전달합니다.

더 자세한 정보 및 상세한 문서는 공식 FastAPI 웹사이트에서 확인할 수 있습니다: https://fastapi.tiangolo.com/.