Rails Event Store에서 기록을 손상시키지 않고 이벤트 이름과 페이로드 진화시키기

Evolving event names and payloads in Rails Event Store without breaking history

작성자
발행일
2025년 09월 12일

핵심 요약

  • 1 이벤트 소싱 시스템에서 이벤트 이름 및 페이로드 변경 시 불변성 원칙을 유지하며 하위 호환성을 확보하는 방법을 제시합니다.
  • 2 Rails Event Store의 커스텀 매퍼를 활용하여 이벤트 타입 리네임과 페이로드 키 변환을 로드 시점에 효율적으로 처리하는 해결책을 설명합니다.
  • 3 기존 Transformation::Upcast 매퍼와 비교하여, 복잡한 변환 시 커스텀 매퍼가 코드 조직화, 유지보수성 및 디버깅 측면에서 더 우수함을 강조합니다.

도입

이벤트 소싱 아키텍처에서 비즈니스 용어의 변화는 시스템 전체에 큰 영향을 미칠 수 있습니다. 특히 'Refund'를 'Return'으로 변경하는 것과 같이 이벤트 이름 및 페이로드 키가 변경될 경우, 불변성 원칙을 따르는 이벤트 소스 시스템에서는 단순히 데이터베이스를 업데이트할 수 없습니다. 이는 수많은 과거 이벤트의 하위 호환성을 유지하면서 새로운 코드에서는 업데이트된 용어를 사용해야 하는 복잡한 마이그레이션 과제를 야기합니다. 본 문서는 Rails Event Store(RES) 환경에서 이러한 문제를 해결하기 위한 효과적인 접근 방식을 제시합니다.

이벤트 소싱 시스템에서 ‘Refund’를 ‘Return’으로 변경하는 등 이벤트 이름 및 페이로드 키를 진화시켜야 할 때, 이벤트 불변성 원칙으로 인해 과거 이벤트를 직접 수정할 수 없습니다. 이는 하위 호환성 유지라는 복잡한 과제를 야기합니다. Rails Event Store(RES)는 이벤트를 직렬화/역직렬화하는 과정에서 매퍼(Mapper) 파이프라인을 활용하여 이벤트를 변환합니다. 본 해결책은 이 파이프라인에 커스텀 매퍼를 추가하는 것입니다.

커스텀 RefundToReturnEventMapper 구현

우리는 Transformations::RefundToReturnEventMapper를 구현하여 RES 클라이언트의 변환 파이프라인에 통합했습니다. 이 매퍼는 load 메서드에서 다음을 수행합니다:

  • 이벤트 클래스 이름 변환: class_map을 통해 이전 이벤트 이름을 새로운 이름으로 매핑합니다.

  • 페이로드 데이터 변환: transform_payload 메서드를 사용하여 refund_idreturn_id로, refundable_productsreturnable_products로 변경하는 등 페이로드 키를 변환합니다.

  • 모든 변환은 읽기(load) 시점에만 이루어지며, PreserveTypes 변환은 데이터 타입 복원을 위해 커스텀 매퍼보다 먼저 실행되어야 합니다.

Transformation::Upcast와의 비교

RES의 내장 Transformation::Upcast 매퍼도 변환이 가능하지만, 복잡한 시나리오에서는 커스텀 매퍼가 더 유리합니다. Upcast는 각 이벤트 타입별로 람다 함수 내에 반복적인 보일러플레이트 코드가 필요해 유지보수성이 떨어집니다. 반면 커스텀 매퍼는 단일 transform_payload 메서드 내 case 문으로 모든 변환 로직을 중앙 집중화하여 코드 가독성, 단위 테스트 용이성, 디버깅 경험을 개선합니다. Upcast는 단순한 변환에 적합합니다.

결론

이벤트 소싱 시스템에서 비즈니스 요구사항 변화에 따라 이벤트 스키마를 진화시키는 것은 피할 수 없는 과제입니다. Rails Event Store는 유연한 매퍼 파이프라인을 통해 이러한 복잡한 문제를 해결할 수 있는 강력한 메커니즘을 제공합니다. 특히, 커스텀 매퍼 접근 방식은 이벤트 이름 변경 및 페이로드 키 변환과 같은 복잡한 요구사항에 대해 높은 코드 조직화, 유지보수성, 그리고 명확한 디버깅 경험을 제공합니다. 이를 통해 시스템의 불변성 원칙을 유지하면서도 비즈니스 변화에 유연하게 대응하고, 장기적인 관점에서 애플리케이션의 안정성과 확장성을 확보할 수 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!