{"id":42929,"date":"2024-11-13T22:28:16","date_gmt":"2024-11-13T22:28:16","guid":{"rendered":"https:\/\/atmokpo.com\/w\/?p=42929"},"modified":"2024-11-26T06:34:23","modified_gmt":"2024-11-26T06:34:23","slug":"mvvm-2-%ec%bb%a4%eb%a7%a8%eb%93%9c%ec%99%80-%eb%b0%94%ec%9d%b8%eb%94%a9-%ea%b3%a0%ea%b8%89-%ed%99%9c%ec%9a%a9-%ec%bb%a4%eb%a7%a8%eb%93%9c-%ed%8c%a8%ed%84%b4%ec%9d%98-%ec%8b%ac%ed%99%94-delegatecom","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/42929\/","title":{"rendered":"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654  DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9"},"content":{"rendered":"<h2>\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9: \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 &#8211; DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9<\/h2>\n<p>WPF(Windows Presentation Foundation)\uc5d0\uc11c MVVM(Model-View-ViewModel) \ud328\ud134\uc744 \uc0ac\uc6a9\ud560 \ub54c, \ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529\uc740 \ud575\uc2ec\uc801\uc778 \uc694\uc18c\uc785\ub2c8\ub2e4. MVVM \ud328\ud134\uc758 \uc8fc\uc694 \uc774\uc810 \uc911 \ud558\ub098\ub294 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\uc5ec \uc720\uc9c0 \ubcf4\uc218\uc131\uacfc \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uc744 \uadf9\ub300\ud654\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \ucee4\ub9e8\ub4dc\uc758 \uace0\uae09 \ud65c\uc6a9 \ubc29\ubc95\uacfc Command \ud328\ud134\uc758 \uc2ec\ud654 \uc774\ud574\ub97c \uc704\ud574 <strong>DelegateCommand<\/strong>\uc640 <strong>RelayCommand<\/strong>\uc758 \uac1c\ub150\uc744 \uae4a\uc774 \uc788\uac8c \ud0d0\uad6c\ud558\uace0, \uc2e4\uc81c \uc608\uc81c\ub97c \ud1b5\ud574 \uc5b4\ub5bb\uac8c \ud6a8\uacfc\uc801\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294\uc9c0 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>1. \ucee4\ub9e8\ub4dc\uc758 \uc774\ud574<\/h3>\n<p>\ucee4\ub9e8\ub4dc\ub294 \ud2b9\uc815 \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\ub294 \uc694\uccad\uc744 \ucea1\uc290\ud654\ud55c \uac1d\uccb4\uc785\ub2c8\ub2e4. WPF\uc5d0\uc11c \ucee4\ub9e8\ub4dc\ub294 <code>ICommand<\/code> \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\uc5ec \uc0ac\uc6a9\ub429\ub2c8\ub2e4. MVVM\uc5d0\uc11c ViewModel\uc774 \ucee4\ub9e8\ub4dc\ub97c \uc81c\uacf5\ud558\uace0, View\ub294 \uc774\ub7ec\ud55c \ucee4\ub9e8\ub4dc\ub97c \ubc14\uc778\ub529\ud558\uc5ec \uc0ac\uc6a9\uc790\uc758 \uc785\ub825\uc5d0 \ubc18\uc751\ud558\uac8c \ub429\ub2c8\ub2e4. \uc774\ub85c \uc778\ud574 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \uc758\uc874\uc131\uc774 \ub0ae\uc544\uc838, \uac01 \uad6c\uc131 \uc694\uc18c\uc758 \ud14c\uc2a4\ud2b8\uac00 \uc6a9\uc774\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n<h4>1.1 ICommand \uc778\ud130\ud398\uc774\uc2a4<\/h4>\n<p>WPF\uc5d0\uc11c\ub294 <code>ICommand<\/code> \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc81c\uacf5\ud558\uc5ec \ucee4\ub9e8\ub4dc\uc758 \uae30\ubcf8 \uad6c\uc870\ub97c \uc815\uc758\ud569\ub2c8\ub2e4. ICommand \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub450 \uac1c\uc758 \uba54\uc11c\ub4dc\uc640 \ud558\ub098\uc758 \uc774\ubca4\ud2b8\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><code>Execute(object parameter)<\/code>: \ucee4\ub9e8\ub4dc\uac00 \uc2e4\ud589\ub420 \ub54c \ud638\ucd9c\ub418\ub294 \uba54\uc11c\ub4dc\uc785\ub2c8\ub2e4.<\/li>\n<li><code>CanExecute(object parameter)<\/code>: \ucee4\ub9e8\ub4dc\uac00 \uc2e4\ud589 \uac00\ub2a5\ud55c\uc9c0\ub97c \ud310\ub2e8\ud558\ub294 \uba54\uc11c\ub4dc\uc785\ub2c8\ub2e4. \uc774 \uba54\uc11c\ub4dc\uac00 <code>true<\/code>\ub97c \ubc18\ud658\ud574\uc57c\ub9cc \ucee4\ub9e8\ub4dc\uac00 \uc2e4\ud589\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><code>CanExecuteChanged<\/code>: \ucee4\ub9e8\ub4dc\uc758 \uc2e4\ud589 \uac00\ub2a5 \uc0c1\ud0dc\uac00 \ubcc0\uacbd\ub420 \ub54c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h4>1.2 \ucee4\ub9e8\ub4dc \ud328\ud134<\/h4>\n<p>\ucee4\ub9e8\ub4dc \ud328\ud134\uc740 \uc0ac\uc6a9\uc790 \uc694\uccad\uc744 \uac1d\uccb4\ub85c \ucea1\uc290\ud654\ud558\uc5ec \ub9e4\uac1c\ubcc0\uc218\ud654\ub41c \uba54\uc11c\ub4dc \ud638\ucd9c, \ud050\uc5d0 \uc694\uccad \uc800\uc7a5, \ub610\ub294 \ub85c\uae45\uc744 \ud1b5\ud574 \uc694\uccad \uc2e4\ud589 \ub4f1\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. MVVM \ub514\uc790\uc778 \ud328\ud134\uc5d0\uc11c\ub294 \ucee4\ub9e8\ub4dc\ub97c \ud1b5\ud574 UI\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub97c ViewModel\uc5d0 \uc804\ub2ec\ud558\ub294 \uc5ed\ud560\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n<h3>2. DelegateCommand\uc640 RelayCommand<\/h3>\n<p>\ucee4\ub9e8\ub4dc \ud328\ud134\uc744 \uad6c\ud604\ud558\ub294 \ub2e4\uc591\ud55c \ubc29\ubc95 \uc911 <strong>DelegateCommand<\/strong>\uc640 <strong>RelayCommand<\/strong>\uac00 \ub110\ub9ac \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \uc774 \ub450 \ud074\ub798\uc2a4\ub294 \ucee4\ub9e8\ub4dc\ub97c \uac04\ud3b8\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774 \uc139\uc158\uc5d0\uc11c\ub294 \ub450 \ud074\ub798\uc2a4\uc758 \uad6c\ud604 \ubc29\uc2dd\uacfc \uc0ac\uc6a9\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>2.1 RelayCommand<\/h4>\n<p><code>RelayCommand<\/code>\ub294 \ucee4\ub9e8\ub4dc\ub97c \uac04\ub2e8\ud558\uac8c \uc124\uc815\ud558\uace0 \ubc14\uc778\ub529\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\ub294 \uad6c\ud604\uccb4\uc785\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ud3ec\ud568\ud558\ub294 \uba54\uc11c\ub4dc\ub97c \uc778\uc790\ub85c \ubc1b\uc544, \ud574\ub2f9 \uba54\uc11c\ub4dc\ub97c \uc2e4\ud589\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. RelayCommand\ub294 <code>Execute<\/code>\uc640 <code>CanExecute<\/code>\ub97c \ud1b5\ud574 \ucee4\ub9e8\ub4dc \uc2e4\ud589 \uc870\uac74\uc744 \uc81c\uc5b4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h5>RelayCommand\uc758 \uad6c\ud604<\/h5>\n<pre><code>public class RelayCommand : ICommand\n{\n    private readonly Action&lt;object&gt; _execute;\n    private readonly Predicate&lt;object&gt; _canExecute;\n\n    public event EventHandler CanExecuteChanged;\n\n    public RelayCommand(Action&lt;object&gt; execute, Predicate&lt;object&gt; canExecute = null)\n    {\n        _execute = execute ?? throw new ArgumentNullException(nameof(execute));\n        _canExecute = canExecute;\n    }\n\n    public bool CanExecute(object parameter)\n    {\n        return _canExecute == null || _canExecute(parameter);\n    }\n\n    public void Execute(object parameter)\n    {\n        _execute(parameter);\n    }\n\n    public void RaiseCanExecuteChanged()\n    {\n        CanExecuteChanged?.Invoke(this, EventArgs.Empty);\n    }\n}<\/code><\/pre>\n<h5>RelayCommand \uc0ac\uc6a9 \uc608\uc81c<\/h5>\n<p>RelayCommand\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubc84\ud2bc \ud074\ub9ad \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud558\ub294 \uc608\uc81c\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \uc608\uc81c\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uac00 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uba74 \uba54\uc2dc\uc9c0\ub97c \ud45c\uc2dc\ud558\ub294 \uac04\ub2e8\ud55c \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>public class MainViewModel\n{\n    public RelayCommand ShowMessageCommand { get; }\n\n    public MainViewModel()\n    {\n        ShowMessageCommand = new RelayCommand(ShowMessage);\n    }\n\n    private void ShowMessage(object parameter)\n    {\n        MessageBox.Show(\"\uc548\ub155\ud558\uc138\uc694, WPF MVVM!\");\n    }\n}<\/code><\/pre>\n<p>\uc774\uc81c View\uc5d0\uc11c\ub294 RelayCommand\ub97c \ubc84\ud2bc\uc5d0 \ubc14\uc778\ub529\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. XAML \ucf54\ub4dc \uc608\uc2dc\ub294 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>&lt;Button Content=\"\uba54\uc2dc\uc9c0 \ubcf4\uae30\" Command=\"{Binding ShowMessageCommand}\" \/&gt;<\/code><\/pre>\n<h4>2.2 DelegateCommand<\/h4>\n<p><code>DelegateCommand<\/code>\ub294 \ube44\uc2b7\ud55c \ubaa9\uc801\uc744 \uac00\uc9c0\uc9c0\ub9cc, \uae30\ubcf8\uc801\uc73c\ub85c <code>RelayCommand<\/code>\uc640\ub294 \ub2ec\ub9ac \uad6c\uccb4\uc801\uc778 ICommand \uad6c\ud604\uc744 \uae30\ubc18\uc73c\ub85c \ud569\ub2c8\ub2e4. \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c(\uc608: Prism)\uc5d0\uc11c \uc0ac\uc6a9\ub429\ub2c8\ub2e4. DelegateCommand\ub294 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc27d\uac8c \uc804\ub2ec\ud558\uace0 \uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uc7a5\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h5>DelegateCommand\uc758 \uad6c\ud604<\/h5>\n<pre><code>public class DelegateCommand : ICommand\n{\n    private readonly Action&lt;object&gt; _execute;\n    private readonly Func&lt;object, bool&gt; _canExecute;\n\n    public event EventHandler CanExecuteChanged;\n\n    public DelegateCommand(Action&lt;object&gt; execute, Func&lt;object, bool&gt; canExecute = null)\n    {\n        _execute = execute ?? throw new ArgumentNullException(nameof(execute));\n        _canExecute = canExecute;\n    }\n\n    public bool CanExecute(object parameter)\n    {\n        return _canExecute == null || _canExecute(parameter);\n    }\n\n    public void Execute(object parameter)\n    {\n        _execute(parameter);\n    }\n\n    public void RaiseCanExecuteChanged()\n    {\n        CanExecuteChanged?.Invoke(this, EventArgs.Empty);\n    }\n}<\/code><\/pre>\n<h5>DelegateCommand \uc0ac\uc6a9 \uc608\uc81c<\/h5>\n<p>DelegateCommand\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc785\ub825\uc5d0 \ub530\ub77c \ub2e4\ub974\uac8c \ub3d9\uc791\ud558\ub294 \ubc84\ud2bc\uc744 \uad6c\ud604\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc544\ub798 \uc608\uc5d0\uc11c\ub294 \ubc84\ud2bc \ud074\ub9ad \uc2dc \uc2e4\ud589 \uc911\uc778 \ud2b9\uc815 \uc791\uc5c5\uc744 \uad6c\ubd84\ud558\ub294 \uae30\ub2a5\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>public class CommandsViewModel\n{\n    public DelegateCommand StartCommand { get; }\n    public DelegateCommand StopCommand { get; }\n\n    private bool _isRunning;\n\n    public CommandsViewModel()\n    {\n        StartCommand = new DelegateCommand(Start, CanStart);\n        StopCommand = new DelegateCommand(Stop, CanStop);\n    }\n\n    private void Start(object parameter)\n    {\n        _isRunning = true;\n        StartCommand.RaiseCanExecuteChanged();\n        StopCommand.RaiseCanExecuteChanged();\n    }\n\n    private void Stop(object parameter)\n    {\n        _isRunning = false;\n        StartCommand.RaiseCanExecuteChanged();\n        StopCommand.RaiseCanExecuteChanged();\n    }\n\n    private bool CanStart(object parameter)\n    {\n        return !_isRunning;\n    }\n\n    private bool CanStop(object parameter)\n    {\n        return _isRunning;\n    }\n}<\/code><\/pre>\n<p>\uc774 ViewModel\uc740 StartCommand\uc640 StopCommand\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uc73c\uba70, \uac01\uac01\uc758 \ubc84\ud2bc\uc5d0 \uc5f0\uacb0\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>&lt;Button Content=\"\uc2dc\uc791\" Command=\"{Binding StartCommand}\" \/&gt;\n&lt;Button Content=\"\uc911\uc9c0\" Command=\"{Binding StopCommand}\" \/&gt;<\/code><\/pre>\n<h3>3. \ucee4\ub9e8\ub4dc\uc640 \ub370\uc774\ud130 \ubc14\uc778\ub529<\/h3>\n<p>MVVM \ud328\ud134\uc758 \uc774\uc810\uc740 \ub370\uc774\ud130 \ubc14\uc778\ub529\uc744 \ud1b5\ud574 ViewModel\uacfc View \uac04\uc758 \uad00\uacc4\ub97c \uc27d\uac8c \uc124\uc815\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ucee4\ub9e8\ub4dc\ub97c \ub370\uc774\ud130 \ubc14\uc778\ub529\ud560 \ub54c, XAML\uc5d0\uc11c Command \uc18d\uc131\uc744 \uc0ac\uc6a9\ud558\uc5ec ViewModel\uc758 \ucee4\ub9e8\ub4dc\ub97c \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uc774\ub7ec\ud55c \ub370\uc774\ud130 \ubc14\uc778\ub529\uc758 \uc608\uc2dc\uc785\ub2c8\ub2e4.<\/p>\n<h4>3.1 XAML \uc608\uc81c<\/h4>\n<pre><code>&lt;Window x:Class=\"WpfApp.MainWindow\"\n        xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\n        xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\"&gt;\n    &lt;Grid&gt;\n        &lt;Button Content=\"\uba54\uc2dc\uc9c0 \ubcf4\uae30\"\n                Command=\"{Binding ShowMessageCommand}\" \n                Width=\"150\" Height=\"30\" \n                VerticalAlignment=\"Top\" HorizontalAlignment=\"Left\" \/&gt;\n    &lt;\/Grid&gt;\n&lt;\/Window&gt;<\/code><\/pre>\n<p>\uc774 \uc608\uc81c\uc5d0\uc11c \ubc84\ud2bc\uc740 ViewModel\uc758 ShowMessageCommand\uc640 \ubc14\uc778\ub529\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc27d\uac8c \ucee4\ub9e8\ub4dc \ub85c\uc9c1\uc744 \uc7ac\uc0ac\uc6a9\ud558\uace0 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub294 \uc7a5\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>3.2 ViewModel\uacfc Model\uc758 \uc0c1\ud638\uc791\uc6a9<\/h4>\n<p>\ucee4\ub9e8\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec ViewModel\uc5d0\uc11c Model\uacfc \uc0c1\ud638\uc791\uc6a9\ud558\uace0, \uadf8 \uacb0\uacfc\ub97c UI\uc5d0 \ubc18\uc601\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud55c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0, \uacb0\uacfc\ub97c View\uc5d0 \ud45c\uc2dc\ud558\ub294 \uae30\ub2a5\uc744 \ucd94\uac00\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>public class DataViewModel\n{\n    public RelayCommand SubmitCommand { get; }\n    public string UserInput { get; set; }\n    public string Result { get; private set; }\n\n    public DataViewModel()\n    {\n        SubmitCommand = new RelayCommand(Submit);\n    }\n\n    private void Submit(object parameter)\n    {\n        Result = \"\uc785\ub825 \uac12: \" + UserInput;\n        OnPropertyChanged(nameof(Result));\n    }\n}<\/code><\/pre>\n<p>\uc704\uc758 ViewModel\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud55c UserInput \uac12\uc744 \ucc98\ub9ac\ud558\uace0, \uadf8 \uacb0\uacfc\ub97c Result\uc5d0 \ud560\ub2f9\ud569\ub2c8\ub2e4. \uc774 Result \uc18d\uc131\uc744 UI\uc5d0 \ubc14\uc778\ub529\ud558\uc5ec \uacb0\uacfc\ub97c \ud45c\uc2dc\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n<h4>3.3 UI\uc5d0 \ubc14\uc778\ub529<\/h4>\n<p>\uc774\uc81c \uc704\uc758 DataViewModel\uc744 XAML\uc5d0 \ubc14\uc778\ub529\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>&lt;TextBox Text=\"{Binding UserInput, UpdateSourceTrigger=PropertyChanged}\" \/&gt;\n&lt;Button Content=\"\uc81c\ucd9c\" Command=\"{Binding SubmitCommand}\" \/&gt;\n&lt;TextBlock Text=\"{Binding Result}\" \/&gt; <\/code><\/pre>\n<h3>4. \ucee4\ub9e8\ub4dc\uc758 \uc0ac\uc6a9\uc790 \uc815\uc758<\/h3>\n<p>WPF\uc5d0\uc11c \ucee4\ub9e8\ub4dc\ub294 \ud30c\ub77c\ubbf8\ud130, \uc0c1\ud0dc \ub4f1 \ub2e4\uc591\ud55c \uc815\ubcf4\ub97c \ud3ec\ud568\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c, \uac1c\ubc1c\uc790\ub294 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub9de\uac8c \ucee4\ub9e8\ub4dc\ub97c \uc0ac\uc6a9\uc790 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ubcf5\uc7a1\ud55c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc27d\uac8c \ucc98\ub9ac\ud558\uace0 \uc720\uc9c0\uad00\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>4.1 \ub2e4\uc911 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc6d0\ud558\ub294 \ucee4\ub9e8\ub4dc<\/h4>\n<p>\ub54c\ub860 \ucee4\ub9e8\ub4dc\uac00 \uc5ec\ub7ec \uac1c\uc758 \ud30c\ub77c\ubbf8\ud130\ub97c \ud544\uc694\ub85c \ud558\ub294 \uacbd\uc6b0\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uacbd\uc6b0, DelegateCommand\ub098 RelayCommand\uc758 Execute \uba54\uc11c\ub4dc\uc5d0 \uc5ec\ub7ec \uac1c\uc758 \ud30c\ub77c\ubbf8\ud130\ub97c \uc804\ub2ec\ud558\uae30 \uc704\ud574 Tuple\uc774\ub098 Custom \uac1d\uccb4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>public class MultiParametersViewModel\n{\n    public RelayCommand ExecuteMultiCommand { get; }\n\n    public MultiParametersViewModel()\n    {\n        ExecuteMultiCommand = new RelayCommand(ExecuteMulti);\n    }\n\n    private void ExecuteMulti(object parameters)\n    {\n        var parameterTuple = parameters as Tuple&lt;string, int&gt;;\n        if (parameterTuple != null)\n        {\n            string name = parameterTuple.Item1;\n            int age = parameterTuple.Item2;\n\n            MessageBox.Show($\"\uc774\ub984: {name}, \ub098\uc774: {age}\");\n        }\n    }\n}<\/code><\/pre>\n<h4>4.2 UI\uc5d0\uc11c\uc758 \ub2e4\uc911 \ud30c\ub77c\ubbf8\ud130 \ubc14\uc778\ub529<\/h4>\n<p>View\uc5d0\uc11c\ub294 \ubc84\ud2bc \ucee4\ub9e8\ub4dc\ub97c \ud638\ucd9c \uc2dc Tuple\uc744 \uc774\uc6a9\ud558\uc5ec \ub2e4\uc911 \ud30c\ub77c\ubbf8\ud130\ub97c \uc804\ub2ec\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uba74:<\/p>\n<pre><code>&lt;Button Content=\"\uc81c\ucd9c\" Command=\"{Binding ExecuteMultiCommand}\" \n        CommandParameter=\"{Binding Path=SomeEntity}\" \/&gt;<\/code><\/pre>\n<p>\uc5ec\uae30\uc11c SomeEntity\ub294 \uc774\ub984\uacfc \ub098\uc774\ub97c \ud3ec\ud568\ud558\ub294 \uac1d\uccb4\uc785\ub2c8\ub2e4.<\/p>\n<h3>5. \ucee4\ub9e8\ub4dc\uc758 \ub2e8\uc704 \ud14c\uc2a4\ud2b8<\/h3>\n<p>MVVM\uc5d0\uc11c \ucee4\ub9e8\ub4dc\ub294 \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \uc27d\uac8c \ub9cc\ub4e4 \uc218 \uc788\ub3c4\ub85d \ub3d5\uc2b5\ub2c8\ub2e4. \ucee4\ub9e8\ub4dc\ub97c \uc9c1\uc811\uc801\uc73c\ub85c Testable\ud558\uac8c \ub9cc\ub4e4\uba74 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc758 \uc815\ud655\uc131\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. RelayCommand \ub610\ub294 DelegateCommand\ub97c \ud14c\uc2a4\ud2b8\ud558\uae30 \uc704\ud55c \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>5.1 RelayCommand \uc720\ub2db \ud14c\uc2a4\ud2b8<\/h4>\n<p><code>RelayCommand<\/code>\uc758 \uc720\ub2db \ud14c\uc2a4\ud2b8\ub294 \ucee4\ub9e8\ub4dc\uac00 \uc815\ud574\uc9c4 \ub85c\uc9c1\uc744 \uc218\ud589\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \ub370 \uc911\uc810\uc744 \ub461\ub2c8\ub2e4.<\/p>\n<pre><code>[TestClass]\npublic class RelayCommandTests\n{\n    private bool _wasExecuted;\n\n    [TestMethod]\n    public void CanExecute_ShouldReturnTrue_WhenCanExecuteReturnsTrue()\n    {\n        var command = new RelayCommand(param =&gt; _wasExecuted = true, param =&gt; true);\n\n        Assert.IsTrue(command.CanExecute(null));\n        command.Execute(null);\n        Assert.IsTrue(_wasExecuted);\n    }\n\n    [TestMethod]\n    public void CanExecute_ShouldReturnFalse_WhenCanExecuteReturnsFalse()\n    {\n        var command = new RelayCommand(param =&gt; _wasExecuted = true, param =&gt; false);\n\n        Assert.IsFalse(command.CanExecute(null));\n        command.Execute(null);\n        Assert.IsFalse(_wasExecuted);\n    }\n}<\/code><\/pre>\n<h3>\uacb0\ub860<\/h3>\n<p>\uc774\ubc88 \ud3ec\uc2a4\ud2b8\uc5d0\uc11c\ub294 WPF\uc758 MVVM \ud328\ud134\uc5d0\uc11c \ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529\uc758 \uace0\uae09 \ud65c\uc6a9 \ubc29\ubc95 \ubc0f DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9\ubc95\uc5d0 \ub300\ud574 \ub2e4\uc591\ud55c \uc608\uc81c\ub97c \ud1b5\ud574 \uc124\uba85\ud558\uc600\uc2b5\ub2c8\ub2e4. \ucee4\ub9e8\ub4dc\ub294 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\uace0, \uac1c\ubc1c\uc790\uac00 \ucd5c\uc18c\ud55c\uc758 \ucf54\ub4dc\ub85c \ubcf5\uc7a1\ud55c \ub3d9\uc791\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\ub3c4\ub85d \ub3d5\ub294 \uac15\ub825\ud55c \ub3c4\uad6c\uc785\ub2c8\ub2e4. \uc774 \uad50\ud6c8\uc744 \ud1b5\ud574 \ub354 \ub098\uc740 \ucf54\ub4dc \uad6c\uc870\uc640 \uc720\uc9c0\ubcf4\uc218 \ubc0f \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uc744 \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc55e\uc73c\ub85c\ub3c4 WPF\uc640 MVVM\uc744 \ud65c\uc6a9\ud558\uc5ec \ub354 \ubc1c\uc804\ub41c \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud560 \uc218 \uc788\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9: \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 &#8211; DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 WPF(Windows Presentation Foundation)\uc5d0\uc11c MVVM(Model-View-ViewModel) \ud328\ud134\uc744 \uc0ac\uc6a9\ud560 \ub54c, \ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529\uc740 \ud575\uc2ec\uc801\uc778 \uc694\uc18c\uc785\ub2c8\ub2e4. MVVM \ud328\ud134\uc758 \uc8fc\uc694 \uc774\uc810 \uc911 \ud558\ub098\ub294 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\uc5ec \uc720\uc9c0 \ubcf4\uc218\uc131\uacfc \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uc744 \uadf9\ub300\ud654\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \ucee4\ub9e8\ub4dc\uc758 \uace0\uae09 \ud65c\uc6a9 \ubc29\ubc95\uacfc Command \ud328\ud134\uc758 \uc2ec\ud654 \uc774\ud574\ub97c \uc704\ud574 DelegateCommand\uc640 RelayCommand\uc758 \uac1c\ub150\uc744 \uae4a\uc774 \uc788\uac8c \ud0d0\uad6c\ud558\uace0, &hellip; <a href=\"https:\/\/atmokpo.com\/w\/42929\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654  DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9&#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-42929","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] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 - \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\/42929\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9: \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 &#8211; DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 WPF(Windows Presentation Foundation)\uc5d0\uc11c MVVM(Model-View-ViewModel) \ud328\ud134\uc744 \uc0ac\uc6a9\ud560 \ub54c, \ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529\uc740 \ud575\uc2ec\uc801\uc778 \uc694\uc18c\uc785\ub2c8\ub2e4. MVVM \ud328\ud134\uc758 \uc8fc\uc694 \uc774\uc810 \uc911 \ud558\ub098\ub294 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\uc5ec \uc720\uc9c0 \ubcf4\uc218\uc131\uacfc \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uc744 \uadf9\ub300\ud654\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \ucee4\ub9e8\ub4dc\uc758 \uace0\uae09 \ud65c\uc6a9 \ubc29\ubc95\uacfc Command \ud328\ud134\uc758 \uc2ec\ud654 \uc774\ud574\ub97c \uc704\ud574 DelegateCommand\uc640 RelayCommand\uc758 \uac1c\ub150\uc744 \uae4a\uc774 \uc788\uac8c \ud0d0\uad6c\ud558\uace0, &hellip; \ub354 \ubcf4\uae30 &quot;[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/42929\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-13T22:28:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-26T06:34:23+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\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/42929\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42929\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9\",\"datePublished\":\"2024-11-13T22:28:16+00:00\",\"dateModified\":\"2024-11-26T06:34:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42929\/\"},\"wordCount\":95,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF \uac1c\ubc1c\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/42929\/\",\"url\":\"https:\/\/atmokpo.com\/w\/42929\/\",\"name\":\"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-13T22:28:16+00:00\",\"dateModified\":\"2024-11-26T06:34:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42929\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/42929\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/42929\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9\"}]},{\"@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] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 - \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\/42929\/","og_locale":"ko_KR","og_type":"article","og_title":"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9: \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 &#8211; DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 WPF(Windows Presentation Foundation)\uc5d0\uc11c MVVM(Model-View-ViewModel) \ud328\ud134\uc744 \uc0ac\uc6a9\ud560 \ub54c, \ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529\uc740 \ud575\uc2ec\uc801\uc778 \uc694\uc18c\uc785\ub2c8\ub2e4. MVVM \ud328\ud134\uc758 \uc8fc\uc694 \uc774\uc810 \uc911 \ud558\ub098\ub294 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\uc5ec \uc720\uc9c0 \ubcf4\uc218\uc131\uacfc \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uc744 \uadf9\ub300\ud654\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \ucee4\ub9e8\ub4dc\uc758 \uace0\uae09 \ud65c\uc6a9 \ubc29\ubc95\uacfc Command \ud328\ud134\uc758 \uc2ec\ud654 \uc774\ud574\ub97c \uc704\ud574 DelegateCommand\uc640 RelayCommand\uc758 \uac1c\ub150\uc744 \uae4a\uc774 \uc788\uac8c \ud0d0\uad6c\ud558\uace0, &hellip; \ub354 \ubcf4\uae30 \"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9\"","og_url":"https:\/\/atmokpo.com\/w\/42929\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-13T22:28:16+00:00","article_modified_time":"2024-11-26T06:34:23+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"3\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/42929\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/42929\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9","datePublished":"2024-11-13T22:28:16+00:00","dateModified":"2024-11-26T06:34:23+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/42929\/"},"wordCount":95,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF \uac1c\ubc1c"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/42929\/","url":"https:\/\/atmokpo.com\/w\/42929\/","name":"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-13T22:28:16+00:00","dateModified":"2024-11-26T06:34:23+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/42929\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/42929\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/42929\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"[MVVM] 2.\ucee4\ub9e8\ub4dc\uc640 \ubc14\uc778\ub529 \uace0\uae09 \ud65c\uc6a9, \ucee4\ub9e8\ub4dc \ud328\ud134\uc758 \uc2ec\ud654 DelegateCommand\uc640 RelayCommand\uc758 \uc0ac\uc6a9"}]},{"@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":[{"id":43257,"url":"https:\/\/atmokpo.com\/w\/43257\/","url_meta":{"origin":42929,"position":0},"title":"[Prism]  015. Prism\uc758 \ucee4\ub9e8\ub4dc \ubc0f \uc774\ubca4\ud2b8 \uac00\uc838\uc624\uae30, \ube44\ub3d9\uae30 \ucc98\ub9ac\ub97c \uc704\ud55c AsyncCommand","author":"root","date":"2024\ub144 11\uc6d4 26\uc77c","format":false,"excerpt":"Prism\uc740 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\ub294 \ub370 \uc788\uc5b4 \uac15\ub825\ud55c \ud504\ub808\uc784\uc6cc\ud06c\ub85c, MVVM(Model-View-ViewModel) \ud328\ud134\uc744 \uc9c0\uc6d0\ud558\uc5ec UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \ubd84\ub9ac\ud569\ub2c8\ub2e4. \uadf8 \uc911\uc5d0\uc11c\ub3c4 \ucee4\ub9e8\ub4dc\uc640 \uc774\ubca4\ud2b8 \ucc98\ub9ac, \ube44\ub3d9\uae30 \uc791\uc5c5\uc744 \uc704\ud55c AsyncCommand\ub294 Prism\uc758 \ud070 \uc7a5\uc810 \uc911 \ud558\ub098\ub85c, \uac1c\ubc1c\uc790\uc5d0\uac8c \ub354 \ub098\uc740 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uc81c\uacf5\ud558\uace0 \ucf54\ub4dc\uc758 \uac00\ub3c5\uc131\uc744 \ub192\uc785\ub2c8\ub2e4. 1. Prism\uc758 \ucee4\ub9e8\ub4dc \uc774\ud574\ud558\uae30 \ucee4\ub9e8\ub4dc\ub294 \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ud2b9\uc815 \uc791\uc5c5\uc744 \uc815\uc758\ud558\ub294\u2026","rel":"","context":"&quot;WPF \uac1c\ubc1c&quot;\uc5d0\uc11c","block_context":{"text":"WPF \uac1c\ubc1c","link":"https:\/\/atmokpo.com\/w\/category\/wpf-%ea%b0%9c%eb%b0%9c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":43221,"url":"https:\/\/atmokpo.com\/w\/43221\/","url_meta":{"origin":42929,"position":1},"title":"[Prism]  022. \uace0\uae09 \uae30\ub2a5 \ubc0f \ud65c\uc6a9 \uc0ac\ub840, \uc2e4\uc6a9\uc801\uc778 \uc0ac\ub840 \uc5f0\uad6c (\uc608  \ub300\uc2dc\ubcf4\ub4dc \uc571, CRUD \uc571 \ub4f1)","author":"root","date":"2024\ub144 11\uc6d4 26\uc77c","format":false,"excerpt":"0. \uc11c\ub860 WPF(Windows Presentation Foundation)\ub294 \ub9c8\uc774\ud06c\ub85c\uc18c\ud504\ud2b8\uc758 UI \ud504\ub808\uc784\uc6cc\ud06c\ub85c, \ud48d\ubd80\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uc81c\uacf5\ud558\uc5ec \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4. Prism\uc740 \uc774\ub7ec\ud55c WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc744 \uc9c0\uc6d0\ud558\ub294 \ud504\ub808\uc784\uc6cc\ud06c\ub85c, \ubaa8\ub4c8\ud654, MVVM(Model-View-ViewModel), DI(Dependency Injection) \ub4f1\uc758 \ud328\ud134\uc744 \ud1b5\ud574 \uc720\uc9c0\ubcf4\uc218\uc131\uacfc \ud655\uc7a5\uc131\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubcf8 \uae00\uc5d0\uc11c\ub294 Prism\uc758 \uace0\uae09 \uae30\ub2a5\uacfc \uc774\ub97c \ud65c\uc6a9\ud55c \uc2e4\uc6a9\uc801\uc778 \ud504\ub85c\uc81d\ud2b8 \uc0ac\ub840\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. 1. Prism\uc758 \uace0\uae09 \uae30\ub2a5\u2026","rel":"","context":"&quot;WPF \uac1c\ubc1c&quot;\uc5d0\uc11c","block_context":{"text":"WPF \uac1c\ubc1c","link":"https:\/\/atmokpo.com\/w\/category\/wpf-%ea%b0%9c%eb%b0%9c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":43225,"url":"https:\/\/atmokpo.com\/w\/43225\/","url_meta":{"origin":42929,"position":2},"title":"[Prism]  014. Prism\uc758 \ucee4\ub9e8\ub4dc \ubc0f \uc774\ubca4\ud2b8 \uac00\uc838\uc624\uae30, DelegateCommand \ubc0f EventAggregator \uc0ac\uc6a9\ubc95","author":"root","date":"2024\ub144 11\uc6d4 26\uc77c","format":false,"excerpt":"\uc791\uc131\uc790: Your Name | \ub0a0\uc9dc: YYYY-MM-DD \ubaa9\ucc28 1. \uc11c\ub860 2. DelegateCommand 3. EventAggregator 4. \uc608\uc81c 5. \uacb0\ub860 1. \uc11c\ub860 WPF(Windows Presentation Foundation) \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\uae30 \uc704\ud55c Prism \ud504\ub808\uc784\uc6cc\ud06c\ub294 \ubaa8\ub4c8\ud654, MVVM \ud328\ud134 \uc9c0\uc6d0 \ubc0f \uc758\uc874\uc131 \uc8fc\uc785\uacfc \uac19\uc740 \ub9ce\uc740 \uac15\ub825\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Prism\uc5d0\uc11c \ucee4\ub9e8\ub4dc\uc640 \uc774\ubca4\ud2b8\ub97c \uc5b4\ub5bb\uac8c \ucc98\ub9ac\ud558\ub294\uc9c0, \ud2b9\ud788 DelegateCommand\uc640 EventAggregator\uc758 \uc0ac\uc6a9\u2026","rel":"","context":"&quot;WPF \uac1c\ubc1c&quot;\uc5d0\uc11c","block_context":{"text":"WPF \uac1c\ubc1c","link":"https:\/\/atmokpo.com\/w\/category\/wpf-%ea%b0%9c%eb%b0%9c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":31331,"url":"https:\/\/atmokpo.com\/w\/31331\/","url_meta":{"origin":42929,"position":3},"title":"WPF \uac15\uc88c, Prism\uc744 \uc0ac\uc6a9\ud55c \ub300\uaddc\ubaa8 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc124\uacc4","author":"root","date":"2024\ub144 10\uc6d4 28\uc77c","format":false,"excerpt":"Windows Presentation Foundation(WPF)\uc740 .NET \ud658\uacbd\uc5d0\uc11c \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ub370 \uc0ac\uc6a9\ud558\ub294 \uac15\ub825\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. WPF\ub294 \ud48d\ubd80\ud55c \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub294 \uae30\ub2a5\uacfc \ub370\uc774\ud130 \ubc14\uc778\ub529, \uc2a4\ud0c0\uc77c\ub9c1 \ubc0f \ud15c\ud50c\ub9bf\uc744 \ud1b5\ud55c UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \uae30\ub2a5\uc744 \uc81c\uacf5\ud574 \uac1c\ubc1c\uc790\ub4e4\uc5d0\uac8c \uc778\uae30 \uc788\ub294 \uc120\ud0dd\uc774 \ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \ub300\uaddc\ubaa8 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc124\uacc4\ud560 \ub54c, \ucf54\ub4dc\uc758 \uad6c\uc870\ud654 \ubc0f \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \ub192\uc774\uae30 \uc704\ud574 \ub514\uc790\uc778 \ud328\ud134\uacfc\u2026","rel":"","context":"&quot;WPF \uac1c\ubc1c&quot;\uc5d0\uc11c","block_context":{"text":"WPF \uac1c\ubc1c","link":"https:\/\/atmokpo.com\/w\/category\/wpf-%ea%b0%9c%eb%b0%9c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":43219,"url":"https:\/\/atmokpo.com\/w\/43219\/","url_meta":{"origin":42929,"position":4},"title":"[Prism]  001. Prism \uc18c\uac1c \ubc0f \uae30\ubcf8 \uac1c\ub150, Prism\uc758 \ubc30\uacbd\uacfc \ud544\uc694\uc131","author":"root","date":"2024\ub144 11\uc6d4 26\uc77c","format":false,"excerpt":"WPF (Windows Presentation Foundation)\ub294 \ub370\uc2a4\ud06c\ud1b1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\uae30 \uc704\ud55c \uac15\ub825\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uaddc\ubaa8\uac00 \ucee4\uc9c8\uc218\ub85d \ubcf5\uc7a1\uc131\uacfc \uc720\uc9c0\ubcf4\uc218\uac00 \uc5b4\ub835\ub2e4\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 Prism\uc774\ub77c\ub294 \uac1c\ubc1c \ud504\ub808\uc784\uc6cc\ud06c\uac00 \ub4f1\uc7a5\ud588\uc2b5\ub2c8\ub2e4. Prism\uc740 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ubcf4\ub2e4 \uad6c\uc870\uc801\uc774\uace0 \uc720\uc9c0\ubcf4\uc218\ud558\uae30 \uc27d\uac8c \ub9cc\ub4dc\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc8fc\ub294 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. Prism\uc758 \ubc30\uacbd Prism\uc740 Microsoft\uc5d0\uc11c \uc9c0\uc6d0\ud558\ub294 \uc624\ud508 \uc18c\uc2a4 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c, \ub300\uaddc\ubaa8 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uac1c\ubc1c\ud558\uae30 \uc704\ud55c\u2026","rel":"","context":"&quot;WPF \uac1c\ubc1c&quot;\uc5d0\uc11c","block_context":{"text":"WPF \uac1c\ubc1c","link":"https:\/\/atmokpo.com\/w\/category\/wpf-%ea%b0%9c%eb%b0%9c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":43247,"url":"https:\/\/atmokpo.com\/w\/43247\/","url_meta":{"origin":42929,"position":5},"title":"[Prism]  026. Prism\uc744 \uc774\uc6a9\ud55c \ub514\uc790\uc778 \ud328\ud134 \uc801\uc6a9, \ub098\ub9cc\uc758 \uc720\uc800 \uc778\ud130\ud398\uc774\uc2a4 \uc124\uacc4","author":"root","date":"2024\ub144 11\uc6d4 26\uc77c","format":false,"excerpt":"WPF(Windows Presentation Foundation)\ub294 \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\uae30 \uc704\ud55c \uac15\ub825\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. Prism\uc740 WPF\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 MVVM(\ubaa8\ub378-\ubdf0-\ubdf0\ubaa8\ub378) \ud328\ud134\uc744 \uc9c0\uc6d0\ud558\uace0 \ud655\uc7a5\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc8fc\ub294 \uac1c\ubc1c \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Prism\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub514\uc790\uc778 \ud328\ud134\uc744 \uc801\uc6a9\ud558\uace0 \ub098\ub9cc\uc758 \uc720\uc800 \uc778\ud130\ud398\uc774\uc2a4(UI)\ub97c \uc124\uacc4\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \ub2e4\ub904\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. 1. Prism\uc758 \uc18c\uac1c Prism\uc740 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\uc131\ud558\uae30 \uc704\ud55c \ubaa8\ub4c8\ud654\ub41c \uc544\ud0a4\ud14d\ucc98\ub97c \uc81c\uacf5\ud558\uba70, \ubaa8\ub4c8\ud654, \uc758\uc874\uc131 \uc8fc\uc785,\u2026","rel":"","context":"&quot;WPF \uac1c\ubc1c&quot;\uc5d0\uc11c","block_context":{"text":"WPF \uac1c\ubc1c","link":"https:\/\/atmokpo.com\/w\/category\/wpf-%ea%b0%9c%eb%b0%9c\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42929","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=42929"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42929\/revisions"}],"predecessor-version":[{"id":42930,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42929\/revisions\/42930"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=42929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=42929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=42929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}