흩어진 소유권 규칙을 계보 모델링으로 수렴한 설계
복잡한 비즈니스 규칙을 '계보'라는 단일 원리로 수렴해 도메인 경계를 명확히 했다. 데이터 보정과 유령 계약 차단 등 기술적 채워짐을 처리하며 모델의 견고함을 확보했다.
한 줄 요약: 소유 관계를 명시적 테이블 컬럼이 아닌 계보(연결 고리)로 유도해 데이터 불일치를 차단하고 도메인 경계를 명확히 했다.
물류 플랫폼을 설계하다 보면 '이 시설이 누구의 소유인가'라는 질문이 시스템 전체에 산재한다. 발주자, 처리자, 운반사, 정산 대상 등 문맥에 따라 소유권 해석이 달라지고, 각 서비스는 제각기 자신의 규칙으로 시설을 분류했다. 이 접근법은 초기에는 빠르게 기능 구현을 가능하게 하지만, 시간이 지날수록 데이터의 불일치와 비즈니스 로직의 중복, 그리고 예외 처리의 폭발을 낳는다. 우리는 이 문제를 해결하기 위해 흩어진 소유권 규칙을 '계보 유도'라는 단일 원리로 수렴하는 결정을 내렸다.
제약
설계에는 명확한 경계 조건이 존재한다. 첫째, 기존 데이터의 정합성을 해치지 않으면서 점진적으로 전환해야 한다. 둘째, 외부 시스템과의 연동에서 시설 식별자는 표준화된 고유 키로만 통해야 한다. 셋째, 새로운 비즈니스 규칙이 추가될 때 도메인 경계를 무너뜨리지 않고 확장할 수 있어야 한다.
선택지
1. 명시적 소유 테이블 유지 시설과 그룹의 관계를 별도 테이블에 매핑하는 전통적인 방식이다. 구현이 직관적이지만, 데이터 동기화 부담이 크다. 소유 관계가 변경될 때 원본과 사본을 모두 수정해야 하며, 예외 상황에서 데이터가 갈라지는 '유령 데이터'가 발생할 위험이 높다.
2. 계보 유도(Genealogy Induction) 시설과 그룹이 공유하는 연결 고리(연결 코드)를 통해 소유 관계를 동적으로 유도하는 방식이다. 물리적 매핑 테이블을 제거하고, 참조 무결성을 통해 소유권을 보장한다. 초기 구현 비용은 높으나, 데이터 불일치 문제를 근본적으로 차단한다.
3. 컨텍스트별 로직 분리 각 서비스 레이어에서 소유권 해석 로직을 독립적으로 유지한다. 변경에 유연하지만, 동일한 비즈니스 규칙이 여러 곳에 복제되어 유지보수 비용이 기하급수적으로 증가한다.
| 기준 | 명시적 테이블 | 계보 유도 | 컨텍스트별 분리 |
|---|---|---|---|
| 데이터 일관성 | 낮음(동기화 필요) | 높음(참조 무결성) | 낮음(복제 오류) |
| 확장성 | 낮음(테이블 수정 필요) | 높음(연결 고리 확장) | 높음(로직 추가) |
| 운영 부담 | 높음 | 낮음 | 매우 높음 |
결정
우리는 계보 유도 방식을 선택했다. 핵심 판단 기준은 '데이터의 진실 원천이 하나여야 한다'는 원칙이다. 기존 방식에서는 시설의 소유 그룹을 나타내는 컬럼과 연결 고리가 별도로 존재하여, 둘이 불일치하는 상황이 빈번하게 발생했다. 이를 해결하기 위해 모든 조회와 갱신 로직에서 명시적 소유 컬럼을 제거하고, 오직 연결 고리를 통해 계보를 추적하도록 변경했다.
구현 과정에서 세 가지 기술적 채워짐을 처리했다. 첫째, 과거 데이터의 유령 계약을 차단하기 위해 계약 블록의 필수 불변식을 강화했다. 둘째, 수동 등록 과정에서 계보가 끊기는 현상을 방지하기 위해 트랜잭션 내에서 소유 관계를 즉시 각인하는 로직을 도입했다. 셋째, 고아 상태의 시설 데이터를 정렬하고 소급 정정하는 마이그레이션을 수행했다.
이 선택의 대가는 초기 데이터 마이그레이션의 복잡성과 조회 로직의 추상화 비용이다. 그러나 이로 인해 소유권 관련 버그가 근본적으로 차단되었고, 새로운 비즈니스 규칙 추가 시 도메인 경계를 명확히 유지할 수 있게 되었다.
결과와 한계
얻은 것
- 소유권 관련 데이터 불일치 버그 제로 달성
- 도메인 모델의 명확한 경계 확보
- 새로운 규칙 추가 시 도메인 충돌 최소화
잃은 것
- 초기 데이터 마이그레이션에 소요된 높은 운영 비용
- 조회 로직의 추상화로 인한 디버깅 복잡도 증가
되돌릴 조건
- 계보 추적이 비즈니스 로직의 핵심이 아닌 부수적 정보로 전락할 경우
- 실시간 일관성 요구사항이 트랜잭션 범위를 넘어설 경우
이 결정은 다른 시스템에도 적용될 수 있다. 특히 다중 테넌트 환경이나 복잡한 소유 관계를 가진 서비스에서는 명시적 매핑 대신 참조 기반의 계보 모델을 고려해 볼 만하다. 단, 데이터 마이그레이션 전략을 신중하게 수립해야 한다.
팀에 남긴 규칙: "소유 관계는 테이블에 저장하지 말고, 참조를 통해 유도하라." 이 결정을 다시 봐야 할 조건: "계보 추적이 비즈니스 로직의 복잡도를 통제 불가능하게 증가시킬 때."