2021. 1. 31. 18:16ㆍ바삭바삭 IT/디자인패턴
안드로이드의 라이브데이터가 구현한 패턴, Observer에 대해 알아봅시다.
우선, 디자인패턴이란 소프트웨어에서 반복되는 문제상황에 대한 해결책입니다. 개발자가 앱이나 시스템을 디자인할때 사용하기 좋은 템플릿이라고 보면 되겠습니다.
디자인패턴 중 행동패턴에 속해있는 옵저버 패턴은 '발행-구독 패턴'이라고도 불립니다. observer는 객체의 상태변화를 관찰하는 관찰자들이고 이 관찰자들을 객체에 등록해서 상태가 변할때마다 메서드를 통해 관찰자들에게 알려주는 패턴입니다.
구현
이 패턴을 구현한다고 생각해봅시다.
1. 먼저 관찰자가 필요합니다. 관찰자를 Observer라는 이름의 객체로 만들어 줍니다.
2. 이제 이 Observer가 관찰할 대상을 Subject라고 하겠습니다. Subject에 observer를 등록합니다.
UML로 나타낸 현재까지의 상황입니다.
3. 이제 Subject에서 변화가 일어나면 관찰자 observer에게 이를 알려줘야 겠죠? 그런 역할을 해주는 메소드를 추가해줍니다. Subject의 데이터가 바뀌면 notifyObserver()를 호출해서 observer에게 데이터가 바뀌었다고 알려줍니다. notify함수에 인자를 추가해서 바뀐 값을 넘겨줄수도 있습니다.
만약 하나의 Subject를 관찰하는 관찰자가 여러개라고 하면 다음과같이 Observer를 인터페이스로 구현해놓고 사용할 수 있겠죠.
PUSH & PULL
옵저버 패턴은 PUSH방식과 PULL방식으로 구분할 수 있습니다.
PUSH방식 : Subject가 변경될 때마다 Observer에게 알려주는 방식
PULL방식 : Observer가 필요할 때마다 Subject에게 요청하는 방식
위에서 구현한 방식은 무슨방식이였을 까요? Subject에서 변경이 되면 notifty 메소드를 호출해서 알려주므로 PUSH라고 할 수 있겠습니다. 그럼 이번엔 PULL방식으로 구현해 보도록 하겠습니다.
ObserverPULL에서 갱신된 데이터가 필요할때 Subject의 getter메소드를 이용해 데이터를 가져옵니다. ObserverPULL은 필요한 데이터만 가져올 수 있지만 필요한 데이터가 많을수록 getter를 여러번 호출해야하는 비효율적인 부분도 있습니다.
결론
옵저버 패턴은 Subject쪽에서 옵저버들의 리스트만 알기 때문에 느슨한 결합으로 구현됩니다. 이런 속성 덕분에 MVC, MVVM에서 모델과 뷰 사이를 느슨하게 연결하는데 사용됩니다. 대표적으로 모델에서 일어나는 이벤트를 옵저버가 통보받고, 뷰의 내용을 바꿉니다.
제목에 있는 Observable은 지금까지 설명한 Observer인터페이스를 구현한 Class고 자바에서 지원했습니다. 하지만 Java SE9 버전부터는 Deprecated되었다고 합니다.
이유는 다양하지만 요약하면 Observable이 인터페이스가 아니라 클래스기 때문에
1. 인터페이스에 맞춰 프로그래밍한다는 객체지향 디자인 원칙을 위배하고,
2. 다중상속이 불가능해서 다른 클래스를 이미 상속받고 있으면 Observable을 상속할 수 없기에
더 이상 사용하지 않게 되었습니다.
하지만 옵저버 패턴을 응용한 여러 라이브러리들을 잘 사용하려면 패턴에 대한 이해는 필수일 것 같습니다 :)