면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

안드로이드에서의 옵저버 패턴(Observer Pattern)

skydovesJaewoong Eum (skydoves)||7분 소요

안드로이드에서의 옵저버 패턴(Observer Pattern)

옵저버 패턴(Observer Pattern)은 하나의 객체(주체, Subject)와 여러 의존 객체(옵저버, Observer) 사이에 일대다(one-to-many) 관계를 설정하여, 주체의 상태가 변경되면 등록된 모든 옵저버에 자동으로 알림을 보내는 디자인 패턴입니다. 안드로이드에서는 이 패턴이 리액티브 UI 아키텍처의 근간을 이루며, 데이터 레이어에서 상태 변경을 방출하고 UI 레이어에서 이를 관찰하여 화면을 갱신하는 구조로 폭넓게 활용됩니다. 안드로이드 면접에서도 자주 다뤄지는 주제이므로, 단순히 패턴의 정의만 외우기보다 실제 코드에서 어떻게 적용되는지까지 이해하시는 것이 중요합니다.

이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • 주체(Subject)와 옵저버(Observer)의 관계, 그리고 상태 변경 알림이 전파되는 원리를 설명할 수 있습니다.
  • StateFlow, SharedFlow, LiveData와 수동(manual) 옵저버 구현 방식의 차이를 비교하고 이해합니다.
  • 안드로이드에서 생명주기 인식(lifecycle awareness)이 리소스 누수를 어떻게 방지하는지 설명할 수 있습니다.
  • ViewModel에서 Flow와 Compose 상태를 활용하여 UI 레이어에 연결하는 방법을 익힙니다.
  • 안드로이드에서 핫 스트림(hot stream)과 콜드 스트림(cold stream)의 트레이드오프를 파악할 수 있습니다.

주체(Subject)와 옵저버(Observer)의 동작 원리

옵저버 패턴은 두 가지 참여자로 구성됩니다. 주체(Subject)는 등록된 옵저버 목록을 관리하며, 내부 상태가 변경될 때 모든 옵저버에 알림을 보냅니다. 각 옵저버는 콜백 인터페이스를 구현하고, 주체가 알림을 보낼 때 해당 콜백이 호출되는 구조입니다. 여기서 핵심은 주체가 옵저버의 구체적인 타입을 알지 못한다는 점입니다. 주체는 오직 옵저버 인터페이스만 알고 있으면 되므로, 구현체에 대한 의존 없이 느슨한 결합(loose coupling)을 유지할 수 있습니다.

interface Observer<T> {
    fun onChanged(value: T)
}

class Subject<T>(initialValue: T) {
    private val observers = mutableListOf<Observer<T>>()
    private var value: T = initialValue

    fun addObserver(observer: Observer<T>) { observers.add(observer) }
    fun removeObserver(observer: Observer<T>) { observers.remove(observer) }

    fun setValue(newValue: T) {
        value = newValue
        // 등록된 모든 옵저버에 새로운 값을 알림
        observers.forEach { it.onChanged(newValue) }
    }
}

이러한 디커플링 덕분에 주체는 UI 레이어에 대한 의존 없이 데이터 레이어 모듈에 독립적으로 존재할 수 있습니다. UI 레이어는 옵저버로 등록하여 변경에 반응하기만 하면 됩니다. 새로운 옵저버를 추가하더라도 주체를 수정할 필요가 없으므로, 개방-폐쇄 원칙(Open/Closed Principle)을 자연스럽게 만족합니다.

위의 수동 구현은 옵저버 패턴의 핵심 개념을 잘 보여 주지만, 스레드 안전성과 생명주기 인식 기능이 빠져 있습니다. 실제 프로덕션 안드로이드 코드에서는 직접 구현하는 대신 StateFlow, LiveData, 또는 SharedFlow를 사용하는 것이 바람직합니다. 이들은 동시성 처리, 배압(backpressure) 관리, 그리고 생명주기 통합을 별도 설정 없이 기본적으로 지원하기 때문입니다. 면접에서 옵저버 패턴에 대해 질문을 받으셨을 때, 이처럼 수동 구현의 한계까지 함께 설명하시면 깊이 있는 답변이 될 수 있습니다.

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기