2009. 4. 27.

옵저버 패턴

주로 표현의 대상인 데이터와 이 데이터를 표현하는 뷰의 관계를 정의하기 위해 사용한다.
데이터는 감시의 대상이며, 뷰는 감시자인 것이다. 데이터에 변화가 일어났을 경우 즉각적으로 뷰에 반영이 되어야 하는 경우에 사용하는데, 일반적으로 데이터를 관리하는 클래스를 서브젝트, (여기에서는) 뷰를 옵저버라고 한다.
서브젝트는 옵저버에 의존한다. 이유인 즉 서브젝트에 변화가 생기면 옵저버에 통지해 뷰를 갱신하기 위함이다. 한가지 문제의 소지가 있는데 초기에 트리거로서 옵저버가 서브젝트의 값을 변화시킬 경우, 바뀐 서브젝트는 다시 옵저버를 호출해서 갱신을 요구한다. 옵저버는 다시 서브젝트를 부르고... 이렇게 순환 반복이 되는 코드를 작성하지 않도록 주의한다.
옵저버 패턴의 사용은 일반적으로 하나의 서브젝트에 다수의 관찰자를 필요로 하는 경우이다. 예를 들어 온도계를 작성할 경우 온도데이터(서브젝트)를 아날로그 온도계(옵저버1)와 디지탈 온도계(옵저버2)와 같이 복수개의 옵저버를 도입하여 표현하고자 할 경우이다.
사실 옵저버패턴의 용어 자체는 약간 부적격한 감이 없지 않다. 이 글에 등장한 옵저버는 사실 관찰자라기 보다는 (서브젝트에 의해)통지되는자에 가깝기 때문이다. 그래서 옵저버패턴을 Publish-Subscribe패턴 혹은 Broadcast 패턴이라고 한다.
참고로 MVC패턴에서 M은 서브젝트에 해당하며 V는 옵저버에 해당한다. 자신이 작성하는 코드가 M이 V를 가지고 있으며 M의 변화를 V에 즉각적으로 변화시켜야 한다고 생각된다면 옵저버패턴을 고려해 보라.
스트럿츠의 경우는 유저이벤트에 의해 스트럿츠 컨트롤(C)이 액션을 호출하고(M) 이 액션은 비즈니스 로직을 실행하여 필요료 하는 데이터를 취득한 후 적절한 페이지를 선택하여(V) 취득한 데이터를 표현하게 되는 것이다.

댓글 없음: