행복해지자
Published 2023. 6. 7. 17:31
DDD 이벤트(Event) Java

이벤트

시스템간 강결합 문제

트렌젝션 처리 애매함
성능이 외부 서비스에 직접적인 영향
A와 B가 강하게 결합되에 있어 서로 영향을 받음.

  • 해결법
    • 이벤트
    • 비동기

이벤트 개요

이벤트란?

이벤트 : 과거에 벌어진 어떤 것

구성요소

이벤트 생성 주체, 디스패처, 핸들러
핸들러는 이벤트에 반응해서 원하는 기능을 실행

용도

  1. 트리거
    • 도메인의 상태가 바뀔때 후처리가 필요하면 실행하기 위한 트리거
  2. 데이터 동기화
    • 외부 서비스의 정보를 동기화

이벤트,핸들러,디스패처 구현

이벤트 클래스

이름을 과거시제로 사용
최소한의 데이터를 포함

디스패처 (퍼블리셔)

스피링이 제공하는 ApplicationEventPublisher사용

이벤트 핸들러

@EventListener를 사용해서 구현

동기 이벤트 처리문제

강결합 문제는 해소 but 외부서비스 영향 해결X

비동기 이벤트 처리하기

  • 로컬 핸들러를 비동기로
  • 메세지 큐를 사용
  • 저장소와 포워더 사용
  • 저장소와 api사용하기

로컬 핸들러

별도 스레드로 실행
@Async 어노테이션 사용(메서드) @EnableAsync 어노테이션으로 비동기를 활성화(클래스)

메시징 시스템

Kafka나 RabbitMQ 사용
디스패쳐가 메시지 큐애 이벤트를 보냄
메시지 큐에서 처리

이벤트 저장소

일단 db에 저장한뒤에 별도 프로그램을 이요해서 전달
API방식도 같음

고려사항

이벤트 소스를 EventEntry에 추가할지 여부 (누가 발생했는지?)
전송 실패 횟수

트렌젝션 고려

트렌젝션이 성공했을때만 리스너 실행하면 됨

'Java' 카테고리의 다른 글

DDD CQRS  (0) 2023.06.07
DDD 도메인 모델과 바운디드 컨텍스트  (0) 2023.06.03
DDD 애그리거트 트랜젝션 관리  (0) 2023.06.03
DDD 도메인 서비스  (0) 2023.06.03
DDD 응용서비스와 표현 영역  (0) 2023.06.03
profile

행복해지자

@qlido

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!