인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

뱅준님의 프로필 이미지

작성한 질문수

실전! FastAPI 입문

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

해결된 질문

작성

·

76

0

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

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

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

 

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

감사합니다.

답변 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

신동현님의 프로필 이미지
신동현
지식공유자

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

뱅준님의 프로필 이미지
뱅준
질문자

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

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

신동현님의 프로필 이미지
신동현
지식공유자

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

뱅준님의 프로필 이미지
뱅준
질문자

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

뱅준님의 프로필 이미지

작성한 질문수

질문하기