이벤트 소싱 시스템에서 ‘Refund’를 ‘Return’으로 변경하는 등 이벤트 이름 및 페이로드 키를 진화시켜야 할 때, 이벤트 불변성 원칙으로 인해 과거 이벤트를 직접 수정할 수 없습니다. 이는 하위 호환성 유지라는 복잡한 과제를 야기합니다. Rails Event Store(RES)는 이벤트를 직렬화/역직렬화하는 과정에서 매퍼(Mapper) 파이프라인을 활용하여 이벤트를 변환합니다. 본 해결책은 이 파이프라인에 커스텀 매퍼를 추가하는 것입니다.
커스텀 RefundToReturnEventMapper 구현
우리는 Transformations::RefundToReturnEventMapper를 구현하여 RES 클라이언트의 변환 파이프라인에 통합했습니다. 이 매퍼는 load 메서드에서 다음을 수행합니다:
-
이벤트 클래스 이름 변환:
class_map을 통해 이전 이벤트 이름을 새로운 이름으로 매핑합니다. -
페이로드 데이터 변환:
transform_payload메서드를 사용하여refund_id를return_id로,refundable_products를returnable_products로 변경하는 등 페이로드 키를 변환합니다. -
모든 변환은 읽기(
load) 시점에만 이루어지며,PreserveTypes변환은 데이터 타입 복원을 위해 커스텀 매퍼보다 먼저 실행되어야 합니다.
Transformation::Upcast와의 비교
RES의 내장 Transformation::Upcast 매퍼도 변환이 가능하지만, 복잡한 시나리오에서는 커스텀 매퍼가 더 유리합니다. Upcast는 각 이벤트 타입별로 람다 함수 내에 반복적인 보일러플레이트 코드가 필요해 유지보수성이 떨어집니다. 반면 커스텀 매퍼는 단일 transform_payload 메서드 내 case 문으로 모든 변환 로직을 중앙 집중화하여 코드 가독성, 단위 테스트 용이성, 디버깅 경험을 개선합니다. Upcast는 단순한 변환에 적합합니다.