행동 - 1. Observer

mskimdev·2026년 5월 19일

Design Pattern

목록 보기
10/13

Observer 패턴

유튜브 채널을 구독하면 새 영상이 올라올 때 알림이 온다. 구독자가 1명이든 100만 명이든 채널은 신경 쓰지 않는다. 영상을 올리면 구독한 사람 전원에게 알림이 전달될 뿐이다.

이 구조가 Observer 패턴이다.


Observer 패턴이란

객체의 상태가 바뀌면, 그 객체를 구독하고 있는 다른 객체들에게 자동으로 통보하는 패턴이다. 통보하는 쪽을 Subject(발행자), 통보받는 쪽을 Observer(구독자) 라고 부른다.

Subject는 Observer가 누구인지, 몇 명인지 알 필요 없다. Observer를 등록·해제할 수 있는 창구만 열어두면 된다.


구조

// Observer 인터페이스
public interface Observer {
    void update(String message);
}

// Subject 인터페이스
public interface Subject {
    void subscribe(Observer observer);
    void unsubscribe(Observer observer);
    void notifyObservers(String message);
}
// 구체 Subject — 유튜브 채널
public class YoutubeChannel implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String channelName;

    public YoutubeChannel(String channelName) {
        this.channelName = channelName;
    }

    @Override
    public void subscribe(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void unsubscribe(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update("[" + channelName + "] " + message);
        }
    }

    // 새 영상 업로드 시 구독자 전원에게 알림
    public void uploadVideo(String title) {
        System.out.println("영상 업로드: " + title);
        notifyObservers("새 영상: " + title);
    }
}
// 구체 Observer — 구독자
public class Subscriber implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + " 알림 수신 → " + message);
    }
}
YoutubeChannel channel = new YoutubeChannel("자바채널");

Subscriber s1 = new Subscriber("김자바");
Subscriber s2 = new Subscriber("이파이썬");
Subscriber s3 = new Subscriber("박코딩");

channel.subscribe(s1);
channel.subscribe(s2);
channel.subscribe(s3);

channel.uploadVideo("Observer 패턴 완전 정복");
// 김자바 알림 수신 → [자바채널] 새 영상: Observer 패턴 완전 정복
// 이파이썬 알림 수신 → [자바채널] 새 영상: Observer 패턴 완전 정복
// 박코딩 알림 수신 → [자바채널] 새 영상: Observer 패턴 완전 정복

channel.unsubscribe(s2);
channel.uploadVideo("Decorator 패턴 완전 정복");
// 김자바, 박코딩만 알림 수신

Java의 내장 지원

Java는 java.util.Observable(클래스)과 java.util.Observer(인터페이스)를 제공했지만, Java 9부터 deprecated됐다. 직접 인터페이스를 만들어 쓰거나, PropertyChangeListener 같은 대안을 쓰는 방식이 권장된다.


언제 쓰는가

  • 한 객체의 상태 변화를 여러 객체에 전파해야 할 때
  • 구독·취소가 동적으로 바뀌는 경우
  • Subject와 Observer가 느슨하게 결합되어야 할 때 — Subject는 Observer의 구체 타입을 몰라도 된다

Observer의 핵심은 "알려줄게, 관심 있으면 등록해" 구조다. Subject가 Observer를 직접 찾아다니지 않는다. 관심 있는 쪽이 먼저 구독하고, 변화가 생기면 일괄 통보된다.

profile
<- 개발 공부하는 나

0개의 댓글