피드로 돌아가기
Transactions Without Leaking the Database into Your Domain
Dev.toDev.to
Backend

UnitOfWork Port와 Decorator를 통한 DB 종속성 제거 및 원자성 확보

Transactions Without Leaking the Database into Your Domain

Gabriel Anhaia2026년 5월 18일14intermediate

Context

Application Layer에서 EntityManager를 직접 호출하여 Transaction을 관리함에 따른 인프라 종속성 발생. 이로 인해 DB 교체 비용 증가 및 Unit Test 시 Mocking 복잡도가 상승하는 구조적 한계 직면.

Technical Solution

  • Application Layer 내 Transaction 경계만을 정의한 UnitOfWork Port 인터페이스 설계
  • 인프라 계층에서 Doctrine, Laravel, PDO 등 실제 DB 드라이버별 Adapter를 구현하여 세부 메커니즘 은닉
  • Use Case 내부의 트랜잭션 로직을 제거하고 wiring 단계에서 Transactional Decorator를 통한 횡단 관심사 분리
  • 포트-어댑터 구조를 통해 비즈니스 로직은 보존하며 런타임에 저장소 구현체를 동적으로 교체하는 유연성 확보
  • DB Flush 및 Commit/Rollback 제어권을 Use Case 외부로 이전하여 도메인 순수성 유지

1. Use Case 내부에 DB 프레임워크 전용 클래스(EntityManager 등)가 Import 되어 있는지 확인

2. 트랜잭션 시작과 종료 로직을 별도의 Port 인터페이스로 추상화하여 인프라 계층으로 이동

3. 비즈니스 로직 변경 없이 트랜잭션을 적용할 수 있도록 Decorator 패턴 적용 검토

4. DB 없이 작동하는 순수 Unit Test 환경 구축 가능 여부 검증

원문 읽기