1. FastAPI 기초 다지기

1. FastAPI 기초 다지기

FastAPI 기초다지기


  • 개발환경은 여기를 참조해주세요.

FastAPI 프로젝트 구조

  • FastAPI 프로젝트를 만들고자 한다면 프로젝트 구조를 잘 만들어야 한다. 그런데 FastAPI에는 프로젝트의 구조를 정의하는 규칙이 없다. (?)
  • 기본적으로는 아래의 구조를 가진다.
├── main.py
├── database.py
├── models.py
├── domain
│   ├── answer
│   ├── question
│   └── user
└── frontend

프로젝트를 설정하는 main

  • main.py는 FastAPI 애플리케이션의 진입점 역할을 합니다.
  • 여기서 라우터를 등록, 미들웨어 설정, 데이터베이스 연결 등을 수행합니다.
from fastapi import FastAPI
from domain.question import question_router
from domain.answer import answer_router
from domain.user import user_router

app = FastAPI()

# 라우터 등록
app.include_router(question_router.router, prefix="/questions", tags=["questions"])
app.include_router(answer_router.router, prefix="/answers", tags=["answers"])
app.include_router(user_router.router, prefix="/users", tags=["users"])
  • 주요 역할:
    • FastAPI 객체 생성
    • 라우터를 include_router로 등록
    • (선택) 데이터베이스 연결, 미들웨어 추가

데이터베이스를 설정하는 database

  • database.py는 데이터베이스와의 연결 및 ORM 설정을 담당합니다.
  • FastAPI에서는 일반적으로 SQLAlchemy 또는 Tortoise ORM을 사용합니다.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
  • 주요 역할:
    • 데이터베이스 URL 정의
    • 엔진과 세션 구성
    • Base 객체 생성 (모델 클래스의 기반)

모델을 관리하는 models

  • models.py는 데이터베이스 테이블을 정의하는 파일입니다.
  • SQLAlchemy를 사용하여 각 테이블의 스키마를 선언합니다.
from sqlalchemy import Column, Integer, String, Text, ForeignKey
from database import Base

class Question(Base):
    __tablename__ = "questions"
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    content = Column(Text)
    user_id = Column(Integer, ForeignKey("users.id"))

API 프로젝트 구조 비교

1. Domain-Driven Design (DDD) 기반 구조

구조 설명

  • 도메인별로 비즈니스 로직, 데이터 처리, 라우팅, 스키마를 모듈화하여 관리합니다.
  • 도메인이 복잡하거나 확장 가능한 시스템에서 적합합니다.

구조 예시

project/
├── domain/
│   ├── question/
│   │   ├── question_router.py
│   │   ├── question_crud.py
│   │   └── question_schema.py
│   ├── answer/
│   └── user/
├── main.py
├── database.py
└── models.py

2. Service-Oriented Architecture (SOA)

구조 설명

  • 기능별로 서비스를 분리하여 관리합니다. 각 서비스는 독립적이며, 서로 최소한의 의존성을 가집니다.
  • 대규모 서비스에서 적합하며, 마이크로서비스로 전환하기 쉽게 확장 가능합니다.

구조 예시

project/
├── services/
│   ├── user_service/
│   │   ├── router.py
│   │   ├── service.py
│   │   └── models.py
│   ├── product_service/
│   │   ├── router.py
│   │   ├── service.py
│   │   └── models.py
│   └── order_service/
│       ├── router.py
│       ├── service.py
│       └── models.py
├── main.py
└── shared/
    ├── database.py
    └── utils

3. Monolithic 구조

구조 설명

  • 단일 코드베이스에서 모든 기능을 관리합니다.
  • 소규모 프로젝트 또는 빠른 개발 주기를 요구하는 프로젝트에 적합합니다.

구조 예시

project/
├── app/
│   ├── routers/
│   │   ├── user_router.py
│   │   ├── product_router.py
│   │   └── order_router.py
│   ├── models/
│   │   ├── user_model.py
│   │   ├── product_model.py
│   │   └── order_model.py
│   └── services/
│       ├── user_service.py
│       ├── product_service.py
│       └── order_service.py
├── main.py
└── database.py

구조 비교

구조 장점 단점 적합한 프로젝트
Domain-Driven Design (DDD) 모듈화로 유지보수 및 확장성 용이 초기 설계 및 도메인 정의에 시간 소요 복잡하고 도메인이 명확한 프로젝트
Service-Oriented Architecture (SOA) 독립성 높은 서비스로 마이크로서비스 전환 용이, 대규모 시스템 관리 적합 서비스 간 통신 설계 및 관리의 복잡성 대규모 및 확장 가능한 프로젝트
Monolithic 구조 간단한 구조로 빠른 개발 가능 규모가 커지면 유지보수 어려움 소규모 프로젝트, 프로토타이핑 등
RSS Feed
마지막 수정일자