FastAPI 서버개발, FastAPI 애플리케이션 구조화, 모델 구현

FastAPI는 현대적인 웹 애플리케이션 개발을 쉽게 하고 효율적으로 할 수 있도록 돕는 python 웹 프레임워크입니다.
이 글에서는 FastAPI를 활용하여 서버를 개발하는 방법, 애플리케이션을 구조화하는 방법, 그리고 모델을 구현하는 방법에 대해 이야기하겠습니다.
이 글은 FastAPI에 대한 기본적인 이해가 있는 독자들을 대상으로 하며,
고급 개발 기법과 모범 사례를 포함하여 실제 애플리케이션 구현 과정 전반을 다룰 것입니다.

FastAPI란?

FastAPI는 Asynchronous Python 웹 프레임워크로, Python 3.6 이상을 지원하며,
고속의 웹 API를 구축하는 데 적합합니다. FastAPI는 다음과 같은 주요 특징을 가지고 있습니다:

  • 자동 문서화: OpenAPI 및 Swagger UI를 사용하여 API를 쉽게 문서화합니다.
  • 비동기 지원: async/await 구문을 통해 비동기 처리를 구현하여 성능을 극대화합니다.
  • 입력 검증: Pydantic을 사용한 요청 및 응답 데이터 검증이 가능합니다.
  • 사용이 용이: 간결한 코드 작성과 쉬운 학습 곡선으로 빠르게 시작할 수 있습니다.

FastAPI 설치

FastAPI를 사용하기 위해서는 우선 FastAPI 라이브러리와 ASGI 서버인 uvicorn을 설치해야 합니다.

bash
pip install fastapi uvicorn

FastAPI 애플리케이션 구조화

FastAPI 애플리케이션을 구조화하는 것은 애플리케이션을 유지보수하고 확장 가능하게 만드는 데 중요한 요소입니다.
일반적인 프로젝트 구조는 다음과 같이 구성됩니다:


my_fastapi_app/
├── app/
│   ├── main.py                   # 애플리케이션의 진입점
│   ├── api/                      # API 라우터
│   │   ├── __init__.py
│   │   └── endpoints/
│   │       ├── __init__.py
│   │       ├── items.py          # 아이템 관련 API
│   │       └── users.py          # 사용자 관련 API
│   ├── models/                   # Pydantic 모델 정의
│   │   ├── __init__.py
│   │   ├── item.py               # 아이템 모델
│   │   └── user.py               # 사용자 모델
│   └── database.py               # 데이터베이스 연결 및 설정
├── requirements.txt              # 필요한 패키지 목록
└── README.md                     # 프로젝트 설명

main.py

FastAPI 애플리케이션의 진입점인 main.py 파일을 작성합니다.
이 파일은 애플리케이션을 시작하고 API 라우터를 포함하는 역할을 합니다.

python
from fastapi import FastAPI
from app.api.endpoints import items, users

app = FastAPI()

# API 라우터 포함
app.include_router(items.router)
app.include_router(users.router)

@app.get("/")
def read_root():
    return {"Hello": "World"}

API 라우터 – items.py

이 파일에서는 아이템에 대한 API 엔드포인트를 정의합니다.

python
from fastapi import APIRouter
from app.models.item import Item

router = APIRouter()

@router.post("/items/")
async def create_item(item: Item):
    return item

@router.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id, "name": "sample item"}

모델 구현 – item.py

Pydantic 모델을 정의하여 데이터 유효성을 검사합니다.

python
from pydantic import BaseModel

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

API 라우터 – users.py

사용자 관련 API 엔드포인트를 정의합니다.

python
from fastapi import APIRouter
from app.models.user import User

router = APIRouter()

@router.post("/users/")
async def create_user(user: User):
    return user

@router.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id, "name": "sample user"}

모델 구현 – user.py

사용자 관련 모델을 정의합니다.

python
from pydantic import BaseModel

class User(BaseModel):
    username: str
    email: str
    full_name: str = None

데이터베이스 설정

FastAPI에서 SQLAlchemy와 같은 ORM을 사용하여 데이터베이스와의 상호작용을 설정할 수 있습니다.
database.py 파일을 작성하여 데이터베이스 연결을 구성합니다.

python
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"  # SQLite 데이터베이스 사용
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

FastAPI 애플리케이션 실행

이제 FastAPI 애플리케이션을 실행해 봅시다. 아래와 같은 명령어로 uvicorn을 통해 서버를 시작합니다.

bash
uvicorn app.main:app --reload

서버가 실행되면 http://127.0.0.1:8000/docs에서 자동으로 생성된 Swagger UI를 통해 API를 테스트할 수 있습니다.

결론

FastAPI는 매우 강력하고 유연한 웹 프레임워크로, 데이터 검증 및 비동기 처리를 지원하여 현대적인 웹 API를 구축하는 데 적합합니다.
이 글에서는 FastAPI 서버 개발의 기초와 애플리케이션 구조화, 모델 구현 방법에 대해 알아보았습니다.
FastAPI의 추가 기능과 고급 주제에 대해서는 공식 문서를 참조하여 더욱 깊이 있는 학습을 이어가시기 바랍니다.

성공적인 FastAPI 개발을 기원합니다!