2012. 5. 3. 00:29

우선 옵저버 패턴(Observer pattern)이란 무엇인가? 에 대해서 생각해보면, 흔히들 말하는 모니터링개념이라고 생각하면 좋다. 


스타크래프트에서도 옵저버는 감시하는 용으로 쓰이게 되는데, 이 패턴은 그러한 개념에서 이름이 붙여지지 않았을까 싶다. 


[그림출처]http://blog.naver.com/hoi5man?Redirect=Log&logNo=60147956284



예를들어 설명해보면 보안쪽 방화벽 장비가 시스템에 해킹시도가 있는지 없는지 감시하고 있다고 하자, 그리고 그 변화를 다른 객체에서 감지하고 싶다.  이럴경우 물론 Thread 나 Fork(유닉스환경)을 사용해서 그 데이터를 실시간으로 검사 주는 것도 방법일 것이다.


하지만 이 모니터링된 자료를 또다른 객체에서 쓰고싶다면? 그리고 또다른 객체에서 쓰고싶다면? 한 프로그램에서 관리받지 못하는 Thread 숫자는 각 프로그램마다 따로따로 돌아가고 이는 자원(resource)의 낭비가 될 수 있다. 


혹은 수많은 메소드들을 따로따로 호출해 줌으로써 코드가 번잡해지거나. 어떤 옵저버를 쉽게 추가하거나 삭제할 수 없을 것이다. 


옵저버 패턴을 이러한 문제를 해결하기 위하여 옵저버를 한데 모아 관리하고 그 옵저버들에게 변화가 일어남과 동시에 메시지를 전달하는 효과를 효율적으로 도와준다. 


옵저버 패턴을 구현하는 방법에는 여러가지가 있지만 대부분 주제(Subject) 인터페이스와 업저버(Observer)인터페이스가 들어있는 클래스 디자인을 바탕으로 한다.


흠... 위에 그림은 해드퍼스트 자료를 기반으로 좀더 보기 편하게 그려 본 것이다. 

(그리는데 고생했는데 너무 작지 않은가 걱정이다.ㅠㅠ..)


옵서버 패턴에 대해서 간단한 개요를 보면, 값이 자주 변화하는 클래스에서 변화가 이러날 때 변화를 출력하거나 그 변화를 이용해야 할 메소드를 호출 시키는 것이다. 


혹시 안드로이드 개발을 해보신 분이라면 안드로이드에 broadCast 의 특정 action 을 주어 특정 앱들만 받게 되는 형태와 매우 흡사하다. 


처음 옵저버들.(데이터변화를 감지해야할 대상)들은 registerObserver를 통하여 자신을 옵저버에 등록한다. 이때 자기 자신을 업데이트 시킬수 있는 Update() 메소드를 반드시 가지고 있어야 한다.


우선 MainClass 의 맨아래쪽에 있는 setMeasurrenments 클래스를 통해 데이터가 들어온다.

 (이 변화된 데이터는 특정 입력, 혹은 쓰레드를 통한 감시된 값들이 될 것이다.) 


그러면 자신의 변수들을 변형시키고 measurementsChanged() 함수를 실행시켜 NotifyObservers()를 호출하여 모든 옵저버들의 update 메소드를 실행시키는 간단한 구조이다. 





자바에는 이미 Observable 이라는 클래스가 존재하여 좀더 편하게 옵저버를 구성할 수 있도록 해놓았다. 

(Import java.util.Observable 과 import java.util.Observer 를 불러와주면된다 이후 이를 상속받아 사용한다. )

이 클래스를 상속받아 사용하면  옵저버들을 관리할 List 자료구조가 필요 없게 된다. (유용하다!) 

또한 for 문을  통하여 옵저버들에게 일일이 뿌려주는 구조를 취하지 않는다.



옵저버 입장에서는 Observer 인터페이스를 implement 시켜 Observable 이라는 클래스에 addObserver를 통해 넣어주면된다.


하지만 이렇게 자바를 기반으로 하는 Observable 패턴을 사용하면 안좋은점 2가지가 있다.

우선 인터페이스로 구성된것이 아니라 클래스로 구현된 것이기 때문에 자신의 프로그램에 맞게 재구성 할수 없다는 점이다. 

그리고 두번째는 클래스화이기 때문에 이미 다른것을 상속받은 상태에서는 또다시 상속받을수 없어 코드의 재사용성에 문제가 될 수 있다. 



==========================================================================================================

사실 필자는 처음 Observer Pattern 으로 인해서 Thread를 사용하지 않고 어떠한 패턴을 감시할 수 있을 줄 알았다. 

마치 WPF의 바인딩처럼 어떠한 변화가 update() 같은 메소드를 가지지 않고도 변화를 인식할 수 있는 패턴이라고 생각했다.  하지만 현실은 감시하는 부분은 어쩔 수 없는 부분인 것 같다. 


다만 변화를 감시하는 곳에서 MainClass 의 메소드중 하나를 실행시킬수 있다면, 그걸 필요로 하는 옵저버들에게 전파시켜주는 역할만을 담당 하는 것이다. 


옵저버 패턴이란 이런 것이다. 


=========================================================================================================



 




Posted by k1rha