FastAPI 공식문서의 튜토리얼을 따라해보면 알겠지만, 각 섹션이 모여서 거대한 하나의 어플리케이션을 만드는게 아니라, 모든 파트가 나눠져있다. 따라서 이들은 모든 코드를 main.py안에서 해결한다.
하지만 실제 프로그램은 그렇게 돌아가지 않는다. 적절히 분산해서 import해서 사용하는 것이 일반적이다.
디렉토리 구조를 고민하던 와중에, 그동안 작성했던 FastAPI 시리즈를 보신 CTO님께서 회사에서 진행하는 신규 프로젝트에서 FastAPI를 적용해보자고 하셨다. 직장인 특성상 회사일을 하게되면 개인 프로젝트보다 조금 더 열심히 하게되는 특성이 있다. 열심히 구글링했고, 결국 FastAPI maintainer가 공개한 프로젝트 구조 예제를 찾았다. 그를 기반으로 조금 확장해서 디렉토리 구조를 아래와 같이 변경했다.
.
├── README.md
├── alembic
│ ├── README
│ ├── env.py
│ ├── script.py.mako
│ └── versions
├── alembic.ini
├── core
│ ├── __init__.py
│ ├── auth.py
│ └── config.py
├── crud
│ ├── __init__.py
│ └── user.py
├── database
│ ├── __init__.py
│ ├── models.py
│ └── session.py
├── main.py
├── requirements.txt
├── routers
│ ├── __init__.py
│ ├── deps.py
│ ├── router.py
│ └── user.py
├── run.sh
└── schemas
├── __init__.py
└── user.py
alembic - database migration을 담당한다.
alembic_version
table을 확인해서 에러를 수정해야 한다.versions
디렉토리 내의 파일을 수정해서 에러를 해결할 수도 있다.core
auth.py
와 환경변수를 담당하는 config.py
를 생성했다.crud
routers
deps.py
에 선언한다schemas
pydantic
의 BaseModel
을 사용하지 않으면 해당 값을 request body로 인식하지 못하고 query parameter로 받아들이는 문제가 있다.