옵저버 패턴에 관해 서술하기에 앞서 MVC 패턴에 대해 알아보도록 하겠다. MVC 패턴이란 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴으로 데이터 처리와 관리를 담당하는 Model, UI 처리를 담당하는 View, 명령과 상태의 변경을 Model과 View로 라우팅하는 Controller로 구분할 수 있다. Javascript에서는 객체 지향 프로그래밍이 가능하므로 MVC 패턴을 적용할 수 있지만, 프론트 엔드에서의 적용은 별로 효율적이지 못하다. 그 이유로는,
따라서
옵저버 패턴이란 객체 지향 디자인 패턴 중의 하나로, 객체 간의 일대다 의존 관계를 정의하는 패턴이다. 한 객체의 상태 변화를 정해지지 않은 여러 다른 객체에 통지하고 싶을 때 사용되는 패턴이다. 옵저버 패턴의 목적은 모듈간의 의존성을 낮게 하여 결합도를 낮추는 데 있다.
옵저버 패턴은 주제(Subject) 객체와 옵저버(Observer) 객체를 갖는다.
위의 그림은 StatusChecker로부터 상태를 받아 상태에 변화가 있을 경우 메시지와 이메일을 보내는 것을 옵저버 패턴으로 구현하여 그림으로 나타낸 것이다. 주제 객체인 StatusSubject는 add, remove 메서드를 통해 각각 옵저버를 등록하고 삭제할 수 있다. 상태에 변화가 있을 경우 notifyStatus 메서드가 등록된 옵저버 객체의 onAbnormalStatus 메서드를 호출한다. 여기서 주제 콘크리트 클래스와 옵저버 콘크리트 클래스라는 것을 사용한다. 주제 콘크리트 클래스란 Subject 인터페이스를 구현하는 구체적인 클래스를 말한다. 추상 클래스인 Subject로부터 옵저버를 어떻게 등록하고 삭제할지, 옵저버에게 어떠한 상태 변화 알림을 보내는 방법을 포함한다. 옵저버 콘크리트 클래스는 주제 객체의 상태 변화에 따라 처리할 동작을 구현하며, 말 그대로 주제 객체의 상태 변화에 따른 알림을 받아 처리를 수행하는 메서드를 갖는다.
발행-구독 패턴은 옵저버 패턴과 유사하다고 할 수 있다. 발행-구독 패턴은 주제(subject)와 옵저버(observer) 대신 발행자(publisher)와 구독자(subscriber)가 존재하는 방식이다. 발행-구독 패턴은
옵저버 패턴과 명칭의 차이만 있는 것처럼 보이지만, 발행-구독 패턴은 브로커를 갖는다. 브로커는 발행자-구독자 사이의 중개 역할을 수행하는 객체로서, 발행자가 메시지를 발행하면 등록된 구독자에게 해당 메시지를 전달하는 역할을 한다. 이로 인해 발행-구독 패턴은 옵저버 패턴과 다음과 같은 차이점을 갖는다.
메시지 큐는 프로세스나 프로그램 인스턴스가 데이터 상호 교환 시 사용하는 통신 방법으로 메시지를 보내는 프로세스와 받는 프로세스 간에 비동기적인 통신을 도와주는 중간 매개체이다. 대용량 데이터를 처리하기 위한 배치 작업이나, 채팅 서비스, 비동기 데이터를 처리할 때 사용한다. 발행-구독 패턴에서 메시지 큐가 브로커의 역할을 수행할 수 있다.
메시지 큐의 장점으로는 아래와 같이 말할 수 있다.
메시지 큐를 사용하면, 옵저버 패턴보다 발행자-구독자 간의 결합도를 낮출 수 있고, 비동기적인 작업이 가능하다는 장점을 갖는다. 때문에 메시지 큐를 브로커로 주로 사용한다.
프롱트) 프론트엔드에서 MVC보다 더 많이 쓰이는 패턴은 ?
imnotmoon.log) MVC Pattern (vanilla JavaScript)
한빛미디어) MVC 모델과 Observer 패턴
개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴
jistol.github.io) Observer 패턴과 Publisher/Subscriber(Pub-Sub) 패턴의 차이점
Go devlog) 발행-구독 패턴(Publisher-Subscriber Pattern)이란?