
Observer 패턴
한 객체의 상태가 변하면, 그 객체에 의존하는 다른 객체들이 자동으로 알림을 받아 갱신되도록 하는 일대다(One-to-Many) 의존 관계를 정의한 디자인 패턴이다.

이른바 "구독/발생(Pub-sub)" 구조다.
- Subject (발행자, Publisher) : 상태 변화를 감지하는 주체
- Observer (구독자, Subscriber) : Subject의 상태를 감시하다가 변화가 생기면 알림을 받고 동작
Observer
package org.example.observer
// Observer interface
interface Observer {
fun update(message: String)
}
// Subject interface
interface Subject {
fun addObserver(observer: Observer)
fun removeObserver(observer: Observer)
fun notifyObservers(message: String)
}
// ConcreteSubject
class NewsPublisher : Subject {
private val observers = mutableListOf<Observer>()
override fun addObserver(observer: Observer) {
observers.add(observer)
}
override fun removeObserver(observer: Observer) {
observers.remove(observer)
}
override fun notifyObservers(message: String) {
for (observer in observers) {
observer.update(message)
}
}
}
// ConcreteObserver
class NewsSubscriber(val name: String) : Observer {
override fun update(message: String) {
println("$name received news: $message")
}
}
fun main() {
val publisher = NewsPublisher()
val sub1 = NewsSubscriber("Alice")
val sub2 = NewsSubscriber("Bob")
publisher.addObserver(sub1)
publisher.addObserver(sub2)
publisher.notifyObservers("Breaking News: Kotlin is awesome!")
}
결과
Alice received news: Breaking News: Kotlin is awesome!
Bob received news: Breaking News: Kotlin is awesome!
장점
- 느슨한 결합 (Loose Coupling) : Subject와 Observer는 인터페이스로만 연결되므로 독립성이 높다.
- 새로운 동작이 필요해도 Subject를 수정하지 않고 Observer만 추가하면 된다.
- 가격 변동, 메시지 도착 등 '발생 시점이 불규칙한 신호'를 다루는 이벤트 기반 구조에 적합하다.
단점
- 알림 순서를 보장하지 않는다.
따라서 여러 Observer가 존재하고, 처리 순서가 중요하다면 별도의 제어 요소가 필요하다. > 우선순위 부여 - Observer가 많으면 알림 전파 비용이 커지고, 성능이 저하될 수 있다. > 비동기 처리 시스템 요구
- 누가 구독했고, 왜 특정 시점에 호출되는지 추적이 복잡해줄 수 있다. > 디버깅 문제
참고 자료
- https://dormoshe.io/trending-news/observer-design-pattern-explained-in-five-minutes-20850
-
Powered By. ChatGPT
'Backend' 카테고리의 다른 글
| [Backend] Generic Tutorial (Kotlin) (1) | 2025.09.11 |
|---|---|
| [Backend] Template Method 패턴 (1) | 2025.09.03 |
| [Backend] Singleton 패턴 (1) | 2025.09.03 |
| [Backend] Bulider 패턴 (1) | 2025.09.03 |
| [Backend] Factory 패턴 (1) | 2025.09.03 |