FastAPI는 강력하고 빠른 웹 프레임워크로, 프로젝트의 구조를 잘 설계하는 것이 중요합니다. 이 글에서는 FastAPI 프로젝트의 구조를 설계하는 방법을 소개하겠습니다.
1. 기본 구조
FastAPI 프로젝트를 시작할 때, 다음과 같은 기본 구조를 갖추는 것이 좋습니다.
my_project/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── models.py
│ └── routes/
│ ├── __init__.py
│ └── example.py
└── main.py
app
폴더 : FastAPI 애플리케이션과 관련된 코드를 담고 있는 폴더입니다.__init__.py
파일 : 애플리케이션 패키지를 초기화하는 파일입니다.main.py
파일 : FastAPI 애플리케이션 객체를 생성하고 실행하는 역할을 합니다.models.py
파일 : 데이터베이스 모델을 정의하는 파일입니다.routes
폴더 : 라우트 관련 코드를 담고 있는 폴더입니다.__init__.py
파일 : 패키지를 초기화하는 파일입니다.example.py
파일 : 예시로 사용할 라우트를 정의하는 파일입니다.
main.py
파일 : 프로젝트의 진입점 역할을 합니다. FastAPI 애플리케이션 객체를 생성하고 실행합니다.
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 공식 문서를 참고하시기 바랍니다.
참고 자료: