피드로 돌아가기
Dev.toBackend
원문 읽기
Specification 패턴을 통한 Repository 메서드 폭증 해결 및 Query Logic 도메인화
Specifications in Go: Composable Query Predicates Without an ORM Leak
AI 요약
Context
요구사항 증가에 따라 Repository 메서드가 비대해지며 발생하는 'Method-per-query' 안티 패턴 분석. 복잡한 WHERE 조건과 다수의 선택적 인자로 인해 가독성이 저하되고 SQL 빌더 로직이 Repository에 침투하는 ORM Leak 현상 발생.
Technical Solution
- Predicate를 First-class object로 정의하여 도메인 레이어에서 쿼리 조건을 직접 구성하는 Specification 패턴 도입
- Go 1.18+ Generics를 활용하여 다양한 엔티티 타입에 적용 가능한
Specification[T]인터페이스 설계 AndSpec,OrSpec,NotSpec구조체를 통한 재귀적 Composition 구조 설계로 복잡한 비즈니스 조건의 조합 가능성 확보IsSatisfiedBy메서드를 통한 In-memory 필터링과 Adapter 레이어의 Visitor 패턴을 통한 SQL WHERE 절 변환 분리- Repository 인터페이스를
FindAll(spec)단일 메서드로 단순화하여 인프라 변경 없이 쿼리 확장성 확보 - Hexagonal Architecture 원칙에 따라 도메인 모델과 영속성 구현체를 완전히 분리하여 테스트 용이성 증대
실천 포인트
1. 동일한 필터 조건이 여러 서비스/배치 작업에서 중복 사용되는지 확인
2. Repository 메서드 이름이 문장 형태로 길어지거나 인자 개수가 과도하게 많은지 검토
3. 단순 Row-level 필터링이 아닌 Complex Join이나 Aggregation 중심의 쿼리인지 판단하여 적용 여부 결정
4. In-memory 테스트와 실제 DB 쿼리 로직의 일관성 유지가 필요한지 확인