본문 바로가기
프로그래밍/App 개발

[Xamarin] Messaging Center

by 엽기토기 2020. 10. 20.
반응형

정의

💡
Public-Subscribe pattern, 구독자에게 게시자가 메시지를 전송하는 방식.

사용법

게시자

구독자에게 메시지를 보냄. 제네릭 인수를 설정하여 보낸 사람을 나타냅니다.

MessagingCenter.Send<MainPage>(this, "Hi");

⇒ 두 번째 인수에는 메시지를 지정합니다.

세 번째 인수에 페이로드 데이터를 함께 보낼 수 있습니다.

MessagingCenter.Send<MainPage, string>(this, "Hi", "John");

구독자

Subscribe 메서드를 통해 게시자의 메시지를 구독합니다.

MessagingCenter.Subscribe<MainPage> (this, "Hi", (sender) =>
{
    // "Hi" 메시지를 받았을 때 할 작업
});

페이로드 데이터를 받을 수도 있습니다.

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

⇒ arg가 게시자에서 보낸 세 번째 인수인 페이로드 데이터 입니다.

구독 취소

MessagingCenter.Unsubscribe<MainPage>(this, "Hi");
MessagingCenter.Unsubscribe<MainPage, string>(this, "Hi");

특징

  • 게시자는 수신자가 없어도 메시지를 보냅니다.
  • 구독자도 게시자를 몰라도 특정 메시지를 수신 대기합니다.
  • 게시자와 구독자가 서로 참조하지 않고 통신할 수 있으므로 둘 사이의 종속성을 줄일 수 있습니다.

❗️반면 .NET의 이벤트는, 수명이 짧은 object가 수명이 길거나 정적인 이벤트를 구독하는 경우 메모리 관리 문제가 발생할 수 있습니다. ⇒ 이벤트 처리기가 제거되지 않으면, 구독자는 해당 참조에 의해 활성 상태로 유지됨.

  • 내부적으로 MessagingCenter 클래스에서는 약한 참조(Weak reference)를 사용합니다.

주의

🔴코드의 종속성이 명확하지 않기 때문에, 추적이 힘듭니다. (Debug)

이유는 타이밍 문제가 가장 크다고 합니다.

페이지를 로드하고, OnAppearing과 MessagingCenter 중에 무엇이 먼저 호출되는 지가 모호합니다.

따라서, binding, navigation, Constructor Injection(생성자 주입) 등의 방법을 사용하는 것을 추천하며, 굳이 이런 방법을 놔두고 MessagingCenter를 쓰는 것을 추천하지 않는다고 합니다.

🟡그러나, 앱을 쉽게 모듈화할 수 있기 때문에 MessaginCenter를 통한 느슨한 결합을 옹호하는 개발자도 존재합니다. 결합도를 낮추어 유연한 구조가 가능하게 하기 때문입니다.

Reference

Xamarin.Forms MessagingCenter - Xamarin
샘플 다운로드 Download the sample 게시-구독 패턴은 게시자가 구독자로 알려진 수신자를 몰라도 메시지를 보내는 메시징 패턴입니다. The publish-subscribe pattern is a messaging pattern in which publishers send messages without having knowledge of any receivers, known as subscribers. 마찬가지로 구독자는 게시자를 전혀 알지 못해도 특정 메시지를 수신 대기합니다.
https://docs.microsoft.com/ko-kr/xamarin/xamarin-forms/app-fundamentals/messaging-center
Misuses Of MessagingCenter
MessagingCenter is a global event messaging system designed to allow two separate entities communicate without knowing anything about each other, besides a simple messaging contract. This architectural style of system works well for larger systems such as Amazon who use a similar event-sourced approach of micro services to implement a recommendation system, payment system, shipping system etc.
https://www.xamarinhelp.com/common-misuse-messagingcenter/

반응형