스택큐힙리스트

“구독 · 알림 · 자동 반응” — Observer 패턴 한눈에 이해하기 본문

개발

“구독 · 알림 · 자동 반응” — Observer 패턴 한눈에 이해하기

스택큐힙리스트 2025. 7. 22. 10:02
반응형

변화가 생기면 알아서 퍼지게 하자! 이벤트 버스·알림 시스템의 기본 뼈대

 

Observer가 뭐길래?

Observer(옵저버) 패턴은 “관찰 대상(Subject)”“구독자(Observer)” 사이에 느슨한 연결을 만들어,
대상에게 변화가 생길 때마다 구독자에게 자동으로 알림을 뿌려 주는 행위(Behavioral) 패턴입니다.
쉽게 말해 “뉴스레터 발송” 구조와 똑같습니다 — 발행인이 기사(상태)를 갱신하면, 구독자 메일함(반응)이 자동으로 울리니까요.


언제 유용할까?

  1. 이벤트 버스: Spring ApplicationEventPublisher처럼 서비스 곳곳에서 발생한 도메인 이벤트를 한 줄로 발행 → 여러 리스너가 동시에 처리
  2. UI 데이터 바인딩: Jetpack Compose·SwiftUI 같은 선언형 UI가 상태 변화를 감지해 화면을 즉시 재구성
  3. 실시간 알림 시스템: 새로운 게시글, 댓글, 거래 완료 등 웹훅·푸시·이메일을 병렬 전송
  4. 캐시 무효화: 원본 데이터가 수정되면 캐시 저장소들에게 “리로드” 신호 발사

구조를 말로 툭

  • Subject: 구독 목록 보관, 상태 변화 시 notify() 호출
  • Observer: update() 메서드를 구현해 반응 로직 작성
  • Loose Coupling: Subject는 “누가 구독했는지” 모른 채 알림만 전송 → 확장·테스트가 쉬워짐

Kotlin 코드 감각 익히기

interface Observer {            // 구독자 규약
    fun update(msg: String)
}

class User(private val name: String) : Observer {
    override fun update(msg: String) = println("$name 알림: $msg")
}

class PostService {
    private val subs = mutableSetOf<Observer>()         // 구독 목록

    fun subscribe(o: Observer) = subs.add(o)
    fun unsubscribe(o: Observer) = subs.remove(o)

    fun writePost(title: String) {
        println("새 글 등록: $title")
        subs.forEach { it.update(title) }               // 변화 알림
    }
}

fun main() {
    val service = PostService()
    val a = User("민수"); val b = User("지은")
    service.subscribe(a); service.subscribe(b)

    service.writePost("Observer 패턴, 이렇게 쉽다!")    // 둘 다 알림
    service.unsubscribe(a)
    service.writePost("다음 편 예고")                   // 지은만 알림
}

핵심 포인트: PostService는 “알려야 하는 사실”만 관심 있고,
알림 이후 무엇을 할지는 Observer 쪽에서 자유롭게 결정합니다.


장단점 한 줄 정리

  • 장점: 결합도↓, 확장성↑, 이벤트 기반 아키텍처와 찰떡
  • 단점: 구독자 수 많아지면 호출 순서·오류 처리·성능 튜닝 필요
반응형
Comments