옵저버 패턴을 알아보기 전에 디자인 패턴에대해서 먼저 알고 넘어가야한다.
소프트웨어를 설계할 때, 자주 등장하는 문제들에 대해서 자주 쓰이는 설계 방식을 패턴화해서 정리한 것이다. 디자인 패턴을 참고해서 개발을 하면, 개발의 효율성과 유지보수성, 운용성이 높아지며, 프로그램을 최적화하는 것에도 큰 도움이 된다.
디자인 패턴은 목적에따라서 생성, 구조, 행위로 유형을 나눈다.
이번 게시글에서 다룰 Observer 패턴은 행위에 포함이된다.
행위 유형에 속하는 패턴들은 클래스나 객체들이 상호작용하는 방법과 역할을 분담하는 것을 다루는 패턴이다.
Observer 패턴은 한마디로 상태가 변할 때 의존자들에게 알리고, 자동 업데이트하는 패턴이다.
Observer 패턴은 변화를 감지하고 그를 알려주는 역할을 한다. observe라는 단어 뜻에서 알 수 있듯, 가장 기본적인 역할은 객체의 변화를 관찰하는 것이다.
그러다가 한 객체의 상태가 바뀌면, 그 객체에 의존하는 다른 객체들에게 알려주고 자동으로 내용이 갱신되도록 하는 방법이다. 이러한 특징때문에, 일대다의 의존성을 가진다.
상호작용이 존재하는 객체 사이에서는 가능하면 결합도를 느슨하게하는 디자인 패턴으로 MVC패러다임과 자주 사용된다. MVC에서는 모델과 뷰 사이의 결합도를 느슨하게 만들어주는 역할을 한다.
UML 다이어그램은 다음과 같다.
Observer 객체를 변화를 관찰할 객체에 등록을 한다. 이때 Observer 객체는 변화를 연관된 객체들에게 알려주는 notify 역할을 하는 함수를 가진다. 하위 옵저버는 notify 함수를 구현해서 특정 이벤트가 발생시 각각 다른 동작을 하게할 수 있다. 이 때, 순환 구조가 만들어지는 사고를 잘 방지해야한다.
예를들면, 특정 객체가 변화되는 이벤트 A가 발생하면 옵저버 O1가 O2를 갱신하고 O2가 O1을 갱신하는 구조가 만들어지면, A->O1->O2->A->01->... 과 같이 1번만 처리하면 될 A가 무한히 처리되는 상황이 벌어진다.
이런 경우를 방지하기 위해서 어떤 이벤트를 한 번 처리하면 이를 notify하는 옵저버가 그 이벤트를 다시 발생시키지 못하게하도록 임시로 작동을 멈추거나 다시 시작하는 메서드를 이용해서 흐름을 제어하는 방법을 사용할 수 있다.