Skip to content

Observer #5

@simoniful

Description

@simoniful

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 등을 활용하여 다양하게 구현도 가능합니다.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions