{"id":42943,"date":"2024-11-13T22:28:21","date_gmt":"2024-11-13T22:28:21","guid":{"rendered":"https:\/\/atmokpo.com\/w\/?p=42943"},"modified":"2024-11-26T06:34:09","modified_gmt":"2024-11-26T06:34:09","slug":"mvvm-7-mvvm%ec%97%90%ec%84%9c%ec%9d%98-viewmodel-%ea%b0%84-%ed%86%b5%ec%8b%a0%ea%b3%bc-%eb%a9%94%ec%8b%9c%ec%a7%95-%ec%8b%9c%ec%8a%a4%ed%85%9c-event-aggregator%ec%99%80-messenger%eb%a5%bc-%ed%99%9c","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/42943\/","title":{"rendered":"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac"},"content":{"rendered":"<p><!-- Blog Post on MVVM Communication and Messaging Systems in WPF --><\/p>\n<article>\n<p>\ud638\ud658\uc131\uacfc \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \uac00\uc9c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uc6d0\ud55c\ub2e4\uba74, MVVM(Model-View-ViewModel) \ud328\ud134\uc740 \ucee8\ub514\uc158, \ub370\uc774\ud130 \ubc14\uc778\ub529 \ubc0f UI(\uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4) \ubd84\ub9ac\ub97c \ud1b5\ud574 \uc774\ub7ec\ud55c \ubaa9\ud45c\ub97c \ub2ec\uc131\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uc5d0\uc11c ViewModel \uac04\uc758 \ud1b5\uc2e0\uc744 \uad00\ub9ac\ud558\ub294 \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, \ud2b9\ud788 Event Aggregator\uc640 Messenger \ud328\ud134\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>1. MVVM \ud328\ud134 \uac1c\uc694<\/h2>\n<p>MVVM\uc740 \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \ub514\uc790\uc778 \ud328\ud134\uc73c\ub85c, WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ub110\ub9ac \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc758 \uac01 \uad6c\uc131 \uc694\uc18c\ub97c \uc720\uc5f0\ud558\uac8c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud574\uc8fc\uba70, \uac1c\uc778\uc801\uc778 \ucc45\uc784\uc744 \uacb0\uc815\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc90d\ub2c8\ub2e4. \uae30\ubcf8 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li><strong>Model<\/strong>: \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub370\uc774\ud130\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>View<\/strong>: \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4(UI)\ub97c \uad6c\uc131\ud558\uba70, \uc0ac\uc6a9\uc790\uac00 \ubcf4\uace0 \uc870\uc791\ud560 \uc218 \uc788\ub294 \uc694\uc18c\ub4e4\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.<\/li>\n<li><strong>ViewModel<\/strong>: \ubaa8\ub378\uacfc \ubdf0\ub97c \uc5f0\uacb0\ud558\ub294 \uc5ed\ud560\uc744 \ud558\uba70, UI\uc5d0 \ud544\uc694\ud55c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\uace0 \uc0ac\uc6a9\uc790 \uc0c1\ud638\uc791\uc6a9\uc744 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h2>2. ViewModel \uac04 \ud1b5\uc2e0\uc758 \ud544\uc694\uc131<\/h2>\n<p>MVVM \ud328\ud134\uc5d0\uc11c\ub294 \uac01 ViewModel\uc774 \ub3c5\ub9bd\uc801\uc73c\ub85c \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0, \uc11c\ub85c \ub2e4\ub978 ViewModel \uac04\uc5d0 \ub370\uc774\ud130\ub97c \uc804\uc1a1\ud574\uc57c \ud558\ub294 \uacbd\uc6b0\uac00 \uc0dd\uae38 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ud55c ViewModel\uc5d0\uc11c \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub418\uba74 \ub2e4\ub978 ViewModel\uc774 \ud574\ub2f9 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubc18\uc601\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7f0 \uacbd\uc6b0, ViewModel \uac04 \ud1b5\uc2e0\uc744 \uc704\ud574\uc11c\ub294 \ucee4\ud50c\ub9c1\uc744 \ucd5c\uc18c\ud654\ud558\uba74\uc11c\ub3c4 \ud6a8\uacfc\uc801\uc778 \ub370\uc774\ud130 \uc804\uc1a1\uc774 \uac00\ub2a5\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h2>3. Event Aggregator\uc640 Messenger \ud328\ud134<\/h2>\n<p>MVVM\uc5d0\uc11c ViewModel \uac04\uc758 \ud1b5\uc2e0\uc744 \ucc98\ub9ac\ud558\ub294 \uc8fc\uc694 \ubc29\ubc95 \uc911 \ub450 \uac00\uc9c0\ub294 Event Aggregator\uc640 Messenger\uc785\ub2c8\ub2e4. \uc774 \ub450 \ud328\ud134\uc740 \uc11c\ub85c \ub2e4\ub974\uac8c \uc791\ub3d9\ud558\uc9c0\ub9cc, \uacf5\ud1b5\uc801\uc73c\ub85c ViewModel \uac04\uc758 \ub290\uc2a8\ud55c \uacb0\ud569(loose coupling)\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/p>\n<h3>3.1 Event Aggregator<\/h3>\n<p>Event Aggregator\ub294 \uc5ec\ub7ec \ucef4\ud3ec\ub10c\ud2b8 \uac04\uc5d0 \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud558\ub294 \ucef4\ud3ec\ub10c\ud2b8\uc785\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 \uc774\ubca4\ud2b8\ub97c \uc911\uc559 \uc9d1\uc911\ud654\ud558\uc5ec \uc2dc\uc2a4\ud15c \ub0b4\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ubaa8\ub4e0 \uc774\ubca4\ud2b8\ub97c \uad00\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n<h4>\uc7a5\uc810<\/h4>\n<ul>\n<li>\ub2e4\uc911 ViewModel \uac04\uc758 \ub290\uc2a8\ud55c \uacb0\ud569\uc744 \uc9c0\uc6d0\ud568\uc73c\ub85c\uc368 \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uc744 \ub192\uc785\ub2c8\ub2e4.<\/li>\n<li>\ubaa8\ub4c8\ud654\ub41c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uad6c\uc131 \uc694\uc18c \uac04\uc758 \ud1b5\uc2e0\uc744 \uc911\uc559\uc9d1\uc911\ud654\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h4>\uc608\uc81c<\/h4>\n<pre><code class=\"language-csharp\">using System;\nusing System.Collections.Generic;\n\npublic interface IEventAggregator\n{\n    void Subscribe<t>(Action<t> action);\n    void Publish<t>(T eventMessage);\n}\n\npublic class EventAggregator : IEventAggregator\n{\n    private readonly Dictionary<type, list<delegate=\"\">&gt; _subscribers = new();\n\n    public void Subscribe<t>(Action<t> action)\n    {\n        var key = typeof(T);\n        if (!_subscribers.ContainsKey(key))\n        {\n            _subscribers[key] = new List<delegate>();\n        }\n        _subscribers[key].Add(action);\n    }\n\n    public void Publish<t>(T eventMessage)\n    {\n        var key = typeof(T);\n        if (_subscribers.ContainsKey(key))\n        {\n            foreach (var action in _subscribers[key])\n            {\n                ((Action<t>)action)(eventMessage);\n            }\n        }\n    }\n}\n\n\/\/ ViewModel \uc608\uc2dc\npublic class FirstViewModel\n{\n    private readonly IEventAggregator _eventAggregator;\n\n    public FirstViewModel(IEventAggregator eventAggregator)\n    {\n        _eventAggregator = eventAggregator;\n    }\n\n    public void ChangeData()\n    {\n        \/\/ \ub370\uc774\ud130 \ubcc0\uacbd\n        _eventAggregator.Publish(new DataChangedEvent { Data = \"New Data\" });\n    }\n}\n\npublic class SecondViewModel\n{\n    public SecondViewModel(IEventAggregator eventAggregator)\n    {\n        eventAggregator.Subscribe<datachangedevent>(OnDataChanged);\n    }\n\n    private void OnDataChanged(DataChangedEvent eventData)\n    {\n        \/\/ \ub370\uc774\ud130 \ucc98\ub9ac\n        Console.WriteLine($\"Received Data: {eventData.Data}\");\n    }\n}\n\npublic class DataChangedEvent\n{\n    public string Data { get; set; }\n}\n<\/datachangedevent><\/t><\/t><\/delegate><\/t><\/t><\/type,><\/t><\/t><\/t><\/code><\/pre>\n<h3>3.2 Messenger \ud328\ud134<\/h3>\n<p>Messenger \ud328\ud134\uc740 \uae30\ubcf8\uc801\uc73c\ub85c Event Aggregator\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc, Messenger\ub294 \ud2b9\uc815 \uba54\uc2dc\uc9c0\ub97c \ud2b9\uc815 \uc218\uc2e0\uc790\uc5d0\uac8c \ubcf4\ub0b4\ub294 \ub354 \uc138\ubd84\ud654\ub41c \ubc29\uc2dd\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uac01 ViewModel\uc740 \uc790\uc2e0\uc774 \uc6d0\ud558\ub294 \ud2b9\uc815 \uba54\uc2dc\uc9c0\ub9cc \uc218\uc2e0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>\uc7a5\uc810<\/h4>\n<ul>\n<li>\uc880 \ub354 \uc138\ubc00\ud558\uac8c \ud1b5\uc2e0\uc744 \uad00\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uba54\uc2dc\uc9c0 \ud0c0\uc785\uc744 \uc815\uc758\ud568\uc73c\ub85c\uc368 \ucf54\ub4dc \uac00\ub3c5\uc131\uc744 \ub192\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h4>\uc608\uc81c<\/h4>\n<pre><code class=\"language-csharp\">using System;\nusing System.Windows;\n\npublic class Messenger\n{\n    public void Send<t>(T message)\n    {\n        \/\/ \uba54\uc2dc\uc9c0\ub97c \uc804\uc1a1\ud558\ub294 \ub85c\uc9c1\n        \/\/ \uc608\ub97c \ub4e4\uc5b4, WeakEventPattern\uc744 \uc0ac\uc6a9\ud558\uc5ec\n    }\n\n    public void Register<t>(Action<t> action)\n    {\n        \/\/ \ud2b9\uc815 \ud0c0\uc785 \ub4f1\ub85d \ub85c\uc9c1\n    }\n}\n\n\/\/ ViewModel \uc608\uc2dc\npublic class FirstViewModel\n{\n    public void ChangeData()\n    {\n        \/\/ \ub370\uc774\ud130 \ubcc0\uacbd \ubc0f \uba54\uc2dc\uc9c0 \uc804\uc1a1\n        Messenger.Default.Send(new DataUpdatedMessage { Text = \"New Data\" });\n    }\n}\n\npublic class SecondViewModel\n{\n    public SecondViewModel()\n    {\n        Messenger.Default.Register<dataupdatedmessage>(OnDataUpdated);\n    }\n\n    private void OnDataUpdated(DataUpdatedMessage message)\n    {\n        MessageBox.Show(message.Text);\n    }\n}\n\npublic class DataUpdatedMessage\n{\n    public string Text { get; set; }\n}\n<\/dataupdatedmessage><\/t><\/t><\/t><\/code><\/pre>\n<h2>4. \uc2e4\uc81c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\uc758 \uc801\uc6a9<\/h2>\n<p>\ubcf5\uc7a1\ud55c WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 Event Aggregator\uc640 Messenger \ud328\ud134\uc744 \uc801\uc808\ud788 \uacb0\ud569\ud558\uc5ec \ub2e4\uc591\ud55c ViewModel \uac04\uc758 \ud1b5\uc2e0\uc744 \uc6d0\ud65c\ud788 \uad00\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ub370\uc774\ud130 \ud750\ub984\uc744 \uad00\ub9ac\ud558\ub294\ub370 \ud544\uc218\uc801\uc778 \uc694\uc18c\ub85c \uc791\uc6a9\ud558\uba70, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc0c1\ud0dc\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4.<\/p>\n<h2>5. \uacb0\ub860<\/h2>\n<p>MVVM \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c ViewModel \uac04\uc758 \ud1b5\uc2e0\uacfc \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac\ub294 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. Event Aggregator\uc640 Messenger \ud328\ud134\uc740 \uc774\ub7ec\ud55c \ud1b5\uc2e0\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uad00\ub9ac\ud558\ub294 \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud328\ud134\uc744 \ud1b5\ud574 \ub290\uc2a8\ud55c \uacb0\ud569\uc744 \uc720\uc9c0\ud558\uba74\uc11c\ub3c4, \ub370\uc774\ud130 \ubcc0\uacbd \uc0c1\ud669\uc744 \ub2e4\ub978 ViewModel\uc5d0 \uc27d\uac8c \uc804\ud30c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud560 \ub54c \uc774\ub7ec\ud55c \ud328\ud134\uc758 \uc911\uc694\uc131\uc744 \uc774\ud574\ud558\uace0 \ud65c\uc6a9\ud558\uba74, \ub354 \ub098\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc544\ud0a4\ud14d\ucc98\ub97c \uad6c\ucd95\ud560 \uc218 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<\/article>\n","protected":false},"excerpt":{"rendered":"<p>\ud638\ud658\uc131\uacfc \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \uac00\uc9c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uc6d0\ud55c\ub2e4\uba74, MVVM(Model-View-ViewModel) \ud328\ud134\uc740 \ucee8\ub514\uc158, \ub370\uc774\ud130 \ubc14\uc778\ub529 \ubc0f UI(\uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4) \ubd84\ub9ac\ub97c \ud1b5\ud574 \uc774\ub7ec\ud55c \ubaa9\ud45c\ub97c \ub2ec\uc131\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uc5d0\uc11c ViewModel \uac04\uc758 \ud1b5\uc2e0\uc744 \uad00\ub9ac\ud558\ub294 \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, \ud2b9\ud788 Event Aggregator\uc640 Messenger \ud328\ud134\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. 1. MVVM \ud328\ud134 \uac1c\uc694 MVVM\uc740 \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \ub514\uc790\uc778 \ud328\ud134\uc73c\ub85c, WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c &hellip; <a href=\"https:\/\/atmokpo.com\/w\/42943\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[39],"tags":[],"class_list":["post-42943","post","type-post","status-publish","format-standard","hentry","category-wpf-"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/42943\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"\ud638\ud658\uc131\uacfc \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \uac00\uc9c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uc6d0\ud55c\ub2e4\uba74, MVVM(Model-View-ViewModel) \ud328\ud134\uc740 \ucee8\ub514\uc158, \ub370\uc774\ud130 \ubc14\uc778\ub529 \ubc0f UI(\uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4) \ubd84\ub9ac\ub97c \ud1b5\ud574 \uc774\ub7ec\ud55c \ubaa9\ud45c\ub97c \ub2ec\uc131\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uc5d0\uc11c ViewModel \uac04\uc758 \ud1b5\uc2e0\uc744 \uad00\ub9ac\ud558\ub294 \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, \ud2b9\ud788 Event Aggregator\uc640 Messenger \ud328\ud134\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. 1. MVVM \ud328\ud134 \uac1c\uc694 MVVM\uc740 \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \ub514\uc790\uc778 \ud328\ud134\uc73c\ub85c, WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c &hellip; \ub354 \ubcf4\uae30 &quot;[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/42943\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-13T22:28:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-26T06:34:09+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/42943\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42943\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac\",\"datePublished\":\"2024-11-13T22:28:21+00:00\",\"dateModified\":\"2024-11-26T06:34:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42943\/\"},\"wordCount\":63,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF \uac1c\ubc1c\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/42943\/\",\"url\":\"https:\/\/atmokpo.com\/w\/42943\/\",\"name\":\"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-13T22:28:21+00:00\",\"dateModified\":\"2024-11-26T06:34:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42943\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/42943\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/42943\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/42943\/","og_locale":"ko_KR","og_type":"article","og_title":"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"\ud638\ud658\uc131\uacfc \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \uac00\uc9c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uc6d0\ud55c\ub2e4\uba74, MVVM(Model-View-ViewModel) \ud328\ud134\uc740 \ucee8\ub514\uc158, \ub370\uc774\ud130 \ubc14\uc778\ub529 \ubc0f UI(\uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4) \ubd84\ub9ac\ub97c \ud1b5\ud574 \uc774\ub7ec\ud55c \ubaa9\ud45c\ub97c \ub2ec\uc131\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uc5d0\uc11c ViewModel \uac04\uc758 \ud1b5\uc2e0\uc744 \uad00\ub9ac\ud558\ub294 \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, \ud2b9\ud788 Event Aggregator\uc640 Messenger \ud328\ud134\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. 1. MVVM \ud328\ud134 \uac1c\uc694 MVVM\uc740 \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \ub514\uc790\uc778 \ud328\ud134\uc73c\ub85c, WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c &hellip; \ub354 \ubcf4\uae30 \"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac\"","og_url":"https:\/\/atmokpo.com\/w\/42943\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-13T22:28:21+00:00","article_modified_time":"2024-11-26T06:34:09+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/42943\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/42943\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac","datePublished":"2024-11-13T22:28:21+00:00","dateModified":"2024-11-26T06:34:09+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/42943\/"},"wordCount":63,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF \uac1c\ubc1c"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/42943\/","url":"https:\/\/atmokpo.com\/w\/42943\/","name":"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-13T22:28:21+00:00","dateModified":"2024-11-26T06:34:09+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/42943\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/42943\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/42943\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"[MVVM] 7.MVVM\uc5d0\uc11c\uc758 ViewModel \uac04 \ud1b5\uc2e0\uacfc \uba54\uc2dc\uc9d5 \uc2dc\uc2a4\ud15c, Event Aggregator\uc640 Messenger\ub97c \ud65c\uc6a9\ud55c \ub370\uc774\ud130 \ud750\ub984 \uad00\ub9ac"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=42943"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42943\/revisions"}],"predecessor-version":[{"id":42944,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42943\/revisions\/42944"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=42943"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=42943"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=42943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}