[항해 플러스 Lite 1기] 8주차 - 이벤트 및 MSA 설계
이벤트를 활용한 실시간 데이터 전송 및 MSA 설계
이번 주차에서 얻어가고 싶은 것
이번 주는 MSA 환경에서 실시간 데이터 흐름을 어떻게 처리할 수 있을지에 대한 이해를 넓히는 데 초점을 맞추고자 한다.
기존에는 마이크로서비스 간 데이터 전달을 동기 호출이나 폴링 방식에 의존했는데, 이번엔 이벤트 기반 아키텍처를 적용하면서 관심사 분리, 실시간 처리, 트랜잭션 연계라는 세 가지 키워드를 중심으로 설계를 고민해보자.
또한, 이벤트를 활용하면서 발생할 수 있는 데이터 정합성 이슈와 보상 트랜잭션 처리에 대해 많이 고민해보자.
과제 요구사항
- 주문 완료 시 외부 플랫폼으로 주문 정보를 전송하는 로직을 이벤트를 활용하여 개선
- MSA 기반 구조에서 서비스 간 의존성을 최소화하면서도 실시간성을 확보하는 아키텍처 설계
문제 상황
(1) 기존 구조에서는 결제 성공 시 외부 데이터 플랫폼을 단순히 Mock으로 구성된 PG사로 데이터를 전송하고 성공 여부를 응답받는 단순한 구조에 불과했다.
(2) 마이크로서비스 아키텍처에서 서비스를 분리하면 할수록, 데이터 정합성 유지와 트랜잭션 경계 처리가 더 어려워졌고, 적절한 이벤트 처리 방식이 필요했다.
시도
(1) 주문 생성 완료 시 OrderCompletedEvent를 발행하고, 이를 @TransactionalEventListener로 비동기 처리하여 결제 서비스에 주문 정보를 전달하도록 구조를 변경했다.
→ 기존에는 결제 서비스가 주문 서비스를 직접 호출했는데, 이제는 주문 서비스가 이벤트 발행자로 전환되어 관심사 분리가 확실해졌다.
(2) 이벤트 발행 시점은 트랜잭션 커밋 이후를 보장하기 위해 @TransactionalEventListener(phase = AFTER_COMMIT) 옵션을 사용했다.
→ 만약 발행 이전에 롤백이 발생하면 이벤트 자체가 발생하지 않기 때문에 데이터 정합성 보장이 가능해졌다. 또한 롤백 시 에러 로그를 남길 수 있도록 했다.
해결
(1) 주문 서비스에서 이벤트를 직접 발행하도록 변경하면서, 결제 서비스는 더 이상 주문 데이터를 직접 조회하지 않게 되었고, 서비스 간 느슨한 결합(loose coupling) 을 실현할 수 있었다
(2) 실시간 이벤트 전파 구조를 만들면서, 전체적인 시스템 흐름이 명확해졌고, 각 서비스가 자신의 책임에만 집중할 수 있는 구조로 정리되었다.
알게된 것
이벤트는 단순한 비동기 처리 수단이 아니라, 서비스 간 경계와 흐름을 자연스럽게 연결해주는 매개체라는 걸 확실히 느꼈다.
@TransactionalEventListener는 특히 도메인 이벤트를 활용한 내부 아키텍처 구성에서 유용했고, 커밋 이후에만 이벤트를 발행할 수 있도록 제어가 가능하다는 점도 인상 깊었다.
또한, 이전에 구현했던 쿠폰 발급 기능의 경우 스케줄러와 polling 방식으로 이벤트를 처리했었는데, 이벤트리스너를 활용하니 보다 실시간성이 보장되고 명확한 흐름을 가져 가독성이 향상되는 것을 느꼈다.
MSA 구조는 분명 복잡하고 분산 트랜잭션의 어려움도 존재하지만, 이벤트 기반 아키텍처를 적절히 활용하면 관심사를 명확히 분리할 수 있다는 가능성을 체감했다.
아쉬운 점
이번 구조에서 아직 이벤트 처리 실패에 대한 보상 트랜잭션 로직이 완전히 정립되지 못했다는 아쉬움이 있다.
특히 결제 서비스에서 이벤트를 정상 수신하지 못했을 경우나, 처리 중 오류가 발생했을 경우 어떤 식으로 리트라이 혹은 보상할지를 더 고민해야 할 것 같다.
또한, 이벤트 기반 구조는 분명 직관적이지만, 전체 흐름을 한눈에 파악하기 어렵고, 추적성과 모니터링 체계가 부족할 경우 장애 대응이 어려워진다는 점도 느꼈다.
다음 주차 목표
다음 주차에는 Kafka를 학습하는데, Kafka를 통해 보다 확장성 있고 범용성 있는 구조를 만들 수 있다는 생각에 기대된다.
Spring 자체에서 제공하는 이벤트 뿐만 아니라 외부 메세지 브로커를 활용하면 어떠한 장점이 있고 어떤 부분을 조심해야 하는지 유의해야겠다.
다음 주도 쉽지 않은 일정이지만, 차근차근 성실하게 임하자! 그러면 잘 해낼 수 있다. 🙌
항해플러스 Lite 백엔드 2기 모집이 시작되었습니다!
관심있는 분들께서는 아래 페이지 읽어보시고 등록하실 때 아래 코드 입력하시면 10만원 추가 할인을 받으실 수 있습니다!
과정 상 궁금하신 내용은 댓글 남겨주시고 추후 후기를 남길 예정이니 참고하셔도 좋습니다 :)
추천인 코드: o3HXzU
항해 플러스 Lite 백엔드 코스
바쁜 개발자를 위한 1인 부트캠프, 내 일정에 맞춰 꾸준히 학습해요.
hanghae99.spartacodingclub.kr