피드로 돌아가기
Your Domain Doesn't Know About PostgreSQL (And It Shouldn't)
Dev.toDev.to
Backend

Your Domain Doesn't Know About PostgreSQL (And It Shouldn't)

비즈니스 로직이 SQLAlchemy, FastAPI, ORM 모델에 강하게 결합되어 있어 테스트 불가능성과 코드 재사용 불가 문제 해결

Pablo Ifrán2026년 3월 25일7intermediate

Context

기존 OrderService는 비즈니스 규칙(주문 검증, 할인 계산)과 인프라 관심사(SQLAlchemy 세션, FastAPI 예외 처리, 환경 변수)가 혼재되어 있었다. 이로 인해 단위 테스트를 작성하려면 60줄의 픽스처가 필요하거나 테스트를 아예 작성하지 않는 상황이 발생했다.

Technical Solution

  • 도메인 로직을 순수 비즈니스 규칙으로 분리: calculate_total(), is_valid() 메서드를 데이터베이스나 HTTP 프레임워크 의존성 없이 구현
  • 데이터 클래스 활용으로 ORM 모델 제거: SQLAlchemy 모델 대신 @dataclass를 사용해 Order, OrderItem 정의
  • 외부 의존성 제거: OrderService에서 db.Session, HTTPException, os.getenv() 호출 제거
  • 테스트 코드 간소화: 3줄의 테스트 코드로 픽스처, 모킹, 데이터베이스 없이 할인 로직 검증

Key Takeaway

도메인(비즈니스 규칙)과 인프라(데이터베이스, 프레임워크)의 명확한 분리는 테스트 용이성뿐 아니라 마이크로서비스 간 로직 공유, 저장소 기술 변경(PostgreSQL → MongoDB) 시 핵심 규칙의 독립성을 보장하는 기본 아키텍처 원칙이다.


기존 OrderService, UserService 등의 서비스 클래스에서 데이터베이스 쿼리 메서드, HTTP 예외 처리, 환경 변수 호출을 제거하고 순수 함수 또는 데이터클래스 메서드로 비즈니스 규칙을 재구성하면, 외부 의존성 없이 밀리초 단위로 단위 테스트를 실행할 수 있고 CSV 업로드, 마이크로서비스 통합 등 새로운 사용 사례에서 로직을 재사용할 수 있다.

원문 읽기