실무 프로젝트로 배우는 Kotlin & Spring/리액티브 프로그래밍

Observer 패턴

webmaster 2022. 11. 28. 20:16
728x90

Observer 패턴 

  • observer 패턴은 GoF의 디자인 패턴 중 하나로 관찰 대상이 되는 객체가 변경되면 대상 객체를 관찰하고 있는 observer에게 변경사항을 통지하는 디자인 패턴을 말한다.
  • observer 패턴을 사용하면 객체 간의 상호작용을 쉽게 하고, 효과적으로 데이터를 전달할 수 있다.

구조

observer 패턴 구조

  • observer 패턴은 관찰 대상인 Subject와 Subject를 관찰하는 Observer로 이루어져 있다.
  • 하나의 Subject에는 1개/여러 개의 observer를 등록할 수 있다.
  • Subject의 상태가 변경되면, 자신을 관찰하는 Observer들에게 변경사항을 통지한다.
  • Subject로 변경사항을 통지 받은 Observer는 부가적인 처리를 한다.
  • observer 패턴은 Subject와 Observer를 상속한 구체화된 클래스가 존재하며, 그 클래스는 Subject와 Observer에 대한 상세 구현을 작성한다.

Subject 함수

함수 설명
add 서브젝트의 상태를 관찰할 observer 등록한다
remove 등록된 observer를 삭제한다
notify 서브젝트 상태가 변경되면 등록된 observer에 통지한다

Observer 함수

함수 설명
update 서브젝트의 notify 내부에서 호출되며 서브젝트의 변경에 따른 부가 기능을 처리

Observer 패턴 구현

class Coffee(val name: String)

//Subject
class Barista : Observable() {
    private lateinit var coffeeName: String

    fun orderCoffee(name: String) {
        this.coffeeName = name
    }

    fun makeCoffee(){
        setChanged()
        notifyObservers(Coffee(this.coffeeName))
    }
}

//observer
class Customer(val name: String): Observer{
    override fun update(o: Observable?, arg: Any?) {
        val coffee = arg as Coffee
        println("${name}이 ${coffee.name}을 받았습니다")
    }
}

fun main() {
    val barista = Barista()
    barista.orderCoffee("아이스 아메리카노")

    val customer = Customer("고객1")
    val customer2 = Customer("고객2")
    val customer3 = Customer("고객3")

    barista.addObserver(customer)
    barista.addObserver(customer2)
    barista.addObserver(customer3)
    barista.makeCoffee()
}
  • JDK 1.0부터 포함된 Observable 클래스와, Observer 인터페이스를 사용한 예제이다.
  • Custom 클래스는 Observer 인터페이스를 구현하며, Barista 클래스가 커피를 완성하면 통지를 받아 update 함수를 처리한다.
  • Barista 클래스는 Observable 클래스를 상속하여 고객이 주문한 커피가 만들어지면,  notifiyObservers로 고객에게 만들어진 Coffee 객체를 전달한다.
    • setChanged()를 먼저 호출하여 변경 여부를 내부에 저장한다.
  • Customer 클래스가 Barista 클래스를 관찰하기 위해 addObserver로 등록한다.

Observer 패턴 장점

  • observer 패턴을 사용하지 않았다면 고객은 일정 간격으로 커피가 완성됐는지 바리스타에게 확인하는 처리가 있어야 한다.
  • 간격이 너무 짧으면 변경된 상태를 빠르게 확인할 수 있지만, 매번 불필요한 호출이 발생하므로 성능상 문제가 발생할 수 있다.
  • 간격이 너무 길면 변경된 상태를 즉시 확인할 수 없으므로 실시간성이 떨어질 수 있다.
  • observer 패턴은 관찰자인 observer가 서브젝트의 변화를 신경 쓰지 않고 상태 변경의 주체인 Subject가 변경사항을 observer에게 알려줌으로써 위 문제를 해결할 수 있다.
  • observer 패턴은 데이터를 제공하는 쪽에서 데이터를 소비하는 측에 통지하는 Push 방식이다.

Observer 패턴에서 서브젝트와 Observer는 관심사에 따라 역할과 책임이 분리되어 있다

  • Subject는 Observer 각 어떤 작업을 하는지 Observer의 상태가 어떤지에 대해 관심을 가질 필요가 없고 오직 변경 사항을 통지하는 역할만 수행하고, 하나/ 다수의 Observer는 각각 맡은 작업을 스스로 하기 때문에 observer가 하는 일이 Subject에 영향을 끼치지 않고 Observer는 단순한 데이터의 소비자로서 존재하게 된다.

 

728x90