노트

권한 있는 데이터(기준 데이터)

Authoritative Data Source

백엔드#architecture#db · 연결된 개념 9개

쉽게 말하면

학교 성적은 담임 선생님 명부에 적힌 게 기준이고, 내 노트에 옮겨 적은 건 사본이에요. 둘이 다르면 따지지 않고 명부를 따르기로 정해 두면 누가 맞는지 다툴 일이 없죠.

비유의 한계 기준은 '원래 처음 적힌 곳'이 아니라 '맞다고 합의한 곳'이에요. DB가 기준일 때도, 외부 API나 리더 노드가 기준일 때도 있고, 사본은 기준에 맞춰 고쳐야 해요.

권한 있는 데이터(authoritative data)는 어떤 값이 맞는지 판단할 때 최종 기준으로 삼기로 정한 데이터의 원천이다. 여러 곳에 같은 정보가 있고 값이 서로 다르면 권한 있는 쪽을 따르고, 나머지는 사본으로 다룬다. 데이터 관리에서는 이런 저장 시스템을 기록 시스템(System of Record, SoR)이라 부른다.

사본과 기준

서버 DB              = 기준
CDN·브라우저 캐시    = 사본 (만료·무효화 대상)
클라이언트 캐시      = 사본 (다시 가져와 맞춤)
낙관적 UI 상태       = 요청이 끝날 때까지만 보이는 임시값
  • 캐시는 기준을 빠르게 읽으려고 둔 사본이다. 사본이 기준과 어긋나면 사본을 버리고 다시 읽는다(브라우저 캐시, 읽기 캐시 전략, TanStack Query)
  • 낙관적 업데이트는 서버 응답 전에 화면을 먼저 바꾼다. React의 useOptimistic은 액션이 진행되는 동안만 낙관적 값을 보여 주고, 액션이 실패하면 바뀌지 않은 실제 값이 다시 렌더링된다
  • 기준이 꼭 DB일 필요는 없다. 외부 기관의 공식 API, 복제 구성의 리더 노드(데이터베이스 다중화), 이벤트 로그가 기준일 수도 있다. 중요한 것은 기준이 어디인지 팀이 합의하는 것이다
  • 시스템이 크면 데이터 항목마다 기준이 다를 수 있다. 회원 정보는 계정 서비스, 재고는 재고 서비스가 기준인 식이다(바운디드 컨텍스트)

단일 진실 공급원과의 관계

단일 진실 공급원(Single Source of Truth, SSOT)은 데이터 요소마다 고치는(mastering) 곳을 한 군데로 정하는 설계 원칙이다. 다른 곳은 사본을 두지 않고 참조하거나, 읽기 전용 사본만 둔다. 즉 SSOT는 "각 데이터에 권한 있는 원천이 하나만 있도록 구조를 짜라"는 원칙이고, 권한 있는 데이터는 그렇게 정해진 원천 자체를 가리킨다. 인프라 설정을 git 한곳에 두는 GitOps가 SSOT의 한 예다. 사본도 수정을 허용하면 충돌을 맞추는 장치가 필요해지는데, 이 문제는 최종 일관성와 CRDT가 다룬다.

DNS의 권한 서버

DNS(Domain Name System)에서 권한 서버(authoritative server)는 한 영역(zone)의 레코드를 직접 알고 있어서 다른 서버에 묻지 않고 답할 수 있는 서버다. 재귀 리졸버(recursive resolver)는 대개 권한 서버에 물어 받은 답을 캐시해 둔다. 레코드의 TTL(Time To Live)이 지나기 전까지는 원천에 다시 묻지 않고 이 사본으로 답할 수 있다. 같은 "기준과 사본" 구조다(DNS와 CNAME).

명세: RFC 9499 §6 — DNS Servers and Clients · RFC 1035 §3.2.1 — Format (TTL)

출처: React 문서 — useOptimistic

참고: Wikipedia — System of record · Wikipedia — Single source of truth

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 저장소 역할 분담 (DB·캐시·큐·검색)

    서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

  • 로컬 퍼스트 아키텍처

    클라이언트 기기의 로컬 데이터를 진실의 원천(Source of Truth)으로 삼고, 서버는 동기화와 백업을 맡는 설계 방식. 전통적인 "서버가 원천, 클라이언트는 요청해서 그린다" 구조를 뒤집어 로컬 DB → UI 렌더링 → 백그라운드 동기화 순서로 흐른다.

  • 동일 출처 정책

    한 출처에서 실행된 스크립트가 다른 출처의 데이터를 읽지 못하게 막는 브라우저의 기본 보안 규칙. 다른 출처에 요청을 보내는 것은 대체로 허용하고, 응답을 읽는 것을 막는다.

  • 구조적 공유

    구조적 공유(Structural Sharing)는 새 버전의 데이터를 만들 때 바뀌지 않은 부분은 이전 버전의 객체를 그대로 가리키게 하는 기법이다. 바뀐 노드와 그 노드까지 올라가는 경로만 새로 만들고, 나머지 가지는 두 버전이 함께 쓴다. 불변 데이터를 다루면서도 매번 전체를 복사하지 않게 해 준다.

보기 옵션