KOTLIN · 디자인패턴
이벤트 버스 (Event Bus)
컴포넌트 간 느슨한 결합을 위한 이벤트 버스를 SharedFlow로 구현합니다.
디자인패턴중급event-bussharedFlowpub-subdecoupling
핵심 설명
컴포넌트 간 느슨한 결합을 위한 이벤트 버스를 SharedFlow로 구현합니다.
Kotlin code
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
object EventBus {
private val _events = MutableSharedFlow<Any>(extraBufferCapacity = 100)
suspend fun publish(event: Any) { _events.emit(event) }
inline fun <reified T> subscribe(): Flow<T> =
_events.filterIsInstance<T>()
}
// 이벤트 정의
sealed class AppEvent {
data class UserLoggedIn(val userId: String) : AppEvent()
data class OrderPlaced(val orderId: String, val total: Int) : AppEvent()
data class ErrorOccurred(val message: String) : AppEvent()
}
fun main() = runBlocking {
// 구독자 등록
val job1 = launch {
EventBus.subscribe<AppEvent.UserLoggedIn>().collect {
println("인증 모듈: ${it.userId} 로그인")
}
}
val job2 = launch {
EventBus.subscribe<AppEvent.OrderPlaced>().collect {
println("알림 모듈: 주문 ${it.orderId} (${it.total}원)")
}
}
delay(50)
// 이벤트 발행
EventBus.publish(AppEvent.UserLoggedIn("user-001"))
EventBus.publish(AppEvent.OrderPlaced("ORD-123", 50000))
EventBus.publish(AppEvent.ErrorOccurred("네트워크 오류"))
delay(100)
job1.cancel(); job2.cancel()
}학습 팁
filterIsInstance()로 관심 있는 이벤트 타입만 구독하면 타입 안전한 이벤트 처리가 가능합니다.
주의할 점
이벤트 버스를 남용하면 이벤트 흐름 추적이 어려워집니다. 직접 의존성 주입이 가능한 경우에는 DI를 선호하세요.
자주 묻는 질문
이벤트 버스 (Event Bus)란 무엇인가요?
컴포넌트 간 느슨한 결합을 위한 이벤트 버스를 SharedFlow로 구현합니다.
이벤트 버스 (Event Bus) 학습 시 주의할 점은 무엇인가요?
이벤트 버스를 남용하면 이벤트 흐름 추적이 어려워집니다. 직접 의존성 주입이 가능한 경우에는 DI를 선호하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.