이벤트 모듈 설계 다이어그램
Event
abstract class Event(
val eventId: String,
val eventTime: LocalDateTime,
)
eventId
와 eventTime
은 필수로 가질 수 있도록 정의하였습니다.
@EventDetails
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
@DomainEvent
annotation class EventDetails(
val outBox: Boolean = false,
)
Event
클래스가 비즈니스 로직을 처리하는 과정에서 필요하지 않은 정보를 위한 어노테이션입니다.
outBox
: 해당 이벤트가 외부까지 전달되어야 하는지 여부에 대한 표시입니다.
EventListener
interface EventListener<T : Event> {
fun onEvent(event: T)
}
발행된 Event
를 구독하는 책임을 가집니다.
그리고 비즈니스 로직 처리를 위해 수신한 Event
를 EventHandler
로 전달합니다.
EventHandler
interface EventHandler<T : Event> {
fun handle(event: T)
}
발행된 Event
에 대한 비즈니스 로직을 처리합니다.
Message
abstract class Message(payload: MessagePayload) {}
외부 서비스, 인프라와의 통신을 위한 객체입니다.
MessagePayload
data class MessagePayload (
val eventId: String,
val eventType: String,
val eventTime: LocalDateTime,
val data: Map<String, Any>,
)
eventId
:Message
식별을 위한 값입니다.eventType
: 어떤Event
에 해당하는지 식별하기 위한 값입니다.eventTime
:Message
발행 시간입니다.data
:Event
를 생성하기 위해 필요한 값입니다.
MessageMapper
abstract class MessageMapper<T : Event, R : Message> {
abstract fun map(event: T): Optional<R>
}
Event
를 외부 서비스, 인프라로 전달하기 위해 Message
로 변경합니다.
MessageSender
interface MessageSender<T : Message> {
fun send(message: T)
}
Message
를 외부 서비스, 인프라로 전달합니다.
MessageRelay
interface MessageRelay<T : Message> {
fun publish(message: T)
}
어플리케이션의 Event
를 구독하여 Message
로 외부에 전달합니다.
MessageReverseRelay
interface MessageReverseRelay<T : Event> {
fun publish(event: T)
}
외부에서 구독한 Message
를 Event
로 변환하여 어플리케이션으로 전달합니다.
'개발' 카테고리의 다른 글
SQS 리스너 구현기 (0) | 2025.01.16 |
---|---|
도메인 이벤트 모듈 구성 (0) | 2025.01.16 |
레디스를 메시지 브로커로 사용하기 위한 정리 (1) | 2024.12.03 |
테스트 객체 용어 정리 (0) | 2024.12.01 |
MC/DC 커버리지 (0) | 2024.12.01 |