공통 이벤트 처리 설계 및 구축 - Genie-Uss/genieus GitHub Wiki
🎯 핵심 목표
- Kafka 기반의 이벤트를 서비스별로 자동 등록된 핸들러 메서드로 안전하고 구조적으로 라우팅
- 제너릭 타입 포함 이벤트도 역직렬화가 가능한 구조 설계
- 각 서비스에서 핸들러, 폴백, 타입 매핑을 애너테이션 기반으로 선언적으로 등록
- 도메인 이벤트 표준화, 재사용 가능한 공통 컴포넌트 제공
⚙️ 주요 기술 스택 및 아키텍처 요소
- Spring BeanPostProcessor: 핸들러 메서드를 런타임에 스캔하고 자동 등록
- 커스텀 어노테이션:
@EventTypeMapping
,@FallbackMapping
도입으로 선언적 라우팅 및 폴백 지정 - Generic Type-safe JSON 역직렬화: Jackson의
TypeReference
를 활용해 제네릭 타입도 역직렬화 처리 - EventDispatcher / EventRouter / EventEnvelopeParser 구성: 이벤트 수신 → 타입 확인 → 역직렬화 → 핸들러 전달 → 예외 시 폴백
- EventTypeRegistry: 이벤트 타입명 ↔ 클래스 매핑 캐시 관리
- AOP는 사용하지 않고, 순수 DI 및 후처리 기반 구조 유지
🧱 라이브러리 구성 요소 및 역할
@EventTypeMapping
, @FallbackMapping
1. - 각 서비스는 이벤트 핸들러 메서드에
@EventTypeMapping("OrderCanceled")
와 같은 방식으로 이벤트 바인딩 - 예외 발생 시 대체 처리 로직을
@FallbackMapping("OrderCanceled")
으로 명시
EventHandlerBeanPostProcessor
2. - Bean 초기화 이후 모든 Bean의 메서드를 탐색해 커스텀 애노테이션이 달린 메서드들을 등록
EventDispatcher
에 이벤트 타입 기반 핸들러와 폴백을 자동으로 매핑EventTypeRegistry
에 이벤트 클래스도 등록해 이후 역직렬화 시 활용
EventEnvelopeParser
3. - Kafka 메시지 JSON에서 이벤트 타입을 추출하고, 등록된 클래스 정보를 기반으로 역직렬화 수행
EventEnvelope<T>
로 감싼 메시지 구조를 파싱하여 타입 안정성 확보
EventDispatcher
, EventRouter
4. - Dispatcher는 파싱된 이벤트를 핸들러에 전달하고, 예외 발생 시 폴백을 호출
- Router는 Kafka 리스너가 받은 메시지를 파싱 → 디스패치 → 폴백 처리 전체 흐름을 관리
📈 적용 효과
- MSA 환경에서 각 도메인 서비스가 중복 없는 방식으로 통일된 이벤트 처리 구조를 가지게 됨
- 도메인 이벤트의 정형화된 표준 처리 파이프라인 확보
- 역직렬화 오류 방지 및 예외 상황 자동 대응으로 운영 안정성 향상
- 핸들러 메서드만 선언하면 자동 등록되므로, 신규 이벤트 추가 시 생산성 대폭 향상
📌 시각화 다이어그램 (Mermaid 기반)
-
Kafka 수신부터 핸들러 호출 및 예외 폴백까지의 전체 흐름
-
애플리케이션 컨텍스트 초기화 시 핸들러 자동 등록 과정
-
시퀀스 다이어그램
sequenceDiagram participant Kafka participant EventRouter participant EventEnvelopeParser participant EventDispatcher participant HandlerBean Kafka->>EventRouter: Kafka 메시지 수신 (topic, json) EventRouter->>EventEnvelopeParser: 이벤트 타입 추출 및 클래스 확인 (resolveEventType) EventEnvelopeParser-->>EventRouter: 이벤트 클래스 반환 EventRouter->>EventEnvelopeParser: JSON 역직렬화 (deserialize) EventEnvelopeParser-->>EventRouter: EventEnvelope 반환 EventRouter->>EventDispatcher: 이벤트 디스패치 (dispatch) EventDispatcher->>HandlerBean: 이벤트 핸들러 메서드 호출 HandlerBean-->>EventDispatcher: 처리 완료 alt 핸들러 예외 발생 시 EventDispatcher->>EventRouter: 예외 발생 EventRouter->>EventDispatcher: 폴백 실행 요청 (fallback) EventDispatcher->>HandlerBean: 폴백 메서드 호출 end
sequenceDiagram participant SpringContext participant BeanPostProcessor participant EventDispatcher participant EventTypeRegistry SpringContext->>BeanPostProcessor: 빈 초기화 후 후처리 BeanPostProcessor->>BeanPostProcessor: @EventTypeMapping, @FallbackMapping 메서드 탐색 BeanPostProcessor->>EventDispatcher: 핸들러 및 폴백 등록 (register) BeanPostProcessor->>EventTypeRegistry: 이벤트 타입-클래스 매핑 등록 (register)
🧪 기여도 및 개인 역할
- 전체 아키텍처 설계 및 라이브러리 구현 100%
- 공통 모듈화 및 각 도메인 서비스에 적용하여 이벤트 전파 성공률 99% 이상 유지
- 제네릭 타입 처리 및 JSON 파싱 문제 해결 경험 공유 및 문서화