티스토리 뷰

옵저버 패턴 (Observer Pattern)

🔥 다수의 구독자 객체 ( Subscribe Object )가 발행자 객체 ( Publish Object ) 상태 변화를 감지하고 알림을 받는 패턴 🔥

 

의존관계도

 

🎯 내용
여러 개의 ObserverSubject에 구독(subscribe)하고 Subject 는 스스로의 변화가 감지될 때 자신에게 구독하고 있는 Observer 들에게 이 변화 사실을 알린(notify)다.
이러한 방식을 통해 각 Observer 들이 Subject 에게 변화가 있는지 확인할 필요가 없어지기 때문에 Observer 의 수가 다 수일 때도 효율적으로 변화 사실을 알릴 수 있다.

 

🎭 예시
여러 명의 유튜브 유저유튜브 채널에 구독하고 유튜브 채널은 영상이 올라 올 때 자신에게 구독하고 있는 구독자들 에게 새 영상이 올라왔다고 알람을 보낸다.

 

 

 

👉  옵저버 패턴의 장•단점 👈

장점

  1. 상태를 변경하는 객체 (Publisher)와 변경 감지 객체(Subscriber)의 의존성을 느슨한 결합으로 가져갈 수 있다.
  2. 상태 변경을 위해 Subscriber가 주기적으로 확인해줄 필요가 없다.
  3. 동적으로 옵저버 추가/삭제가 가능하다.

단점

  1. 코드 복잡도가 증가한다.
  2. 등록된 옵저버 객체를 관리하지 않으면 Memory Leak이 발생할 수 있다.
  3. 완료( Complete )의 개념이 없어 구독자들 에게 이벤트 종료를 알릴 방법이 없다.
  4. Error 발생 시 대처 방법이 존재하지 않는다.

 

 

구현

👉 YoutubeChannel ( Subject )
유튜브 채널은 구독, 구독취소, 푸시알림 기능을 제공하고 있다.
구독을 할 수 있는 타입은 SubscribedUser 다.
1️⃣ 구독하기 (subscribe) 메서드를 통해 SubscribedUser 타입의 객체를 등록할 수 있다.
2️⃣ 구독취소 (unsubscribe) 메서드를 통해 등록된 객체 삭제가 가능하다.
3️⃣ 푸시전송(notifyPush) 메서드를 통해 등록된 유저들 에게 푸시전송이 가능하다.

 

👉 User는 SubscribedUser를 구현(implements) 하고 있어 YoutubeChannel에 구독할 수 있다.
1️⃣ notifyUsers는 YoutubeChannel 에 notifyPush 에서 알림을 보내기 위해 호출할 메서드

 

👇 예제 코드 확인하고 싶다면? 👇

👉 예제 코드 👈

 

느낀점

아직 학습을 하지는 못했지만 Spring Webflux, Reactive Stream, Event Driven 등의 키워드의 기초가 될 수 있는 옵저버 패턴인 만큼 앞으로 중요하게 다가올 것으로 판단된다.

사실 서버 개발 기초과정에 잘 등장 하지 않았던 내용이다 보니 익숙하지 않고 쉽게 다가오지 않는다. (앱 개발 에서는 많이 쓰이는듯 한데… RX 부터 해서…) 하지만 다음 스텝으로 넘어가기 위해서는 반드시 필요한 스킬로 보인다.

 

참조

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

댓글