-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Observer 패턴은 관찰 중인 객체에서 발생하는 이벤트를 여러 다른 객체에 알리는 메커니즘을 정의할 수 있는 디자인 패턴입니다. Observer 패턴의 강력함은 두 객체가 서로 느슨하게 연결(Loose Coupling)된다는 점에 있습니다. 느슨하게 연결된다는 것은 두 연결된 객체들 사이의 결합도가 낮다는 것을 의미하고, 서로가 서로에 대한 최소한의 정보만을 가지고 소통한다는 것을 말합니다.
Apple은 Combine 프레임워크에 Publisher를 추가하여 Swift 5.1에서 이 패턴에 대한 언어 수준 지원을 시작했습니다. 따라서, Combine을 기반으로 한 관찰과 Custom으로 구성한 Observable에 대해서 구상하는 걸로 이번 챕터를 시작하려합니다. 물론 이 외에 NotificationCenter도 비슷하게 사용할 수 있습니다.
- subscriber는 "관찰자" 객체이며 업데이트를 수신합니다.
- 객체의 변경 사항을 알려야하는 객체에 대한 update 인터페이스를 기반으로 구현합니다.
- publisher 객체에 대한 참조를 유지
- 객체의 상태와 일관성을 유지
- publisher는 "관찰 가능한" 객체이며 업데이트를 알립니다.
- subscriber들을 가지고 상태를 저장하며 개수는 제한이 없습니다.
- subscriber들을 추가, 제거하는 인터페이스를 기반으로 구현합니다.
- value는 객체 값의 변경을 의미합니다.
참고: 이번 챕터에서는 @published 속성에 대한 개요를 제공하지만 Combine 프레임워크에서 제공되는 모든 세부 정보나 강력한 기능에 대해서는 자세히 설명하지 않습니다. Combine에 대해 자세히 알아보려면 Combine: Swift를 사용한 비동기 프로그래밍을 방문하여 학습을 추천합니다.
사용
Observer 패턴은 종종 MVC와 함께 사용되며, 뷰 컨트롤러에는 subscriber가 있고 모델에는 publisher가 있습니다. 이렇게 하면 모델이 뷰 컨트롤러의 유형에 대해 알 필요 없이 변경 사항을 뷰 컨트롤러로 다시 전달할 수 있습니다. 따라서 서로 다른 보기 컨트롤러가 동일한 모델 유형에 대한 변경 사항을 사용하고 관찰할 수 있습니다. 즉, 런타임에서 객체간 관계를 설정할 수 있습니다.
Observer 패턴은 객체지향 설계 원칙 중 개방 폐쇄 원칙을 지킬 수 있도록 도와줍니다. 만약 새로운 value가 추가되어도, 이를 구독하는 subscriber에는 전혀 변경사항이 없습니다. publisher의 코드를 수정하지 않고 새로운 subscriber 클래스를 추가할 수 있습니다. 물론 그 반대도 가능합니다. 객체들 사이의 의존성이 낮아지고 느슨하게 연결되어 있기 때문이죠.
Observer 패턴은 객체지향 설계 원칙 중 단일 책임 원칙도 지킬 수 있도록 도와줍니다. 어떤 객체를 구독하는 것은 모두 publisher, 즉 subscriber들을 추가, 제거하는 인터페이스의 프로토콜을 채택하는 객체에게 맡겨져 있고, 이 subscriber들을 관리하는 책임은 모두 해당 인터페이스 프로토콜 객체에게 맡겨져 있습니다. 또한, publisher에는 다른 영향을 주지 않고도 객체에 대한 update 인터페이스를 확장하여 subscriber 객체에 새로운 기능을 추가할 수 있습니다.
주의 사항
- subscriber에게 알림이 가는 순서는 보장하지 않습니다.
- subscriber, publisher의 관계가 잘 정의되지 않으면 원하지 않는 동작이 발생할 수도 있습니다.
Observer 패턴을 Combine으로 구현하기 전에 변경할 내용과 조건을 정의해야 합니다. 객체 또는 속성이 변경되는 이유를 알 수 없는 경우 var 또는 @published로 선언하지 않고 대신 let 속성으로 지정하는 것이 좋습니다. 예를 들어 고유 identifier는 정의상 변경해서는 안 되므로 published property로 적합하지 않습니다.
정리
- Observer 패턴을 통해 한 개체가 다른 개체의 변화를 관찰할 수 있습니다. subscriber, publisher 및 value의 세 가지 유형을 포함합니다.
- subscriber는 관찰자이고, publisher는 관찰 가능한 개체이며, value는 객체 값의 변경을 의미합니다.
- Swift 5.1을 사용하면 Combine의 @published 속성을 사용하여 Observer 패턴을 쉽게 구현할 수 있습니다.
- Notification, Custom구성한 Observable, Rx 등을 활용하여 다양하게 구현도 가능합니다.