
복잡한 비즈니스 로직과 상태 추적 문제를 Redux처럼 명쾌하게 해결하는 TypeScript 기반 오픈소스 가이드
데이터의 현재 상태만 저장하는 CRUD 방식의 한계를 느끼고 계신가요? 당근 테크 블로그에서 공개한 Ventyd는 프론트엔드 개발자에게 익숙한 Redux의 철학을 서버로 옮겨와 복잡한 도메인 로직을 이벤트 중심으로 관리할 수 있게 해주는 라이브러리입니다. 이벤트 소싱이라는 강력한 개념을 TypeScript 환경에서 가장 쉽고 안정적으로 도입할 수 있는 실무 노하우를 소개합니다.
감사 로그, 타임머신 기능, 혹은 복잡한 상태 전환이 잦은 엔터프라이즈급 서비스를 개발하는 백엔드 엔지니어에게 추천합니다. 특히 React/Redux에 익숙한 팀이 서버 개발까지 영역을 확장하거나, 클라이언트와 서버 간 도메인 로직 중복을 제거하고 싶은 프로젝트에 최고의 솔루션이 될 것입니다.
전통적인 CRUD 방식은 데이터의 현재 상태만 저장하기 때문에 승인 프로세스, 수정 이력, 롤백 등 복잡한 요구사항 대응 시 로직이 파편화되고 데이터 변경의 맥락을 추적하기 어렵다. 특히 특정 상태에 도달한 과정과 이유를 파악하기 위해 별도의 히스토리 테이블과 복잡한 감사 로그 로직을 중복해서 구현해야 하는 문제가 발생한다.
프론트엔드의 Redux 패턴에서 영감을 얻은 TypeScript 기반 이벤트 소싱 라이브러리 'Ventyd'를 개발하여 도입했다. 모든 상태 변경을 '이벤트'로 기록하고 Reducer를 통해 상태를 재구성하는 구조를 채택했으며, 스키마 정의와 비즈니스 로직을 담은 엔티티 클래스를 통해 도메인 모델을 체계적으로 관리할 수 있도록 설계했다.
배포 플랫폼에서 모든 배포 단계를 이벤트로 기록하여 완벽한 감사 로그와 쉬운 롤백을 구현했으며, 게임 개발 시 클라이언트와 서버가 동일한 도메인 로직을 공유함으로써 즉각적인 반응성과 부정행위 검증을 동시에 달성했다. 이를 통해 프론트엔드와 백엔드 엔지니어가 공통의 언어로 비즈니스 로직을 설계하고 협업하는 효율적인 환경이 구축되었다.
Trade-off
본문에 구체적인 수치로 명시되지는 않았으나, 이벤트 소싱 패턴 도입 시 단순 CRUD 대비 시스템 설계 및 구현의 복잡도가 증가하며 저장된 모든 이벤트를 재생하는 과정에서 성능 오버헤드가 발생할 수 있다. 또한 특정 필드 기반의 검색을 위해서는 CQRS 패턴 등을 통해 별도의 읽기 모델을 인덱싱하거나 플러그인으로 직접 구현해야 하는 비용이 수반된다.
데이터의 현재 상태만을 저장하는 대신, 상태를 변경시킨 모든 사건(이벤트)을 순차적으로 기록하여 영구 저장하는 아키텍처 패턴이다.
이전 상태와 발생한 이벤트를 입력받아 다음 상태를 결정하는 순수 함수이다.
상태 정의, 리듀서, 그리고 비즈니스 로직을 하나로 묶은 도메인 객체의 기본 단위이다.




