[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
์ง๋ ํฌ์คํ
์์ MVC ํจํด์ ๋ํด ์๊ฐ๋ฅผ ํ์์ต๋๋ค.
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #1
์ด๋ฒ ํฌ์คํ ์์๋ MVC ํจํด์ ์ ์ฉํ ์ํผ(WinForm) ์์ ๋ฅผ ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
MVC ํจํด์ ์ ์ฉํ ์ ํ๋ฒํธ๋ถ ํ๋ก๊ทธ๋จ
์ด์ ํฌ์คํ ์์ MVC ํจํด์ ๋ํ ์ด๋ก ์ ์ธ ์ค๋ช ์ด ์์์ต๋๋ค. ํ์ง๋ง ์ฒ์ ์ ํ๋ ๋ถ๋ค์๊ฒ๋ ๊ฐ๋ ์ ์ผ๋ก ์ดํด๊ฐ ์ ๋์ง ์์ ๊ฒ์ด๋ผ ์๊ฐํฉ๋๋ค. ์ ์ค๋ช ์ด ๋ถ์กฑํ ์ ๋ ์์ง๋ง, ๋ฌด์๋ณด๋ค ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํด๊ฐ ๋์ฑ ์ฌ์ธ ๊ฑฐ๋ผ ์๊ฐํ์ฌ ์์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์์ต๋๋ค.
์์ ์ฝ๋๋ '์ ํ๋ฒํธ๋ถ'๋ฅผ ์์๋ก ์์ฑํ์ต๋๋ค. ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๊ณ , ์กฐํํ๊ณ , ์ ๊ฑฐํ๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ ๋๋ค. ์ฆ, ๋ฐ์ดํฐ์ ์ถ๊ฐ์ ์ ๊ฑฐ, ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง๋๋ฐ ์ด๊ฒ์ MVC ํจํด์ ์ ์ฉํ์ฌ ์ญํ ๋ณ๋ก ๋๋์๋ค๊ณ ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ ์ ๋๋ฉ์ด์ ์ ์์ ์ฝ๋ ๋์์ ๋ณด์ฌ์ค๋๋ค. ํ๋ก๊ทธ๋จ ์์ ์ 4๋ช ์ ์ ๋ณด๊ฐ ์ ๋ ฅ๋์ด ์๊ณ , ๊ธฐ์กด ์ ๋ณด๋ฅผ ์ง์ฐ๊ฑฐ๋ ์๋ก ์ ๋ ฅํ ์ ์์ต๋๋ค.
MVC ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ต๋๋ค. ๋ชจ๋ธ์๋ ์ฌ๋์ ์ ๋ณด๊ฐ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋์ด ์๊ณ , ๋ทฐ์๋ ์ฌ๋ ๋ชฉ๋ก๊ณผ ์์ฑ / ์ ๊ฑฐ / ์ถ๊ฐํ ์ ์๋ ๋ฒํผ๊ณผ ํ ์คํธ ๋ฐ์ค๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ปจํธ๋กค๋ฌ๋ ์ค๊ฐ์ ์์นํ์ฌ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
์ฝ๋ ์ค๋ช
์ฝ๋๋ ๋ชจ๋ธ / ์ปจํธ๋กค๋ฌ / ๋ทฐ ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ ๋ฉ์ธ ํ๋ก๊ทธ๋จ ์์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์์ ์ฝ๋์ UML์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ชจ๋ธ(Model)
Customer ํด๋์ค์ ID์ Name, Phone, Address ์ ๋ณด๋ฅผ get/set ํ ์ ์์ต๋๋ค.
namespace MVCPattern.Model
{
public class Customer
{
public Customer(string id, string name, string phone, string address)
{
_id = id;
_name = name;
_phone = phone;
_address = address;
}
string _id;
public string ID
{
get { return _id; }
set { _id = value; }
}
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
string _phone;
public string Phone
{
get { return _phone; }
set { _phone = value; }
}
string _address;
public string Address
{
get { return _address; }
set { _address = value; }
}
}
}
์ปจํธ๋กค๋ฌ(Controller)
์ปจํธ๋กค๋ฌ์์๋ ๋ทฐ์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ์ง ์๊ณ , View interface์ ์ ๊ทผํฉ๋๋ค. ๋ฌผ๋ก , interface ์์ด ์ง์ ์ ๊ทผํด๋ ์๊ด์ ์์ง๋ง ๊ณตํต์ ์ด ๋ง์ ๋ทฐ๋ฅผ ์ง์ ์ ๊ทผํ๊ธฐ ๋ณด๋ค๋ interface์ ์ ๊ทผํ๊ฒ ๊ตฌํํ๋ ๊ฒ์ด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๋๋ค.
๋ทฐ ์ธํฐํ์ด์ค์๋ ํ
์คํธ ๋ฐ์ค์ ๋ณด์ฌ์ง๊ฑฐ๋ ๋ชฉ๋ก์ ์ง์ฐ๊ฑฐ๋, ๋ฒํผ์ด ํด๋ฆญ๋์ ๋ ์ํ๋๋ ๋์๋ค์ด ๊ธฐ๋ณธ์ผ๋ก ์ ์๋์ด ์๊ณ , ๊ทธ ์ธ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ์ ์๋์ด ์์ต๋๋ค.
namespace MVCPattern.Controller
{
public interface IView
{
void setController(Controller controller);
void clearList();
void addCustomer(Customer customer);
void removeCustomer(Customer customer);
void updateListWithCustomer(Customer customer);
string getSelectedCustomerID();
void setSelectedCustomer(Customer customer);
string Name { get; set; }
string Address { get; set; }
string Phone { get; set; }
string ID { get; set; }
bool isModify { set; }
}
}
์ปจํธ๋กค๋ฌ์๋ ์์ ์ ์ํ ๋ทฐ ์ธํฐํ์ด์ค์ ๋ชจ๋ธ์ ๊ฐ๊ณ ์์ต๋๋ค. Customer ์ ๋ณด๊ฐ View์ ๋๊ธฐ๊ฑฐ๋ View์ ์ ๋ณด๊ฐ Customer๋ก ๋๊ธฐ๊ฑฐ๋, Customer ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ๊ฑฐ๋, Customer๋ฅผ ์ถ๊ฐ/์ญ์ ํ๊ฑฐ๋ ๋ฑ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ปจํธ๋กค๋ฌ์ ๊ตฌํ๋์ด ์์ต๋๋ค.
namespace MVCPattern.Controller
{
public class Controller
{
IView _view = null;
IList _customers = null;
Customer _selectedCustomer;
public Controller(IView view, IList customers)
{
_view = view;
_customers = customers;
view.setController(this);
}
private void updateView(Customer customer)
{
_view.ID = customer.ID;
_view.Name = customer.Name;
_view.Phone = customer.Phone;
_view.Address = customer.Address;
}
private void updateCustomer(Customer customer)
{
customer.ID = _view.ID;
customer.Name = _view.Name;
customer.Phone = _view.Phone;
customer.Address = _view.Address;
}
public void LoadView()
{
_view.clearList();
foreach (Customer customer in _customers)
_view.addCustomer(customer);
_view.setSelectedCustomer((Customer)_customers[0]);
}
public void SelectedCustomer(string selectedCustomerId)
{
foreach (Customer customer in this._customers)
{
if (customer.ID == selectedCustomerId)
{
_selectedCustomer = customer;
updateView(customer);
_view.setSelectedCustomer(customer);
this._view.isModify = false;
break;
}
}
}
public void AddNewCustomer()
{
_selectedCustomer = new Customer("", "", "", "");
updateView(_selectedCustomer);
_view.isModify = true;
}
public void RemoveCustomer()
{
string id = this._view.getSelectedCustomerID();
Customer customerToRemove = null;
if (id != "")
{
foreach (Customer customer in _customers)
{
if (customer.ID == id)
{
customerToRemove = customer;
break;
}
}
if (customerToRemove != null)
{
int index = _customers.IndexOf(customerToRemove);
_customers.Remove(customerToRemove);
_view.removeCustomer(customerToRemove);
if (index > -1 && index < _customers.Count)
{
_view.setSelectedCustomer((Customer)_customers[index]);
}
}
}
}
public void Register()
{
updateCustomer(_selectedCustomer);
if (!_customers.Contains(_selectedCustomer))
{
_customers.Add(_selectedCustomer);
_view.addCustomer(_selectedCustomer);
}
else
{
_view.updateListWithCustomer(_selectedCustomer);
}
_view.setSelectedCustomer(_selectedCustomer);
_view.isModify = false;
}
}
}
๋ทฐ(View)
๋ทฐ์๋ View Interface์ ๋ฒํผ ๋ฐ ๋ฆฌ์คํธ ๋ทฐ ์ด๋ฒคํธ๊ฐ ๊ตฌํ๋์ด ์์ต๋๋ค. ์ฝ๋๊ฐ ๋๋ฌด ๊ธด ๊ด๊ณ๋ก ์์ธํ ๋ด์ฉ์ ํ๋จ์ ์ฒจ๋ถ๋ ์์ ํ์ผ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
namespace MVCPattern.View
{
public partial class MainForm : Form, IView
{
MVCPattern.Controller.Controller _controller;
public MainForm()
{
InitializeComponent();
}
public void setController(MVCPattern.Controller.Controller controller)
{
_controller = controller;
}
public void clearList() {...}
public void addCustomer(Customer customer) {...}
public void updateListWithCustomer(Customer customer) {...}
public void removeCustomer(Customer customer) {...}
public string getSelectedCustomerID() {...}
public void setSelectedCustomer(Customer customer) {...}
private void buttonRemoveCustomer_Click(object sender, EventArgs e)
{
_controller.RemoveCustomer();
}
private void buttonRegister_Click(object sender, EventArgs e)
{
_controller.Register();
}
private void listViewCustomer_SelectedIndexChanged(object sender, EventArgs e)
{
if (listViewCustomer.SelectedItems.Count > 0)
_controller.SelectedCustomer(listViewCustomer.SelectedItems[0].Text);
}
private void buttonNewCustomer_Click(object sender, EventArgs e)
{
_controller.AddNewCustomer();
}
}
}
ํ๋ก๊ทธ๋จ ๋ฉ์ธ
๋ฉ์ธ์์ ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๋๋ฐ, ๋ทฐ์ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ๋๊น๋๋ค.
namespace ExamMVC
{
static class Program
{
/// <summary>
/// ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฃผ ์ง์
์ ์
๋๋ค.
/// </summary>
[STAThread]
static void Main()
{
MainForm form = new MainForm();
// Add some dummy data
IList users = new ArrayList();
users.Add(new Customer("1", "๊น์ฒ ์", "010-1234-5678", "์์ธ์ ๊ฐ๋๊ตฌ"));
users.Add(new Customer("2", "์ด์์ง", "010-0000-1111", "์์ธ์ ๊ฐ๋จ๊ตฌ"));
users.Add(new Customer("3", "์ต์์ ", "010-2222-3333", "์์ธ์ ๊ฐ์๊ตฌ"));
users.Add(new Customer("4", "๋ฐ์ฌ์", "010-4444-5555", "์์ธ์ ๊ฐ๋ถ๊ตฌ"));
Controller controller = new Controller(form, users);
controller.LoadView();
form.ShowDialog();
}
}
}
์์ธํ ๋ด์ฉ์ ์ฒจ๋ถ๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
'Programming > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Design Pattern] ๋์์ธ ํจํด ์๊ฐ (์ถ์ฒ ๋์ ํฌํจ)
[Design Pattern] ๋์์ธ ํจํด ์๊ฐ (์ถ์ฒ ๋์ ํฌํจ)
2019.10.06 -
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #1
[Design Pattern] MVC(Model-View-Controller) ํจํด ์ด์ผ๊ธฐ #1
2019.09.27 -
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #2 (์์ ํฌํจ)
2019.09.23 -
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #1 (์์ ํฌํจ)
[Design Pattern] ์ต์ ๋ฒ ํจํด(Observer Pattern) ์ด์ผ๊ธฐ #1 (์์ ํฌํจ)
2019.09.12