PHpullh
학습 라이브러리/Kotlin/이벤트 버스 (Event Bus)

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를 선호하세요.