FastAPI 폴더 구조에 대해 질문이 있습니다.
안녕하세요. FastAPI 프로젝트의 폴더 구조에 대해서 궁금한 점이 생겨서 질문 드립니다.
처음에는 라우터에 모든 로직을 넣어서 라우터와 Repository만 분리해서 개발을 하다가, 3 레이어드 아키텍처로 분리를 좀 해볼까 생각이 들었습니다.
controller, service, repository 이렇게 나누어 보려고 하는데요. 예를들어 user, board와 같은 도메인이 있다고 하면, 각 폴더를 도메인별로 나누어서 구조를 잡는게 좋을까요? 아니면, controller 폴더 안에 user_controller.py, board_controller.py 등의 파일들이 모여있는게 좋을까요?
선생님께서는 실무에서 어떻게 폴더 구조를 가져가시는지도 궁금합니다.
감사합니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. 뱅준님.
FastAPI와 같은 백엔드 프레임워크에서는 일반적으로 코드의 유지보수성, 확장성을 고려하여 폴더 구조를 설계합니다. 3 레이어드 아키텍처(controller, service, repository)로 분리하는 것은 좋은 선택입니다. 도메인별로 폴더를 나누는 방법과, controller/service/repository 등 레이어별로 나누는 방법 모두 각각의 장단점이 있으므로 다음과 같이 설명드릴 수 있습니다.
도메인별 분리:
- user, board와 같은 도메인별로 폴더를 나누는 경우, 각 도메인에 관련된 모든 레이어(controller, service, repository 등)가 하나의 폴더에 모여 있어 관련된 코드를 찾기 쉽다는 장점이 있습니다.
- 장점: 각 도메인의 코드가 한 곳에 모여 있어 응집성이 높아지고, 필요한 기능을 추가하거나 수정하기가 용이합니다.
- 단점: 동일한 레이어의 코드가 여러 폴더에 분산되어 있어, 특정 레이어의 구현 방식을 한눈에 파악하기 어려울 수 있습니다.
- user, board와 같은 도메인별로 폴더를 나누는 경우, 각 도메인에 관련된 모든 레이어(controller, service, repository 등)가 하나의 폴더에 모여 있어 관련된 코드를 찾기 쉽다는 장점이 있습니다.
레이어별 분리:
- controller, service, repository 폴더를 각각 분리하여, 내부에 user_controller.py, user_service.py와 같은 형식으로 파일을 두는 방법입니다.
- 장점: 같은 레이어의 로직을 한 곳에 모아둠으로써, 공통적으로 사용되는 로직이나 규칙을 파악하기 용이합니다.
- 단점: 특정 도메인(feature)에 대한 전체 흐름을 파악하기 위해 여러 폴더를 넘나들어야 할 수 있습니다.
- controller, service, repository 폴더를 각각 분리하여, 내부에 user_controller.py, user_service.py와 같은 형식으로 파일을 두는 방법입니다.
실무에서는 프로젝트의 요구사항, 팀의 선호도, 프로젝트 규모에 따라 다르게 접근할 수 있습니다.
- 소규모 프로젝트: 일반적으로 레이어별 구조가 관리하기 쉽습니다.
- 대규모 프로젝트: 복잡도가 높기 때문에 도메인별 구조가 보다 유지보수가 용이할 수 있습니다.
관련된 유사 질문에 대한 답변을 참고하실 수 있도록 몇 가지 링크를 드립니다:
- api 데이터 모델링 시, pandantic? - FastAPI의 데이터 모델링에 대해 논의된 글입니다.
- DI 주입 - FastAPI에서의 의존성 주입(Dependency Injection)에 대해 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
FasAPI Swagger UI에서 단일조회 todo_id 를 사용했는데, 입력값에 1을 넣으니 오류가 뜹니다 ㅠ
0
86
2
DB 질문
0
80
2
Post API 강의 질문
0
54
2
post 작성 오류
0
106
3
uvicorn 종료 문제
0
435
2
왜 return타입이 ToDo라는 스트링인가요?
0
130
2
ORM 연관관계
0
109
2
Oracle DB 연결과 관련해 질문이 있습니다..
0
153
2
섹션 2, 3의 PATCH API의 차이점
0
132
1
ORM 테이블 생성
0
119
1
테스트 코드 오류
0
177
1
orm relationship 정의 중 해당 에러 발생 시 어떻게 고쳐야 하는걸까요
0
214
3
질문 있습니다.
0
160
2
ORM 개념
0
133
1
mysql root 비밀번호 변경관련
0
295
2
[질문] patch API
0
151
3
디자인 패턴
0
128
1
main.py 리로드문제
0
235
2
인터프리터 오류
0
285
4
로그 저장에 대한 질문입니다.
0
100
1
Internal Server Error
0
239
2
PATCH API - 수정
0
198
2
파이참 임포트 문제
0
259
1
INFO sqlalchemy.engine.Engine ROLLBACK
0
215
1





