티스토리 뷰

Observer 패턴 선택 이유 :

지피티에게 헌터앤애니멀 코드를 보여주고, 이 코드에 필요한 패턴이 무엇이냐고 물어보니, 옵저버 패턴을 추천했다. 

 

지피티의 아이디어는 이러하다.

-한 캐릭터의 상태 변화(죽음)가 다른 객체들에게 자동으로 전달되도록 한다. 

 

이를 보고 알아두면 나중에 코드 고치기에 용이할 것 같아 조사해보려고 한다.

 

Observer 패턴이란 : 

한 객체의 상태 변화가 여러 객체에게 자동으로 통지되는 구조이다.

출처 : 옵저버(Observer ) 패턴 개념 및 구현 방법(Java, JavaScript)

 

Observer 패턴 예시1 :

1. 유튜버-구독자 예시

유튜버가 새 영상을 업로드했다고 하자. 

- 유튜버: Subject

- 구독자들: Observers

가 돼서 구독자들에게 유튜버의 상태 변화(영상 올림) 알림이 자동으로 가게 된다. 

 

Observer 패턴 예시2 :

2. 가수-팬 예시

가수가 새 앨범을 발매했다고 해보자.

- Taylor : 발행자 subject

- 팬들 : 구독자 observer

Taylor가 새 앨범 나왔어! 하고 한 번만 올리면, 전 세계 팬들에게 알림이 간다.

Taylor는 팬들이 누군지, 몇 명인지 몰라도 공지를 올리면 끝.

팬들은 알아서 구독, 알아서 반응한다.

 

<지피티가 짜 준 코드 : 가수 - 팬 "새 앨범 나왔다고 알리기" >

 

작동 흐름

1. 팬들이 Taylor 팔로우 : attach()

2. Taylor가 "새 앨범 나왔어!" 게시 : notifyAll()

3. 등록된 모든 팬들에게 동시에 알림이 간다 : update()

 

//observer interface (팬들)
interface Observer {
	void update(String message);
}

//subject interface (테일러 스위프트)
interface Subject {
	void attach(Observer o);//팬들이 테일러 구독
    void detach(Observer o);//팬들이 구독 취소
    void notifyAll(String message);
}

class TaylorSwift implements Subject {
	private final List<Observer> fans = new Arraylist<>();
    
    public void attach(Observer o) {fans.add(o);}//팬 목록에 옵저버 o를 등록한다.(팬들 리스트에 새로운 팬 추가)
    public void detach(Observer o) {fans.remove(o);}//팬 목록에 옵저버 o를 제거한다. 
	
    //등록된 팬들 호출해서 한꺼번에 알리기
    public void notifyAll(String message) {
        for (Observer o : fans)
            o.update(message);
    }

    public void releaseAlbum(String album) {
        notifyAll("New album out now: " + album + " 💿");
    }
}

// 구체적인 옵서버 (팬)
class Fan implements Observer {
    private final String name;
    public Fan(String name) { this.name = name; }
	
    //팬이 소식을 받게 된다.
    public void update(String msg) {
        System.out.println(name + " received: " + msg);
    }
}

// 실행 예시
public class Main {
    public static void main(String[] args) {
        TaylorSwift taylor = new TaylorSwift();
        Fan fan1 = new Fan("Namgyu");

        taylor.attach(fan1);//fan1이 taylor 구독
		
        //taylor가 releaseAlbum 메소드를 호출하면 -> notifyAll 호출 -> notifyAll 메소드 안에서 옵저버.update 호출
        //최종적으로 옵저버에게 알림 간다.
        taylor.releaseAlbum("Midnights");
    }
}

 

꽤 재밌는 주제로 코드를 짜줘서 그런지 이해하기가 쉬웠다.

그리고 좀 더 물어보니 지금 배우고 있는 소프트웨어 공학과 컴퓨터 네트워크 관련한 실무 예시도 알려줬다.

 

1. 소프트웨어 공학에서의 옵저버 패턴

- MVC 아키텍처 패턴의 일부

MVC(Model-View-Controller)에서 모델의 데이터 상태가 바뀌면 controller가 트리거 역할을 하고, 이것이 view에게 전달되어 자동으로 화면을 갱신한다고 한다. 

즉, View가 Model을 관찰(observe)하다가, Model의 데이터가 바뀌면 View가 업데이트되는 것이다.

(질문: 소프트웨어 공학에서는 View와 Model이 소통하지 않고 Controller를 통해서만 연결된다고 배웠던 것 같은데 직접적으로 연결되는건지..? 궁금하다)

 

2. SNMP?

UDP 이용하는 프로토콜로 컴퓨터 네트워크 수업에서 언급하셨던 것 같은데...

라우터나 스위치 상태를 감시하는 모니터링 시스템에서도 옵저버 구조가 쓰인다고 한다.

장비의 상태 변화를 SNMP 메시지로 알리고, 관찰자 역할인 관리 서버가 그걸 받아 관리자에게 보낸다고 한다.

 

3. 웹소켓?

HTTP는 요청-응답 구조이지만

Websocket은 서버가 클라이언트에게 즉시 알림(push)을 보낼 수 있다고 한다. 

서버-Subject, 클라이언트-Observer

- 이건 자프실 수업 가이드 시트를 보니 Socket에 대해 배우는 것 같아 가져왔다. 네트워크 프로그래밍할 때 옵저버 패턴 구조가 있는지 봐야겠다.

 

현재 배우고 있는 다른 수업들에서도 옵저버 패턴의 흔적을 찾아볼 수 있어 흥미로웠다. 다만 지피티를 통해 찾은거라 정확하지는 않은 것 같아서 시험기간 끝나면 좀 더 자세히 알아보고 싶다...!

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함