Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- softeer
- 프로그래머스
- group by
- 너비 우선 탐색
- Lv. 2
- Baekjoon
- Lv. 0
- 오블완
- 백준
- dfs
- programmers
- SQL 고득점 KIT
- 파이썬
- LEVEL 2
- SQL
- DP
- 동적계획법
- 티스토리챌린지
- 소프티어
- bfs
- Python
- javascript
- Dynamic Programming
- Lv. 3
- Java
- 자바스크립트
- Lv. 1
- join
- level 3
- 깊이 우선 탐색
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
FastAPI 백엔드 개발 가이드: API 구현 순서와 모던 개발 방법론 [3탄] 본문
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
'백엔드' 카테고리의 다른 글
FastAPI 백엔드 개발 가이드: API 구현 순서와 모던 개발 방법론 [2탄] (0) | 2025.08.12 |
---|---|
FastAPI 백엔드 개발 가이드: API 구현 순서와 모던 개발 방법론 [1탄] (2) | 2025.08.12 |