불변 원장: TypeScript와 디자인 패턴을 통한 데이터 무결성

발행: (2026년 2월 10일 오후 12:04 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

Abstract

견고한 금융 아키텍처에서는 시스템의 무결성이 데이터베이스 행의 현재 상태(예: UPDATE accounts SET balance = 50)에 의존하지 않고, 전체 이력의 도출에 의존합니다.
이 글에서는 신뢰할 수 있는 시스템의 기본 원시형인 Ledger Pattern을 살펴봅니다. 우리는 Event Sourcing, Immutability, 그리고 테스트를 위한 Builder Pattern을 보여주는 간단한 TypeScript 구현을 검토합니다—이 개념들은 블록체인 기술의 건축적 조상이라 할 수 있습니다.

  • 고객당 하나의 Ledger: 선형이며, 추가만 가능한 이력.
  • 변경 없음: 트랜잭션을 수정하지 않고, 새로운 라인만 추가합니다.
  • 파생된 상태: 현재 잔액은 이력의 합계일 뿐입니다.

잔액을 저장하면 데이터베이스 업데이트를 신뢰해야 합니다. Ledger를 저장하면 수학적 계산을 증명할 수 있습니다.

The Problem: Mutable State in Finance

표준 CRUD 애플리케이션에서는 잔액을 업데이트하면 이전 상태가 사라집니다. 데이터베이스 쓰기가 실패하거나 악의적인 사용자가 값을 수정하면 이력이 손실됩니다. 이는 흔히 “파괴적 업데이트” 문제라고 불립니다.

반면 Ledger는 추가 전용 로그입니다. 현재 잔액은 저장되지 않으며, 모든 트랜잭션 이력을 축소(reduce)하여 결정적으로 계산됩니다.

State Derivation & Immutability

  • getBalance()저장된 변수를 가져오는 것이 아니라, 트랜잭션 이력을 축소하여 상태를 계산합니다.
  • 이력 배열은 ReadonlyArray 혹은 스프레드 복사본으로만 노출되어, 상태는 계산할 수 있지만 이력 자체는 변조 방지됩니다—감사 가능성에 필수적인 요구사항입니다.

The Blockchain Premise

보안을 위해 블록체인은 Ledger 개념에 암호화 해시(예: Merkle Tree)를 추가해 항목들을 연결합니다. 분산 Ledger에서는 “이력”이 블록 체인으로 변하며, 불변성은 메모리 범위가 아니라 암호학에 의해 보장됩니다.

핵심 포인트

  • 프라이빗 이력읽기 전용 반환 타입은 한 번 기록된 항목이 외부 소비자에 의해 변조될 수 없도록 합니다.
  • 암호화 링크(해시)는 분산 노드 간에 변조 증거를 제공합니다.

Testing with the Builder Pattern

반복적인 보일러플레이트 코드를 작성하지 않고 이 로직을 검증하기 위해 Builder Pattern을 사용합니다. 이를 통해 유창하고 표현적인 인터페이스로 복잡한 트랜잭션 시나리오를 구성할 수 있어 가독성과 유지보수성이 향상됩니다.

테스트 스위트는 두 가지 중요한 동작을 확인합니다:

Correct Derivation

잔액은 전체 트랜잭션 이력을 축소하여 도출됩니다.

Immutability

노출된 이력 배열을 수정하려는 시도(공통 공격 벡터)는 내부 상태에 영향을 주지 못합니다.

Note: 이 구현은 교육 목적을 위한 구조적 원시형입니다. 실제 운영 환경의 금융 시스템은 추가적인 견고성 계층이 필요합니다:

  • 동시성 제어: 여러 트랜잭션이 동시에 발생할 때 경쟁 조건을 처리(예: Optimistic Concurrency Control 사용).
  • 영속성: 이벤트 로그를 영구적인 데이터베이스에 저장(예: PostgreSQL 또는 Kafka와 같은 분산 로그).
  • 비즈니스 로직 검증: 초과 인출 방지와 같은 규칙 적용.
  • 스마트 계약 진화: 블록체인 환경의 스마트 계약을 모방한 검증 로직 추가.

Conclusion

단순하지만, 이 패턴은 데이터를 저장하는 것과 사실을 저장하는 것의 차이를 보여줍니다. 은행 시스템이든 분산 Ledger이든 원칙은 동일합니다: 상태는 이력의 함수입니다.

이 패턴을 확장하면 “Ledger”는 단순 클래스에서 분산 로그로, 나아가 현대 블록체인 네트워크에서 볼 수 있는 탈중앙화 합의 메커니즘으로 진화합니다.

Back to Blog

관련 글

더 보기 »