개념/배경
Single Source of Truth(SSOT)는 소프트웨어와 데이터 관리에서 중요한 데이터는 권위 있는 하나의 출처만을 가진다는 원칙을 뜻함 핵심은 원본은 한 곳에만 두고 나머지는 그 원본을 참조하거나 파생해 사용함 원본이 분산되면 동기화 비용과 불일치 위험이 기하급수적으로 증가함
왜 필요한가
- 데이터 불일치 발생 위험 증가
- 위치 A의 유저 나이가 20인데 위치 B에서는 21로 표시되는 상황
- 유지보수 비용 급증
- 수정 시 흩어진 모든 복제본을 찾아 변경해야 함
- 일부 누락 시 버그와 장애로 연결됨
- 변경 전파가 느림
- 캐시나 로컬 복제본 만료 정책이 미흡할 때 최신성이 깨짐
실생활 비유
- 주민등록과 같은 신원 시스템의 원본 데이터는 정부의 공식 저장소에 존재 은행이나 병원은 이를 조회해 사용할 뿐 별도의 원본을 만들지 않음
- 스마트폰 연락처가 전화번호의 원본 역할을 수행 연락처에서 번호를 바꾸면 메신저나 문자 앱도 최신 번호를 참조해 표시함
개발 적용 예시
프론트엔드 상태 관리
- Bad
- 부모 컴포넌트에 userData 보유, 자식 컴포넌트가 이를 복사해 별도 상태로 관리
- 부모 변경이 자식에 반영되지 않을 수 있음
- SSOT
- 상위 컴포넌트 또는 중앙 스토어에만 userData 보관
- 자식은 props나 selector로 읽기 전용 접근
데이터베이스 모델링
- Bad
- 주문 테이블에 고객 주소를 중복 저장하고 회원 테이블에도 주소 저장
- SSOT
- 회원 테이블에만 주소 저장
- 주문 테이블은 회원 ID를 참조해 조인으로 조회
타입 정의 공유(TypeScript)
- Bad
- 동일한 API 응답 타입을 페이지 A와 B 각각에서 중복 정의
- SSOT
- types/user.ts에 단일 타입 정의 위치 확보 후 모든 모듈에서 import하여 사용
베스트 프랙티스와 주의
- 쓰기 경로 단일화
- 원본에 대한 쓰기는 반드시 한 경로로만 수행
- 읽기 복제본과 캐시 관리
- 캐시는 파생물로 취급
- 만료 정책, 동기화 주기, 재검증 전략을 명시
- 식별자 기반 참조 우선
- 파생 데이터에는 식별자만 저장하고 필요 시 조인 또는 조회로 해석
- 양방향 복제와 수동 동기화 지양
- 충돌 해결 복잡도와 데이터 드리프트 위험 상승
- 마이그레이션 단계 관리
- 이중 쓰기 기간 최소화, 피처 플래그와 데이터 백필 계획 수립, 점진적 전환 적용
요약
원본은 하나만 관리하고 나머지는 참조한다는 단순한 원칙이 SSOT의 전부 이를 지키면 데이터 신뢰성 확보와 변경 비용 축소에 직접적인 효과가 있음 프론트엔드 상태, DB 스키마, 타입 정의까지 동일한 기준으로 일관 적용 권장
필요하다면 리액트 상태 관리에서 SSOT를 어떻게 구현하는지 간단한 예시로 확장 가능