개발
home
🕙

[디자인 패턴] 옵저버 패턴

Created
2022/03/27
Tags
Design Pattern
Observer Pattern
2022-03-27 @이영훈

옵저버 패턴

객체의 상태 변화를 관찰하는 관찰자들(옵저버) 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다.

아빠와 IoT 예제

아빠가 집에 돌아오면 IoT(Internet Of Thing) 기기들(무드등, 스피커)이 동작하는 예제입니다.
전체적인 구조는 다음 그림과 같습니다.

아빠와 IoT 예제 구현

아빠 클래스 구현입니다.
아빠 클래스는 IoT 기기들을 저장할 수 있는 리스트를 목록으로 가집니다. IoT를 등록하는 매소드가 있습니다. 그리고 집에 도착했을 때 IoT 기기들을에게 통보하는 arrviedHome 매소드도 있습니다.
public class Father { private final List<Observable> iotList = new ArrayList<>(); public void addIoT(Observable iot) { iotList.add(iot); } public void arrivedHome() { for (Observable iot : iotList) { iot.onArrive(); } } }
Java
복사
Observable 인터페이스입니다.
Observable 인터페이스는 사람(아빠)가 집에 도착했을 때 호출할 함수를 가집니다. 출근할 때 통보할 함수 등을 추가해서 확장할 수 있습니다.
public interface Observable { public void onArrive(); }
Java
복사
Observable 인터페이스를 구현하여 스마트 무드등스마트 스피커를 만듭니다.
public class SmartMoodLight implements Observable { public void turnOnLight() { System.out.println("💡 Turn on light"); } @Override public void onArrive() { turnOnLight(); } }
Java
복사
public class SmartSpeaker implements Observable { public void playMusic() { System.out.println("🎹 Play music"); } @Override public void onArrive() { playMusic(); } }
Java
복사

아빠와 IoT 예제 실행

이제 위에서 만든 예제를 실행해보겠습니다.
public class ObserverApplication { public static void main(String[] args) { Father father = new Father(); SmartMoodLight smartMoodLight = new SmartMoodLight(); SmartSpeaker smartSpeaker = new SmartSpeaker(); // 📝 아빠 인스턴스가 변경되었을 때 통지받을 IoT를 등록합니다 father.addIoT(smartMoodLight); father.addIoT(smartSpeaker); father.arrivedHome(); // 💡 Turn on light // 🎹 Play music } }
Java
복사

Observer 패턴과 Publish/Subscribe 구조의 차이

가장 큰 차이점은 중간에 Message Broker 또는 Event Bus가 존재하는지 여부입니다.
1.
Pub/Sub 구조에서는 중간에 Message Broker를 둬서 객체 간에 결합도를 더 낮춥니다.
2.
객체 간에 서로의 존재를 몰라도 됩니다. 각 객체는 Message Broker만 알고 있습니다.
3.
Observer 패턴에서는 동기 방식 (blocking)으로 동작하고, Pub/Sub 구조에서는 비동기 (async) 방식으로 동작합니다.
4.
Pub/Sub 구조에서는 Message Broker를 중간에 둬서 다른 도메인의 어플리케이션 간에 통신하는 방식도 구현이 가능합니다.
Pub/Sub 구조를 사용하는 예시는 MQTT 프로토콜, AWS SNS(Simple Notification Service) 등 많은 곳에서 찾아볼 수 있습니다.

Ref.