Eternity's Chit-Chat

aeternum.egloos.com



진화적인 설계-3.ACCOUNTING 패턴 2부 Evolutionary Design

EVENT와 아키텍처
EVENT SOURCING 패턴의 핵심은 애플리케이션의 상태 변경을 발생시킨 모든 외부 자극을 이벤트의 흐름으로 표현하는 것이다. 애플리케이션에 대한 입력을 연속적인 이벤트의 흐름으로 표현함으로써 시스템에 대한 모든 입력 이벤트를 보관할 수 있다. 과거를 복구하고 상태 변경의 원인을 추적할 수 있는 EVENT SOURCING 패턴의 힘은 외부 자극을 이벤트로 표현하고 이를 애플리케이션 내부에 저장할 수 있는 능력에서부터 출발한다.

이처럼 애플리케이션에 대한 자극이나 입력을 독립적인 이벤트로 표현하는 것을 DOMAIN EVENT 패턴이라고 한다. DOMAIN EVENT는 도메인의 상태를 변경시키는 흥미로운 외부 사건에 대한 정보를 보관하며 애플리케이션은 DOMAIN EVENT를 저장함으로써 모든 상태 변경에 대한 원인을 추적할 수 있다.

대부분의 애플리케이션은 다수의 외부 애플리케이션과 연동을 하거나 다양한 입력 매체를 통해 입력을 받아들인다. 애플리케이션의 입력 매체가 다양한 만큼 DOMAIN EVENT의 소스(source) 역시 다양하고 풍부할 수 밖에 없다. 웹 페이지를 포함한 다양한 사용자 인터페이스부터 비동기적인 메시징이나 동기적인 원격 프로시저 호출, 데이터베이스 테이블까지 애플리케이션에 입력을 제공할 수 있는 매체의 종류와 입력 포맷은 매우 다양하다. 그러나 시스템에 대한 모든 입력을 저장하고 추적해야 하는 EVENT SOURCING 패턴의 경우 입력 매체나 입력 포맷의 종류와 무관하게 시스템에 대한 모든 입력을 동일한 개념으로 다룰 수 있어야 한다. 따라서 DOMAIN EVENT 패턴을 기반으로 하는 시스템은 <그림 2>와 같이 시스템을 두 개의 레이어로 분할하여 동일한 이벤트 프로세스 로직이 다양한 입력 매체로부터 전달된 DOMAIN EVENT를 처리할 수 있도록 한다.

<그림 2> DOMAIN EVENT로 변환된 시스템 입력(출처:Domain Event)

애플리케이션의 첫 번째 레이어는 다양한 매체로부터 전달된 다양한 데이터의 흐름을 일련의 DOMAIN EVENT의 흐름으로 변경한 후 영속성 저장소인 이벤트 로그(Event Log)에 저장한다. 두 번째 레이어의 핵심 구성 요소는 이벤트 프로세서(Event Processor)로 이벤트 로그로부터 DOMAIN EVENT를 읽어 순차적으로 처리한 후 애플리케이션의 상태를 변경시킨다. 이와 같이 첫 번째 레이어가 다양한 포맷의 입력을 공통적인 구조를 가진 DOMAIN EVENT로 변환한 후 저장해 주기 때문에 두 번째 레이어의 이벤트 프로세서는 입력 매체의 종류나 데이터 포맷과 독립적으로 이벤트 처리 로직을 구축할 수 있다.

이 글에서는 이벤트 로그에 저장되어 있는 DOMAIN EVENT를 읽어 처리함으로써 시스템의 상태를 변경시키는 이벤트 프로세서에 초점을 맞춘다. 따라서 다양한 입력 매체로부터 전달된 입력 데이터를 DOMAIN EVENT로 변환하고 저장하는 첫 번째 레이어에 대해서는 다루지 않는다.

첫 번째 레이어와 입력 매체 간의 상호 작용을 다루는 영역은 흔히 이벤트-주도 아키텍처(Event-Driven Architecture)로 잘 알려져 있다. 이와 관련된 이슈를 다루고 있는 다양한 서적이 출간되어 있으며 특히 Gregor Hohpe와 Bobby Woolf가 저술한 “Enterprise Integration Patterns”를 추천한다. “Enterprise Integration Patterns”는 메시징(Messaging) 을 기반으로 시스템을 통합하는데 사용할 수 있는 다양한 패턴 집합을 제공할 뿐만 아니라 이벤트-주도 아키텍처를 구축하는데 필요한 구체적인 가이드와 실무 경험을 제시하고 있다. EVNET SOURCING 패턴을 적용해서 대규모의 아키텍처를 구축하기 위한 큰 그림이 궁금하다면 주저하지 말고 “Enterprise Integration Patterns”을 참조하라.