피드로 돌아가기
Dev.toBackend
원문 읽기
Hexagonal Architecture 도입으로 CI 시간을 20분에서 5분으로 75% 단축
How Hexagonal Architecture Cut My CI Time From 20 Minutes to 5
AI 요약
Context
Laravel 기반 시스템에서 RefreshDatabase 패턴 사용으로 인한 DB 의존적 테스트 구조 설계 데이터 스키마 증가에 따른 테스트 수행 시간의 선형적 증가와 강한 결합도로 인한 피드백 루프 저하
Technical Solution
- 외부 의존성을 애플리케이션 소유의 인터페이스(Port) 뒤로 격리한 Hexagonal Architecture 적용
- 기술 중심 명칭 대신 ForFindingOrders와 같이 유스케이스 기반의 인터페이스 설계
- 프로덕션용 Eloquent 어댑터와 테스트용 In-memory 어댑터를 분리하여 데이터베이스 접근 제거
- Mocking 대신 실제 동작을 구현한 Fake 객체를 사용하여 테스트 신뢰성 확보
- Laravel TestCase 대신 PHPUnit TestCase를 상속받아 프레임워크 부팅 비용 제거
- 포트와 프로덕션 어댑터 간 계약 검증을 위한 최소한의 Integration Test만 유지
Impact
- 전체 CI 수행 시간: 20분 $\rightarrow$ 24분(마이그레이션 정점) $\rightarrow$ 5분으로 단축
- DB 의존 테스트 클래스 비중: 95%에서 25%로 감소
- 순수 Unit Test 클래스 비중: 5%에서 75%로 확대
Key Takeaway
아키텍처 변경 초기에는 코드량 증가와 중복 테스트로 인해 성능이 일시적으로 하락하는 J-커브 구간 발생 임계 질량(Critical Mass)을 넘어서는 순간 DB 세금(Database Tax)이 제거되며 비선형적인 성능 향상 달성
실천 포인트
- 유스케이스 기반 인터페이스 정의 후 In-memory Fake 구현체 도입 검토 - 프레임워크 부팅이 불필요한 테스트 클래스의 Base Case를 Pure PHPUnit으로 변경 - 전체 마이그레이션 대신 특정 Bounded Context부터 단계적으로 적용하여 성과 증명 - 프로덕션 어댑터 검증용 Integration Test와 비즈니스 로직 검증용 Unit Test를 엄격히 분리