몸과 마음이 건전한 SW 개발자

FastAPI 백엔드 개발 가이드: API 구현 순서와 모던 개발 방법론 [3탄] 본문

백엔드

FastAPI 백엔드 개발 가이드: API 구현 순서와 모던 개발 방법론 [3탄]

스위태니 2025. 8. 12. 17:09
728x90

6. Testing 전략

테스트 피라미드 구현

1. 단위 테스트 (70%)

# Repository 단위 테스트
def test_user_repository_create():
    # Given
    user_data = UserCreate(email="test@example.com", username="testuser",
password="password123")

    # When
    user = repository.create(user_data)

    # Then
    assert user.email == "test@example.com"
    assert user.id is not None

# Service 단위 테스트
def test_user_service_business_logic():
    # Mock 의존성을 사용한 비즈니스 로직 테스트
    pass

2. 통합 테스트 (20%)

# API 엔드포인트 테스트
def test_user_creation_flow():
    # 전체 요청-응답 플로우 테스트
    pass

# 데이터베이스 연동 테스트
def test_database_operations():
    # 실제 데이터베이스와의 상호작용 테스트
    pass

3. E2E 테스트 (10%)

# 전체 사용자 시나리오 테스트
def test_complete_user_journey():
    # 사용자 등록 -> 로그인 -> 프로필 수정 -> 탈퇴
    pass

테스트 데이터 관리

# tests/fixtures.py
import pytest
from app.domain.users.models.user import User

@pytest.fixture
def sample_user_data():
    return {
        "email": "test@example.com",
        "username": "testuser",
        "password": "password123"
    }

@pytest.fixture
def created_user(db_session, sample_user_data):
    user = User(**sample_user_data)
    db_session.add(user)
    db_session.commit()
    return user

# 테스트에서 사용
def test_get_user(created_user):
    assert created_user.email == "test@example.com"

7. 배포 및 운영

Docker 컨테이너화

# Dockerfile
FROM python:3.11-slim

WORKDIR /app

# Poetry 설치
RUN pip install poetry

# 의존성 복사 및 설치
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false \\
    && poetry install --no-dev

# 소스 코드 복사
COPY ./app ./app

# 포트 노출
EXPOSE 8000

# 실행 명령
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
    depends_on:
      - db
      - redis

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:alpine

volumes:
  postgres_data:

운영 환경 설정

# 프로덕션용 설정
class ProductionSettings(Settings):
    debug: bool = False
    log_level: str = "WARNING"

    # 보안 강화
    allowed_hosts: list[str] = ["yourdomain.com"]

    # 성능 최적화
    database_pool_size: int = 20
    database_max_overflow: int = 30

    # 모니터링
    sentry_dsn: Optional[str] = None

    class Config:
        env_file = ".env.production"

헬스체크 및 모니터링

# app/core/health.py
  from fastapi import APIRouter, Depends
  from sqlalchemy.orm import Session
  from app.core.database import get_db

  router = APIRouter()

  @router.get("/health")
  async def health_check():
      return {"status": "healthy", "timestamp": datetime.utcnow()}

  @router.get("/health/db")
  async def database_health_check(db: Session = Depends(get_db)):
      try:
          # 데이터베이스 연결 확인
          db.execute("SELECT 1")
          return {"status": "healthy", "database": "connected"}
      except Exception as e:
          raise HTTPException(status_code=503, detail="Database unavailable")

  @router.get("/metrics")
  async def metrics():
      # Prometheus 메트릭 반환
      return {
          "active_connections": get_active_connections(),
          "response_times": get_response_times(),
          "error_rates": get_error_rates()
      }

모던 백엔드 개발의 핵심 원칙

1. 관심사의 분리 (Separation of Concerns)

  • 각 레이어는 고유한 책임만 가짐
  • 의존성 역전 원칙으로 유연한 구조 구축

2. 테스트 가능한 코드 (Testable Code)

  • 의존성 주입으로 Mock 테스트 가능
  • 비즈니스 로직과 인프라 코드 분리

3. API 우선 설계 (API-First Design)

  • OpenAPI 스펙으로 계약 우선 개발
  • 프론트엔드와 백엔드 병렬 개발 가능

4. 자동화 (Automation)

  • CI/CD 파이프라인으로 배포 자동화
  • 코드 품질 검사 자동화

5. 관찰 가능성 (Observability)

  • 로깅, 메트릭, 트레이싱으로 시스템 상태 파악
  • 장애 대응 및 성능 최적화
728x90