JAVA

[JAVA] 옵저버 패턴(Observer Pattern)이란?

sagecode 2025. 5. 23. 17:07

옵저버 패턴이란?

옵저버 패턴은 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메소드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.

 

주체(객체)와 옵저버

public interface ISubject {
    public void registerObserver(IObserver observer);
    public void removeObserver(IObserver observer);
    public void notifyObservers();
    public Object getUpdate(IObserver observer);
}

public interface IObserver {
    void update();
}

public class ConcreteSubject implements ISubject {
    private List<IObserver> observers;
    private String message;

    public ConcreteSubject() {
        this.observers = new ArrayList<>();
        this.message = "";
    }

    @Override
    public void registerObserver(IObserver observer) {
        if (!observers.contains(observer)) {
            observers.add(observer);
        }
    }

    @Override
    public void removeObserver(IObserver observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        this.observers.forEach(IObserver::update);
    }

    @Override
    public Object getUpdate(IObserver observer) {
        return this.message;
    }

    public void postMessage(String message) {
        System.out.println("Message: " + message);
        this.message = message;
        notifyObservers();
    }
}

public class Subscriber implements IObserver {
    private String name;
    private ConcreteSubject subject;

    public Subscriber(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
    }

    @Override
    public void update() {
        String message = (String) subject.getUpdate(this);
        System.out.println(name + ":: got message >> " + message);
    }
}

위에 코드에서는 주체와 객체가 같다.

 

주체 ISubject 인터페이스를 ConcreteSubject로 구현했고, 그 클래스에 이 주체를 구독하고 있는 observers 리스트와 옵저버들에게 전달한 message를 선언했다.

 

메소드는 아래와 같이 정의했다.

  • registerObserver() : 옵저버가 이 주체를 구독
  • removeObserver() : 옵저버의 구독을 해제
  • notifyObserver() : 이 주체를 구독하고 있는 옵저버들에게 메시지를 전달
  • getUpdate() : 변경사항을 메시지에 갱신

 

 

옵저버 IObserver를 구현한 Subscriber에는 이름 name과 구독하고 있는 주체 subject를 선언했다.

 

메소드는 아래와 같이 정의했다.

  • update() : 주체로부터 어떤 메시지를 옵저버가 받았는지 저장 및 출력

옵저버 패턴의 장점

  • 변화에 유연하게 대응 가능
    • 새로운 옵저버를 추가해도 기존의 주체(객체)를 수정할 필요 없음
    • 동적으로 옵저버를 등록하거나 제거할 수 있음(OCP 만족)
  • 이벤트 기반 시스템 구현에 적합
    • 실시간 알림 시스템 등 변화에 즉각적으로 반응해야 하는 시스템에 적합함
  • 주체와 옵저버 사이의 느슨한 결합을 가능하게 함
    • 주체는 옵저버에 대해서 알 필요가 없다

옵저버 패턴의 단점

  • 디버깅 어려움
    • 주체와 옵저버가 느슨하게 연결되어 있기 때문에 옵저버의 행위 추적에 어려움을 느낌
  • 성능 이슈
    • 옵저버가 점점 많아질수록 많은 옵저버에게 변화에 대한 메시지를 전달해야 함
    • 비동기 처리를 고려하지 않을 경우에 한 옵저버에 지연이 걸릴 경우 전체 흐름에 문제가 생김