[python] FastAPI에서 프로젝트 구조 설계하기

FastAPI는 강력하고 빠른 웹 프레임워크로, 프로젝트의 구조를 잘 설계하는 것이 중요합니다. 이 글에서는 FastAPI 프로젝트의 구조를 설계하는 방법을 소개하겠습니다.

1. 기본 구조

FastAPI 프로젝트를 시작할 때, 다음과 같은 기본 구조를 갖추는 것이 좋습니다.

my_project/
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── models.py
│   └── routes/
│       ├── __init__.py
│       └── example.py
└── main.py

2. 모듈화

FastAPI 프로젝트에서는 routes 폴더 아래에 각각의 라우트를 별도의 모듈로 분리하는 것이 좋습니다. 예를 들어, example.py 파일에는 /example 엔드포인트와 관련된 코드를 작성합니다.

이렇게 모듈화를 하면 코드의 가독성, 유지보수성이 향상되고, 각각의 모듈은 독립적으로 개발, 테스트할 수 있습니다.

3. 데이터베이스 모델

FastAPI에서 데이터베이스를 사용할 경우, models.py 파일에 데이터베이스 모델을 정의하는 것이 일반적입니다. 이 파일에서는 ORM(Object-Relational Mapping)을 사용하여 데이터베이스 테이블과 매핑되는 모델 클래스를 작성합니다.

예를 들어, SQLAlchemy를 사용한다면 다음과 같이 코드를 작성할 수 있습니다:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True, index=True)
    email = Column(String)

4. 의존성 주입

FastAPI에서는 의존성 주입(Dependency Injection)을 사용하여 코드의 재사용성과 테스트 용이성을 높일 수 있습니다. 의존성 주입은 각각의 의존성을 외부에서 주입받아 사용하는 방식으로, 의존성을 직접 생성하거나 제어하지 않는 대신, 외부에서 주입받아 사용합니다.

FastAPI에서는 Depends 데코레이터를 사용하여 의존성을 주입할 수 있습니다. 예를 들어, 데이터베이스 연결을 주입 받는 코드는 다음과 같이 작성할 수 있습니다:

async def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users/{user_id}")
async def read_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    return user

마무리

FastAPI에서 프로젝트를 구조화하는 방법을 알아보았습니다. 이러한 구조는 코드의 유지보수성과 확장성을 향상시키는 데 도움이 됩니다. 추가로, 의존성 주입을 통해 테스트 용이성도 높일 수 있습니다.

더 많은 정보를 원하실 경우 FastAPI 공식 문서를 참고하시기 바랍니다.

참고 자료: