μμ±μ : μ ν¬μ¬
λ³Έ μλ£λ 'νμ΄μ¬ λμμΈ ν¨ν΄ 2/e (Chetan Giridhar)' μ±
μ ν λλ‘ μμ±λμμ΅λλ€. λ°λΌμ λͺ¨λ μμ μ½λμλ μ μλ₯Ό νμνλ __author__ = 'Chetan'
μ΄ ν¬ν¨λ©λλ€.
Table of Contents
μννΈμ¨μ΄ κ°λ°μμλ νλμ λμμΈ ν¨ν΄λ§μ μ¬μ©νμ§ μκ³ μ¬λ¬ κ°μ§ ν¨ν΄μ μμ΄ μ¬μ©νλ€. μΌλ°μ μΌλ‘ μ¬λ¬ ν¨ν΄μ ν©μ³ λͺ©μ μ λ¬μ±νλ€. GoFμ λ°λ₯΄λ©΄ μ»΄νμ΄λ ν¨ν΄μ 2κ° μ΄μμ ν¨ν΄μ ν©μ³ λ¬Έμ λ₯Ό ν΄κ²°νλ ν¨ν΄μ΄λ€. νμ§λ§ μ»΄νμ΄λ ν¨ν΄μ λ¨μν μ¬λ¬ ν¨ν΄μ μ‘°ν©μ΄ μλ λ¬Έμ λ₯Ό ν΄κ²°νλ λ 립μ μΈ μ루μ μ΄λ€.
MVC ν¨ν΄μ μ μ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ μ μ§λ³΄μκ° μ©μ΄ν λμμΈ ν¨ν΄μ΄λ€. MVC ν¨ν΄μ μ ν리μΌμ΄μ μ λͺ¨λΈκ³Ό λ·°, 컨νΈλ‘€λ¬λ‘ λλμ΄ κ΅¬μ±νλ€. κ° ννΈλ λ§λ¬Όλ € μμΌλ©° μμ²μ μ²λ¦¬μ ννμ λΆλ¦¬νλ€.
λͺ¨λΈμ λ°μ΄ν°μ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νκ³ λ·°λ λ°μ΄ν°μ μκ°μ ννμ λ΄λΉνλ©° 컨νΈλ‘€λ¬λ μ¬μ©μμ μμ²μ λ°λΌ λͺ¨λΈκ³Ό λ·° μ¬μ΄μμ μμ²μ μ²λ¦¬νλ€. λ·°μ 컨νΈλ‘€λ¬λ λͺ¨λΈμ μμ‘΄νμ§λ§ κ·Έ λ°λλ μλλ€. μ¬μ©μκ° λ°μ΄ν°λ₯Ό μ§μ μμ²νλ ꡬ쑰μ΄κΈ° λλ¬Έμ΄λ€. μ΄μ κ°μ λͺ¨λΈμ λ 립μ±μ΄ MVC ν¨ν΄μ μ€μν λΆλΆμ΄λ€.
- μ¬μ©μλ λ·°λ₯Ό ν΅ν΄ μμ²μ 보λΈλ€. λ·°λ μ¬μ©μμκ² λ³΄μ¬μ§λ μΉμ¬μ΄νΈλ€. λ·°μ μλ λ²νΌμ ν΄λ¦νλ©΄ λ·°λ 컨νΈλ‘€λ¬μκ² μμ²μ μ λ¬νλ€.
- 컨νΈλ‘€λ¬λ λ·°μ μ λ¬λ°μ μΈνμ λͺ¨λΈλ‘ 보λΈλ€. λͺ¨λΈμ μμ²μ λ§λ μμ μ μννλ€.
- 컨νΈλ‘€λ¬λ μ¬μ©μμ μμ²μ λ°λΌ λ²νΌ κ΅μ²΄ λ° UI μΆκ° λ±μ λ·°μ μ§μν μ μλ€.
- λͺ¨λΈμ λ·°μ μν λ³κ²½μ μλ¦°λ€. λ΄λΆ λ‘μ§ λλ λ²νΌ ν΄λ¦ λ±μ μΈλΆ νΈλ¦¬κ±°μ μν μν λ³κ²½μ΄λ€.
- λ·°λ λͺ¨λΈμ΄ μ λ¬ν μνλ₯Ό μΆλ ₯νλ€. μλ₯Ό λ€μ΄ μ¬μ©μκ° μΉμ¬μ΄νΈμ λ‘κ·ΈμΈνλ©΄ λμ보λλ₯Ό νμνλ€. λμ보λμ μΈλΆ λ΄μ©μ λͺ¨λΈμ΄ λ·°μ μ λ¬νλ€.
- λͺ¨λΈ : λ°μ΄ν°λ₯Ό μ μ₯νκ³ μ‘°μνλ ν΄λμ€
- λ·° : μ μ μΈν°νμ΄μ€μ λ°μ΄ν°μ μκ°μ ννμ λ΄λΉνλ ν΄λμ€
- 컨νΈλ‘€λ¬ : λͺ¨λΈκ³Ό λ·°λ₯Ό μ°κ²°νλ ν΄λμ€
- ν΄λΌμ΄μΈνΈ : λͺ©μ μ λ°λΌ μ 보λ₯Ό μμ²νλ ν΄λμ€
- Model : λ°μ΄ν°μ μμ±κ³Ό μμ , μλ©Έ λ± λ°μ΄ν°μ κ΄ν λͺ¨λ μμ μ μ μνκ³ λ°μ΄ν°λ₯Ό μ¬μ©νλ λ©μλλ₯Ό μ 곡νλ€.
- View : μ μ μΈν°νμ΄μ€λ₯Ό λ΄λΉνλ€. μ ν리μΌμ΄μ μ νμν μΉμ΄λ GUIλ₯Ό μμ±νλ λ©μλλ₯Ό ν¬ν¨νλ€. μ λ¬λ°λ λ°μ΄ν°λ₯Ό μκ°μ μΌλ‘ νννλ κΈ°λ₯ μΈ κ°λ³μ μΈ λ‘μ§μ ν¬ν¨νμ§ μμμΌ νλ€.
- Controller : λ°μ΄ν°λ₯Ό λ°κ³ μ λ¬νλ€. μμ²μ λΌμ°ν νλ λ©μλλ₯Ό ν¬ν¨νλ€.
- λ°μ΄ν° μ‘°μκ³Ό ννμ λΆλ¦¬
- μ¬μ΄ μ μ§λ³΄μμ ꡬν
- μ μ°ν λ°μ΄ν° μ μ₯κ³Ό νν λ°©μμ μμ . μλ‘ λ 립μ μ΄λ―λ‘ μ½κ² μμ ν μ μλ€.
- λͺ¨λΈμ λ·°μ 컨νΈλ‘€λ¬μλ λ 립μ μΈ μ ν리μΌμ΄μ μ μΌλΆμ΄λ€. λ·°μ 컨νΈλ‘€λ¬λ λͺ¨λΈμ μμ‘΄μ μ΄λ€.
- λͺ¨λΈμ μ¬μ©μκ° μμ²ν λ°μ΄ν°λ₯Ό μ 곡νλ€. μΌλ°μ μΌλ‘ λͺ¨λΈμ λ°μ΄ν°λ₯Ό μ μ₯νκ³ λ°ννλ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ΄λ€. λͺ¨λΈμ μν μ 보μ μνλ₯Ό λ³κ²½νλ λ©μλλ₯Ό ν¬ν¨νμ§λ§ λ°μ΄ν°κ° μ¬μ©μμκ² μ΄λ€ ννλ‘ λ³΄μ¬μ§λμ§ μμ§ λͺ»νλ€.
- λͺ¨λΈμ λ°λμ μ¬λ¬ μμ κ° μΌκ΄μ±μ μ μ§ν΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ μ¬μ©μλ μΌκ΄μ± μλ μ€λλ λ°μ΄ν°λ₯Ό μ λ¬ λ°λλ€.
- λͺ¨λΈμ μμ ν λ 립μ μ΄λ―λ‘ κ°λ°μλ λ·°μ μκ΄μμ΄ λͺ¨λΈ μ μ§λ³΄μμ μ§μ€ν μ μλ€.
- λ·°λ μ¬μ©μκ° μΈν°νμ΄μ€μμ λ³΄κ² λλ λ°μ΄ν°μ μκ°μ ννμ΄λ€. λ·°λ₯Ό λ 립μ μΌλ‘ μμ±ν μ μμΌλ 볡μ‘ν λ‘μ§μ ν¬ν¨νλ©΄ μλλ€. λͺ¨λ λ‘μ§μ 컨νΈλ‘€λ¬λ λͺ¨λΈμ ν¬ν¨λμ΄μΌ νλ€.
- νΉν μμ¦μ²λΌ λ°μ€ν¬ν±κ³Ό λͺ¨λ°μΌ λ±μ μ¬λ¬ νλ«νΌκ³Ό λ€μν νλ©΄ ν¬κΈ°μ κΈ°κΈ°λ₯Ό λͺ¨λ μ§μνλ €λ©΄ λ·°λ μ΅λν μ μ°ν΄μΌ νλ€.
- λ·°λ λ°μ΄ν°λ² μ΄μ€μ μ§μ ν΅μ νμ§ μκ³ μνλ μ 보λ₯Ό μ»κΈ° μν΄ λͺ¨λΈμ μμ‘΄ν΄μΌ νλ€.
- 컨νΈλ‘€λ¬λ μ΄λ¦μμ μ§μν μ μλ―μ΄ μ¬μ©μμ νλμ μ μ΄νλ€. μ¬μ©μκ° μΈν°νμ΄μ€ λ΄μ νΉμ μμλ₯Ό ν΄λ¦νλ©΄ νλ(ν΄λ¦ λλ ν°μΉ)μ λ°λΌ 컨νΈλ‘€λ¬λ λͺ¨λΈμ νΈμΆν΄ λ°μ΄ν°λ₯Ό μμ± λλ κ°±μ , μμ νλ€.
- 컨νΈλ‘€λ¬λ λ·°μ λ°μ΄ν°λ₯Ό μ λ¬νκ³ λ·°λ ν΄λΉ λ°μ΄ν°λ₯Ό λ λλ§ν΄ μ¬μ©μμκ² λ³΄μ¬μ€λ€.
- 컨νΈλ‘€λ¬λ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ§μ νΈμΆνκ±°λ λ°μ΄ν°λ₯Ό μκ°ννμ§ μλλ€. 컨νΈλ‘€λ¬λ λͺ¨λΈκ³Ό λ·° μ¬μ΄μμ μμ μ μ°©μ μν μ νλ€.
__author__ = 'Chetan'
class Model(object):
services = {
'email': {'number': 1000, 'price': 2,},
'sms': {'number': 1000, 'price': 10,},
'voice': {'number': 1000, 'price': 15,},
}
class View(object):
def list_services(self, services):
for svc in services:
print(svc, ' ')
def list_pricing(self, services):
for svc in services:
print("For" , Model.services[svc]['number'],
svc, "message you pay $",
Model.services[svc]['price'])
class Controller(object):
def __init__(self):
self.model = Model()
self.view = View()
def get_services(self):
services = self.model.services.keys()
return(self.view.list_services(services))
def get_pricing(self):
services = self.model.services.keys()
return(self.view.list_pricing(services))
class Client(object):
controller = Controller()
print("Services Provided:")
controller.get_services()
print("Pricing for Services:")
controller.get_pricing()
class Model(object):
def logic(self):
data = 'Got it!'
print("Model: Crunching data as per business logic")
return data
class View(object):
def update(self, data):
print("View: Updating the view with results: ", data)
class Controller(object):
def __init__(self):
self.model = Model()
self.view = View()
def interface(self):
print("Controller: Relayed the Client asks")
data = self.model.logic()
self.view.update(data)
class Client(object):
print("Client: asks for certain information")
controller = Controller()
controller.interface()
- MVCλ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ λͺ¨λΈκ³Ό λ·°, 컨νΈλ‘€λ¬ μ΄ 3κ°μ ννΈλ‘ λλ μ μλ€. μ΄ κ΅¬μ‘°λ μ μ§λ³΄μκ° μ½κ³ μμ κ°μ λ 립μ±μ΄ λμμ Έ 볡μ‘μ±μ΄ μ€μ΄λ λ€.
- λ°±μλ λ‘μ§μ κ±°μ 건λλ¦¬μ§ μκ³ λ 립μ μΌλ‘ νλ‘ νΈ μλλ₯Ό μμ ν μ μλ€.
- λͺ¨λΈμ΄λ λΉμ¦λμ€ λ‘μ§λ λ§μ°¬κ°μ§λ‘ λ·°μ μκ΄μμ΄ μμ λ μ μλ€.
- 컨νΈλ‘€λ¬ λν λ·°μ λͺ¨λΈκ³Όλ λ 립μ μΌλ‘ μμ λ μ μλ€.
- νλ«νΌ κ°λ°μμ UI κ°λ°μ κ°μ΄ νΉμ λΆμΌμ μ λ¬Έκ°λ€μ΄ λ 립μ μΌλ‘ μΌν μ μλ νκ²½μ μ 곡νλ€.
- MVCλ νλμ ν¨ν΄μΈλ° μ μ»΄νμ΄λ ν¨ν΄μ΄λΌκ³ λΆλ¦¬λκ°?
μ»΄νμ΄λ ν¨ν΄μ λ ν° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬λ¬ ν¨ν΄μ ν©μΉ κ²μ΄λ€. MVC ν¨ν΄μ κ°μ₯ λ§μ΄ μ°μ΄λ μ»΄νμ΄λ ν¨ν΄μ΄λ€. μμ μ μ΄λ©° λ§μ΄ μ°μ΄κΈ° λλ¬Έμ κ°λ³μ μΈ ν¨ν΄μ²λΌ μ·¨κΈλλ€.
MVCμλ μ΄λ€ ν¨ν΄λ€μ΄ ν¬ν¨λμ΄ μλκ°?
- μ΅μ λ²(Observer) ν¨ν΄
Model μ μνκ° λ³κ²½ λμμ λ Controller, νΉμ View μκ² μ΄ μ¬μ€μ μ리λλ° μ¬μ©λλ€.
- μ»΄ν¬μ§νΈ(Composite) ν¨ν΄
View λ₯Ό ꡬμ±νλ μ»΄ν¬λνΈλ€μ κ³μΈ΅ ꡬ쑰λ₯Ό μ΄λ£¬λ€. (e.g. Java Swing μ JFrame/JLabel λ±, Android μ View/ViewGroup, HTML μ DOM)
- μ€νΈλν°μ§(Strategy) ν¨ν΄
Controller μ ν΅μ¬ κΈ°λ₯μ μΈν°νμ΄μ€λ‘ λΆλ¦¬νμ¬ View κ° μ΄ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ Controller λ₯Ό ꡬμ±(Composition) νλ€. κ·Έλ κΈ° λλ¬Έμ View λ Controller λ₯Ό κ°μ λΌμ°λ©° κΈ°λ₯μ λ³κ²½ν μ μλ€.
- λν, νμμ λ°λΌ μ΄λν°(Adapter) ν¨ν΄ μ ν¨κ» μ¬μ©ν μλ μλ€.
μΆμ² : Sungho's Blog
- MVC μΉμ¬μ΄νΈμμλ§ μ°μ΄λκ°?
κ·Έλ μ§ μλ€. μΉμ¬μ΄νΈκ° MVCλ₯Ό μ€λͺ νκΈ° κ°μ₯ μ’μ μλ€. MVC ν¨ν΄μ GUIκΈ°λ° μ ν리μΌμ΄μ μ΄λ νλ‘κ·Έλ¨ λ΄ μμ κ°μ λμ λ 립μ±μ΄ μꡬλλ κ²½μ° μ ν©νλ€. λΈλ‘κ·Έλ μν λ°μ΄ν°λ² μ΄μ€ μ ν리μΌμ΄μ , λΉλμ€ μ€νΈλ¦¬λ° μ ν리μΌμ΄μ λ±μ΄ MVCκ° μ ν©ν μ νμ μΈ μλ€. νμ§λ§ MVCκ° μ무리 μ’λ€ ν΄λ λλ© νμ΄μ§λ λ§μΌν μ½ν μΈ , λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ λ±μ μ°λ κ²μ μ ν©νμ§ μλ€.
- μ¬λ¬ κ°μ λ·°μ λͺ¨λΈμ μ¬μ©ν΄λ λλκ°?
λ¬Όλ‘ μ΄λ€. μ¬λ¬ λͺ¨λΈμμ λ°μ΄ν°λ₯Ό μμ§ν΄ ν κ°μ λ·°μ 보μ¬μ€μΌ νλ κ²½μ°κ° μμ£Ό μλ€. μμ¦ μΉ μ΄ν리μΌμ΄μ μμλ μΌλμΌ λ§€νμ μ°λ κ²½μ°κ° νμΉ μλ€.