문서를 수정하려면 로그인이 필요합니다.

Datomic 데이터베이스에대해

최근 수정 시각: 2025-11-04 15:19:43

1. 개념 이해

1-1. Datomic이란?

  • Datomic은 불변(immutable) 사실(fact)을 누적하는 방식으로 데이터를 관리하는 분산 데이터베이스입니다. (datomic.com [1])
  • 시간(time)을 데이터 모델의 기본 요소로 삼아 “과거의 상태”, “변경 히스토리” 등을 자연스럽게 다룰 수 있습니다. (docs.datomic.com [2])
  • 쿼리 언어는 Datalog 기반이며, SQL‐류만으로는 표현하기 어려운 패턴 탐색이나 그래프형태 데이터 접근에 강점을 가집니다. (freesourcelibrary.com [3])

1-2. 핵심 특징

  • 불변성(immutability): 기존 데이터를 덮어쓰지 않고 새 사실(fact)을 추가함으로써 과거 상태를 보존합니다. (DEV Community [4])
  • 시간여행(Time-travel) 가능: 특정 시점(as-of)에서의 데이터 상태 조회가 가능합니다. (docs.datomic.com [2])
  • 읽기 확장성(Read scalability): 읽기 작업이 여러 노드에서 병렬·독립적으로 가능하도록 설계되어 있습니다. (docs.datomic.com [2])
  • ACID 트랜잭션 보장: 쓰기(트랜잭션)는 직렬화(serialized)되어 강한 일관성을 제공합니다. (docs.datomic.com [2])

1-3. 언제 유용한가?

  • 데이터 변경 이력을 남기고 싶을 때(감사, 법률, 회계 등)
  • 엔티티‐속성 형태가 유동적이거나 그래프적 관계가 많을 때
  • 읽기 요청이 매우 많고, 다양한 접근패턴이 필요한 경우
  • 하지만 반대로 초고빈도 쓰기, 실시간 로그 수집, 대용량 바이너리 저장 같은 케이스엔 적합하지 않을 수 있습니다. (docs.datomic.com [2])

2. 정보모델 (Information Model)

2-1. Datom(데이텀)의 구조

  • Datomic에서는 기본 단위를 “datom”이라 부르며, 일반적인 엔티티+속성+값 형태(EAV) 외에 트랜잭션ID와 유효성 여부(flag)가 포함됩니다. (docs.datomic.com [2])
  • 간단히 말하면: (Entity, Attribute, Value, Transaction, Added?) 형태.
  • 예제: { :entity 123, :attribute :user/name, :value "Alice", :tx 456, :added true }

2-2. 스키마와 유연성

  • 각 Attribute(속성)는 타입, cardinality(단일/복수), 기타 제약을 선언할 수 있습니다. (docs.datomic.com [2])
  • 하지만 테이블이 고정된 RDBMS처럼 엄격하지 않고, “엔티티가 갖는 속성은 유동적”일 수 있습니다. 즉 유연한 모델링이 가능하다는 뜻입니다. (datomic.com [1])

2-3. 접근 패턴과 인덱싱

  • Datomic은 여러 인덱스를 내부적으로 유지하여 다양한 접근패턴에 대응합니다 (EAVT, AVET, AEVT, VAET 등) (dbdb.io [5])
  • 예컨대 엔티티 기준 조회, 속성 기준 조회, 값 기준 조회, 그래프 탐색 등 다양한 방식이 지원됩니다.
  • 예제: “엔티티 123의 name 속성이 무엇인가?” → 엔티티 기준
  • 또 “속성 :user/age 가 30 이상인 사용자” → 속성+값 기준

3. 아키텍처 및 배포 모델

3-1. 주요 구성요소

  • 트랜잭터(Transactor): 모든 쓰기(트랜잭션)를 직렬로 처리하는 중앙 컴포넌트. 일관성 확보를 위해 쓰기는 이곳을 통해 들어갑니다. (DEV Community [4])
  • 피어(Peer): 애플리케이션 노드 쪽에서 데이터 읽기+쿼리 엔진 역할을 하며, 읽기 요청을 빠르게 처리할 수 있도록 캐시를 갖습니다. (DEV Community [4])
  • 스토리지 서비스(Storage Service): 실제 사실(datoms) 저장소로, 클라우드(예: AWS S3, DynamoDB)나 온프레미스 스토리지 등이 될 수 있습니다. (docs.datomic.com [6])

3-2. 배포/에디션 모델

  • Datomic Local: 단일 프로세스, 개발 혹은 가벼운 용도용. (docs.datomic.com [2])
  • Datomic Pro: 자체 인프라/온프레미스 또는 클라우드에서 분산 환경 구성 가능. (datomic.com [1])
  • Datomic Cloud: AWS에 특화된 완전 관리형 배포 모델. 자동화된 스토리지/인프라 제공. (datomic.com [7])

3-3. 장단점 및 주의사항

  • 장점: 읽기 확장성, 히스토리 보존, 다양한 접근패턴 지원
  • 주의사항: 쓰기 확장이 제한적일 수 있음 (트랜잭터가 직렬 처리) → 매우 높은 쓰기 처리량이 필요한 워크로드엔 부적합할 수 있습니다. (docs.datomic.com [2])
  • 또한 대형 바이너리나 이미지/비디오 저장은 전담 스토리지와의 조합이 필요합니다. (docs.datomic.com [2])

4. 실제 사용 흐름 및 예제

4-1. 설치 및 초기 설정

  • 개발환경에서는 peer-server나 인메모리(mem) 스토리지를 사용해 빠르게 시작할 수 있습니다. (docs.datomic.com [8])
  • 예제: Clojure 프로젝트에서 client 라이브러리를 추가하고, d/client, d/connect 등을 통해 연결합니다. (docs.datomic.com [8])

4-2. 스키마 정의 및 트랜잭션

  • 우선 Attribute를 선언하는 스키마 데이터를 트랜잭션으로 DB에 적용합니다.

    [{:db/ident :user/name
    :db/valueType :db.type/string
    :db/cardinality :db.cardinality/one}
    {:db/ident :user/age
    :db/valueType :db.type/long
    :db/cardinality :db.cardinality/one}]
  • 그런 다음 실제 엔티티 인스턴스를 추가합니다.

    [{:db/id (d/tempid :db.part/user)
    :user/name "Alice"
    :user/age 30}]

4-3. 조회 및 ‘시간 여행’ 기능

  • d/q 쿼리를 통해 원하는 데이터를 조회할 수 있습니다. 예: 사용자 이름이 “Alice”인 엔티티를 찾기.
  • 또한 :as-of 옵션을 사용하면 과거 시점의 데이터 상태를 조회할 수 있습니다. 예: 10분 전 시점의 DB 상태로.
  • 예제 설명: 어느 때 “Alice”가 나이가 30이었는지, 이후 나이가 31로 바뀌었으면 과거 시점을 조회해 볼 수 있습니다.

4-4. 변경과 히스토리

  • 나이를 31로 바꾸는 트랜잭션을 수행하면 기존 30이라는 사실은 ‘retraction’(무효화)되고, 새로운 사실이 추가됩니다.
  • 따라서 DB는 “Alice 나이=30이었다”라는 사실까지 보존하게 됩니다. 이로 인해 데이터 감사(audit)나 변경 이력 추적이 자연스럽게 이루어집니다.

5. 장점과 고려사항

장점

  • 강력한 이력관리: 모든 변경사항이 보존되므로, 언제 누가 무엇을 했는지 추적 가능.
  • 다양한 접근패턴 지원: 그래프, 계층, 키‐값, 컬럼 형식 등 여러 방식으로 활용 가능.
  • 읽기 중심 확장성 우수: 캐시 + 분산 읽기 구조 덕분에 읽기 부하가 높은 애플리케이션에 유리.

고려사항

  • 쓰기 병목 가능성: 트랜잭터가 직렬화 처리하므로, 초고속 쓰기가 많은 시스템에는 한계가 있을 수 있습니다.
  • 모델링 패러다임 변화: RDBMS 경험이 있는 팀에는 개념 이동이 필요할 수 있습니다 (엔티티‐속성 방식, 불변성 개념 등).
  • 대용량 바이너리나 이벤트 로그 같은 용도에선 다른 스토리지 아키텍처와 병행해야 할 수 있습니다.

전체 요약

Datomic은 불변적 데이터 모델과 시간(time)를 핵심으로 하는 분산 데이터베이스 솔루션입니다. 모든 데이터는 “사실(fact)” 형태로 추가되며, 수정이나 삭제는 사실을 무효화하고 새로운 사실을 덧붙이는 방식으로 처리됩니다. 이를 통해 과거 시점까지 조회 가능한 ‘시간 여행’ 기능이 자연스럽게 제공됩니다. 읽기 확장성에 강하고 유연한 스키마, 다양한 접근패턴을 지원하지만, 쓰기 처리량이 매우 높은 워크로드나 바이너리 대용량 저장에는 주의가 필요합니다. 설치부터 스키마 정의, 트랜잭션, 조회, 히스토리 관리까지 전체 흐름을 이해하면, 어떤 환경에 Datomic을 도입할지 적절히 판단할 수 있습니다.


문서를 수정하려면 로그인이 필요합니다.