inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! FastAPI 입문

FastAPI 폴더 구조에 대해 질문이 있습니다.

해결된 질문

407

뱅준

작성한 질문수 27

0

안녕하세요. FastAPI 프로젝트의 폴더 구조에 대해서 궁금한 점이 생겨서 질문 드립니다.

처음에는 라우터에 모든 로직을 넣어서 라우터와 Repository만 분리해서 개발을 하다가, 3 레이어드 아키텍처로 분리를 좀 해볼까 생각이 들었습니다.

controller, service, repository 이렇게 나누어 보려고 하는데요. 예를들어 user, board와 같은 도메인이 있다고 하면, 각 폴더를 도메인별로 나누어서 구조를 잡는게 좋을까요? 아니면, controller 폴더 안에 user_controller.py, board_controller.py 등의 파일들이 모여있는게 좋을까요?

 

선생님께서는 실무에서 어떻게 폴더 구조를 가져가시는지도 궁금합니다.

감사합니다.

python 리팩토링 orm FastAPI pytest

답변 2

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 뱅준님.

FastAPI와 같은 백엔드 프레임워크에서는 일반적으로 코드의 유지보수성, 확장성을 고려하여 폴더 구조를 설계합니다. 3 레이어드 아키텍처(controller, service, repository)로 분리하는 것은 좋은 선택입니다. 도메인별로 폴더를 나누는 방법과, controller/service/repository 등 레이어별로 나누는 방법 모두 각각의 장단점이 있으므로 다음과 같이 설명드릴 수 있습니다.

  1. 도메인별 분리:

    • user, board와 같은 도메인별로 폴더를 나누는 경우, 각 도메인에 관련된 모든 레이어(controller, service, repository 등)가 하나의 폴더에 모여 있어 관련된 코드를 찾기 쉽다는 장점이 있습니다.
    • 장점: 각 도메인의 코드가 한 곳에 모여 있어 응집성이 높아지고, 필요한 기능을 추가하거나 수정하기가 용이합니다.
    • 단점: 동일한 레이어의 코드가 여러 폴더에 분산되어 있어, 특정 레이어의 구현 방식을 한눈에 파악하기 어려울 수 있습니다.
  2. 레이어별 분리:

    • controller, service, repository 폴더를 각각 분리하여, 내부에 user_controller.py, user_service.py와 같은 형식으로 파일을 두는 방법입니다.
    • 장점: 같은 레이어의 로직을 한 곳에 모아둠으로써, 공통적으로 사용되는 로직이나 규칙을 파악하기 용이합니다.
    • 단점: 특정 도메인(feature)에 대한 전체 흐름을 파악하기 위해 여러 폴더를 넘나들어야 할 수 있습니다.

실무에서는 프로젝트의 요구사항, 팀의 선호도, 프로젝트 규모에 따라 다르게 접근할 수 있습니다.

  • 소규모 프로젝트: 일반적으로 레이어별 구조가 관리하기 쉽습니다.
  • 대규모 프로젝트: 복잡도가 높기 때문에 도메인별 구조가 보다 유지보수가 용이할 수 있습니다.

관련된 유사 질문에 대한 답변을 참고하실 수 있도록 몇 가지 링크를 드립니다:

  1. api 데이터 모델링 시, pandantic? - FastAPI의 데이터 모델링에 대해 논의된 글입니다.
  2. DI 주입 - FastAPI에서의 의존성 주입(Dependency Injection)에 대해 다루고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

신동현

안녕하세요, 도메인 별로 먼저 나누고 내부에서 각 계층 별로 분리하는 것이 좋을 것 같습니다.

0

뱅준

감사합니다. 추가로 질문이 있는데요. 도메인에 대한 정의는 어떻게 하는게 좋을까요? 다루는 모델? 컨트롤 하고자 하는 주체?

이전에는 다루는 모델을 도메인으로 정의했는데, 폴더가 너무 많아져서 복잡해지더라구요.

0

신동현

서비스 특성에 따라 달라질 것 같은데요. 단순 모델끼리 분류하기 보다는 각 데이터 간의 관계에 따라서 재량껏 영역을 나눠야합니다.

0

뱅준

많은 도움 되었습니다. 감사합니다!

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