Skip to content

juneyr.dev

옵저버 패턴 🌚

DesignPattern, Java1 min read

HEAD FIRST DESIGN PATTERN 을 정리합니다.

01 스트레티지 패턴 보기

02 옵저버 패턴

WeatherData 예제

기상정보를 알려주는 Weather Data 객체를 기반으로 디스플레이 장비를 만들어봅니다.

WeatherData는 기상스테이션에서 받아오는 온도, 습도, 압력 정보가 있고 - 이를 표시하기만 하면 됩니다.

조건

  • 데이터가 변할 때마다 measurementsChanged 메소드가 불리고, 우리는 이때마다 디스플레이를 업데이트해야합니다.
  • 시스템이 확장 가능해야합니다.

이렇게 만들면 어떨까요..? (나쁜 예)

이 코드는..

  • 구체적인 구현에 맞춰 코딩해서 프로그램을 고치지 않으면 다른 디스플레이를 넣을 수 없습니다.
  • display.update 부분이 바뀔수 있어 캡슐화해야합니다.

옵저버 패턴

옵저버 패턴은 신문 구독과 같은 매커니즘입니다. 크게 주제 Subject 객체와 옵저버 Observer 객체가 존재하는데요. 다음과 같은 흐름을 따라갑니다.

  1. 주제 객체에서 일부 데이터를 관리합니다.
  2. 옵저버 객체들은 주제 객체들을 구독하고 있으며, 주제의 데이터가 달라지면 갱신 내용을 전달 받습니다.
  3. 주제의 데이터가 달라지면 옵저버에게 그 소식이 전해집니다.
  4. 옵저버가 아닌 객체는 주제 객체의 데이터가 바뀌어도 아무런 연락을 못받습니다.

옵저버 패턴에서는 한 객체의 상태가 바뀌면, 그 객체에 의존하는 다른 객체들에게 연락이 가고, 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의합니다.

observer

옵저버 클래스 다이어그램

observerclassdiagram

여기서 데이터의 주인은 주제입니다. 옵저버는 주제의 데이터가 바뀌기를 기다리기때문에 주제에 의존성을 가진다 라고 말할 수 있습니다.

옵저버 패턴에서는 주제와 옵저버가 느슨하게 결합

느슨하게 결합한다는 말은 둘이 상호작용을 하긴하지만 서로에 대해서 잘 모른다

는 것을 의미합니다.

  • 주제가 옵저버에 대해서 아는 것은 특정 인터페이스를 구현한다는 것 뿐입니다.
  • 옵저버는 언제든지 새로 추가할 수 있습니다.
  • 새로운 옵저버를 추가해도 주제를 변경할 필요가 없습니다.
  • 주제와 옵저버는 서로 독립적으로 재사용할 수 있습니다.
  • 주제와 옵저버가 바뀌더라도 서로에게 영향을 미치지는 않습니다.

느슨한 결합(loose coupling) 을 사용하면 변경 사항이 생겨도 유연하게 처리할 수 있는 객체지향 시스템을 구현할 수 있습니다.

옵저버로 WeatherData 예제 를 구현해봅시다.

옵저버 패턴을 위 예제에서 구현해봅시다. WeatherData는 바뀌는 정보를 담고 있는 주제객체로, Display는 이를 구독하는 옵저버 객체로 매핑할 수 있습니다.

실제 WeatherData를 한번 보겠습니다.

수치가 변화할 때마다 Observer들에게 notify합니다.

그러면 Observer 역할인 Display를 보겠습니다.

interface에서 상속받은 update, display 를 각각 구현하고 있습니다.

추가로 - Observer 와 publish-sub 패턴은 뭐가 다를까?

참고

Publish - Subscribe 구조는 Observer와 비슷하지만 차이점이 있습니다.

바로 중간에 메시지 브로커 가 존재한다는 것인데요. 이렇게 해서 Pub-Sub구조에서는 아예 서로를 인지하지 못하게 됩니다. 둘다 중간에 있는 브로커만 바라보게 됩니다.

  • 브로커가 message queue를 많이 쓰기때문에, async방식임 (queue에서 나올 때 sub에게 전달)
  • observer보다 더 loose 한 coupling

오늘은 2장 Observer패턴에 대해서 정리했는데요.

도움이 되셨으면 좋겠습니다.