이벤트드리븐프로그래밍과 MVC의 차이??
3학년 학생입니다. 과제로 "이벤트드리븐프로그래밍(EDP)과 MVC의 차이점을 조사" 하는 레포트를 작성해야 합니다.
위의 주제를 보시고 저랑 같은 생각을 하시는 분이 있을지 모르겠지만
저는 EDP와 MVC가 비교가 가능한 대상인지 궁금했습니다.
EDP는 이벤트에 반응하여 로직을 선택하는 Windows의 프로그래밍 모델이고,
MVC는 데이터(Model)와 화면(View, 꼭 그래픽일 필요는 없지만 아무튼 모델을 해석하는 방식)을 분리해 내서 객체간의 응집도를 줄이기 위한 디자인패턴.
저는 위와같이 이해하고 있습니다. Windows GUI 프로그래밍을 가정할때 MVC를 적용했다고 한들 EDP를 벗어나는 게 아니지 않습니까?
절차 중심형(?)(도스), 이벤트 중심형(윈도우) 의 비교라면 뭐랄까 변인이 통제돼 있어 레포트를 쉽게 작성하겠지만 뭔가 애매해서
아래와 같이 교수님께 메일로 질문을 드렸습니다.
안녕하세요. 윈도우즈 프로그래밍 수업듣는 학생입니다. MVC vs EDP 레포트 관련 질문이 있어서 메일 드립니다. EDP가 프로그래밍 기법으로 존재하거나, EDP는 MVC가 적용되기 이전까지를
규정한다면 얘기가 달라지겠지만 저는 Windows GUI 프로그래밍에서 MVC를 사용할지 EDP를 사용할지 결정하는 일은 없는 것으로 이해하고 있습니다. MVC를 사용한다고 해도 이벤트 드리븐 방식을 이용하기 때문에 그리 생각하고 있는 것이죠. 그렇게 이해하고 레포트를 이벤트드리븐이라는 개념만으로 프로그래밍을 했을때와는 달리 MVC를 사용해서 모델과 뷰를 분리했을때 생기는 장점을 차이로 설명하면 교수님이 요구하신 내용이 맞는지 질문드립니다. 제가 잘못알고 있다면 지적 부탁드립니다.
받은 답변은 :
레포트는 프로그래밍 방법론에 대해서가 아니라 프로그래밍 모델에 관한 것입니다. EDP가 프로그래밍 방법론이 아닌 UI 설계를 위한 모델이라는 점에서 출발하기 바랍니다. EDP와 MVC 가운데 하나를 선택하는 문제도 레포트에서 요구한 적 없습니다.(이 부분은 제가 예를 든것을 오해하신것 같습니다.) 단지 차이점을 묻고 있는 것입니다. 로우레벨 Windows API의 직접적인 사용에서 MFC, ATL, .NET으로 대표되는 하이레벨 프레임워크로 진행하는데 있어서 프로그래밍 모델이 어떻게 적용되는지 학생들에게 질문하는 것입니다. 즉, EDP는 MVC의 부분집합으로 생각할 수 있고, 더 정확히는 객체간의 통신을 제어(!!!)할 수 있는 MVC 모델에 관한 일반론을 학생들이 조사해보고 왜 제어라는 측면이 중요한지를 이해하는 것이 레포트의 목적입니다. 나아가서 보다나은 방법론을 제시한다면 정말 좋은 레포트가 될 수 있겠죠. 덧붙여서 모델과 뷰를 분리했을 때의 장점(?)은 레포트의 소주제 정도에 해당할지 몰라도 메인 주제로는 적합하지 않습니다. 오히려 제어라는 측면을 충분히 고려하지 않은 분리가 가져오는 혼란에 대해서 풀어나간다면 흥미로울 수 있을 듯 하네요. MVC의 세가지 요소, Model, View, Controller 가운데 Controller를 이해하는 것이 레포트의 목적입니다.
이렇습니다.
답변을 읽어보니 MVC가 디자인패턴으로써의 의미가 아닌, 프레임워크로 해석이 되는것 같았습니다 그래서 원래 레포트 게시물을 읽어보니 "MVC의 구현으로 MFC, WTL, .NET" 이라는 설명도 포함되어 있더군요.
http://kldp.org/files/report.jpg
패턴의 의미로면 WTL는 잘 모르겠고 .NET은 ASP.NET에 MVC패턴이 적용된 부분, MFC에서는 DOC/VIEW 가 이상하게나마 MVC의 구현이다로 이해하고 있었는데 말이죠
그래서 다시 질문을 했습니다
다시 질문 :
MVC가 디자인패턴에서 말하는 MVC의미가 맞나요? 레포트 게시물에 "MFC, WTL, .NET이 MVC의 구현에 해당한다" 는 부분이 있었어 질문드립니다. MFC 에서 MVC 구현이라면 Doc/View 가 비슷하게나마 그 부분이겠고 .NET 에서는 ASP.NET 모델 말고 윈폼에서 별도로 제공되는 MVC 모델이 없는 것으로 이해하고 있는데 MVC가 다른 의미인가요?
다시받은 답변은 :
Wikipedia에서 MVC를 찾아보면 나오는 말입니다.
"MVC is often thought of as a software design pattern. However, MVC encompasses more of the architecture of an application"
디자인 패턴을 좋아하는 이론가들은 무엇이든 패턴으로 추상화하려 하지만, MVC는 아키텍처의 종류로 이해하는 것이 좋다고 생각합니다. MVC에서 중요한 것은 model과 view로 나누는 패턴이 아니라, 이러한 model과 view를 제어하는 controller의 기능입니다. 레포트에서 원하는 것도 controller의 역할이 소프트웨어 아키텍처에 미치는 영향이지, model과 view를 어떻게 나눌까 하는 문제는 아닙니다. Controller의 기능에 대해 학생들이 충분히 이해하기를 바랬기 때문에 일부러 EDP와의 비교를 레포트 제목으로 했습니다. MFC의 경우는 controller와 view의 역할분담이 명확치 않기 때문에(MS는 강력하게 결합되었다고 설명합니다 ^.^) 가지는 단점이 많습니다. 오히려 QT같은 프레임워크가 좋은 MVC의 예제가 아닐까 생각합니다. .NET의 경우 아키텍처라는 관점으로 살펴보면 MVC가 어떻게 적용됐는지 알 수 있을 것 같네요. 다시한번 강조하지만 model과 view의 분리가 레포트의 주제가 아닙니다(괜히 레포트에 2주 시간을 준 것이 아닙니다 ㅜ.ㅜ). 우리 수업 주제와 관련해서 소프트웨어 아키텍처에서 controller의 역할이 레포트의 주제입니다. 많은 사례를 참고해서 정확히 이해했으면 하는 바램입니다.
이렇습니다. 확실히 MVC를 패턴으로써의 MVC가 아닌 아키텍쳐로의 MVC라고 구분지어 설명해 주셨군요.
결국 아키텍쳐로의 MVC로 설명을 시작해야 할 듯 한데 위키위키의 문장도 아키텍쳐로의 MVC가 어떤 범주를 설명하는 것인지 잘 모르겠습니다. 답변도 오히려 패턴으로의 MVC설명만 받은듯 하구요. MVC의 주요핵심이 데이타와 디자인을 분리하는 것으로 공부한 저는 그것이 별로 중요하지 않은 개념으로 설명되고 controller 가 핵심이라는 내용까지 읽게되니 혼란스럽기만 하군요. 요점을 짚어주시면 감사하겠습니다. 혹시 UI 컨트롤이 view, 해당구현이 model, -MFC에서- 메세지맵이 controller 인건가요?;;
첨부 | 파일 크기 |
---|---|
report.jpg | 50.63 KB |
해석하기 나름이겠지만...
사실, GUI프로그래밍을 하다보면, 이벤트드리븐방식의 프로그래밍이냐, MVC모델의 프로그래밍이냐의 차이는 아주
근소하다고 보여집니다. 다른류의 프로그래밍에서는 두개가 전혀 다르게 해석되겠지만, 적어도 GUI에 한해서
얘기를 한다고 한정을 하고 얘기를 좀 해보겠습니다.
Win32 API를 사용하거나 MFC를 사용하여 MS-Windows의 App를 개발하는건 아무래도 정확한 제 분야는 아니므로,
일단 pass하겠습니다. 저보다 더 정통한 전문가들이 답을 달아주겠지요.
GTK+를 사용하여 GUI App를 작성한다고 할때에 한해서는 이벤트 드리븐방식의 개발이냐, MVC모델의 개발방식이냐는
결국 추상화 레이어의 방식에 따라 달라진다고 생각합니다.
예를 들어, GTK+의 콘테이너를 사용하여 Widget을 코드상에서 생성하게 하는 순간 EDP외에는 사실상 방법이 없습니다.
아무리 MVC모델로 가고싶다고 해도 코드안에서 VIEW전체를 코딩해 내야하고, VIEW의 일부분이 바뀌더라도 다시
컴파일을 해야지만 적용이 되기 때문에 VIEW부분을 아무리 잘 추상화를 하여 Control과 연계하였다고 하여도 결코
완전한 모습의 MVC가 될수가 없습니다.
그러나, 만약 Glade와 libglade라는 놈을 사용하여 GTK+ App를 작성하였을경우, DB쪽의 모델부분을 추상화를 잘 하게되면,
Model과 View연결하는 Control부분은 분명 EDP겠지만, MVC모델을 유지할 수 있게됩니다.
예를 들자면 다음과 같은경우 Control부분은 분명 EDP로 구현되었지만, 전체적인 모습은 MVC모델이 됩니다.
GUI Interface는 Glade-2를 사용하여 작성합니다.
Control부분에서 libglade를 사용하여 Interface부분을 xml로 읽어들여 재구성합니다.
읽어들인 Widget에 Signal을 연결하여 이벤트에 대한 반응을 구현합니다. 이벤트에 대한 데이타의 흐름(Control)을
DF(Data flow)에 맞추어 Model과 연결합니다.
Model은 완전히 독립적으로(Middle ware - DB Server) 작성되어 있습니다.
결론은 EDP는 어디까지나 구현을 하기위한 방법이지, EDP와 MVC모델이 절대적으로 배격되는것이 아니라는것이죠.
결국, 위의 예제가 디자인패턴에서 말하는 MVC가 아닌, 아키텍쳐(구조적인)로서의 MVC모델의 설명이 되지 않을까
생각합니다.
조금이나마 도움이 되셨을지 모르겠군요.
時日也放聲大哭
단순히 생각하자면...
이바닥 전공이 아니라서 잘은 모르겠습니다만,
단순하게 생각해서, MVC는 모델이고, EDP는 모델을 구성하는 객체간 connection pattern으로 이해해도 되지 않을까 싶습니다.
observer 패턴이나 mediator 패턴이 controller가 model과 view를 제어 하거나 view 내에서 wiget들을 제어하는 방법론으로 쓰일 수 있습니다.
이는, 객체간 결합이 EDP를 통해 weak connection을 맺을 수 있고, weak connection을 통한 oop 실현이 가능함을 의미할 것입니다.
(strong connection이 주는 폐해에 대해서는 shyblue님의 글에 설명되어 있으므로, 설명하지 않겠습니다.)
이런 관점에서 MVC 모델은 EDP를 통해 OOP를 실현할 수 있다는 결론이 되겠죠.
아는게 짧아서인지 글도 짧게밖에 못쓰겠네요.
MFC
MFC에서는 MVC모델을 디자인 패턴으로 보았을때 정확하게 적용되지 않습니다.
MFC로 작성된 어플리케이션에서 Model은 CDocument 클래스, View은 CView 클래스로 볼수는 있지만 Controller는 어플리케이션내에 따로 존재하지 않습니다. 어플리케이션 내부에서 정의된 메시지맵을 바탕으로 외부에 존재하는 메시지 큐에서 정의된 함수를 호출함으로써 어플리케이션의 Model과 View가 상호작용하는 구조입니다. 굳이 컨트롤러를 따지자면 좁게 보면 메시지 큐 자체를 컨트롤러로 볼 수도 있겠고 더 넓게 보면 윈도우즈 자체를 컨트롤러로 볼 수도 있겠습니다.
즉 메시지맵은 컨트롤러가 아니며 모델과 뷰가 상호작용하는데 필요한 정보입니다. 즉 윈도우즈의 MFC 어플리케이션 레벨에서는 완전한 MVC구조를 이루지 않습니다. 물론 컨트롤러 클래스를 어플리케이션 내부에서 따로 작성할 수도 있겠지만, 그런 방법은 복잡성을 떠나 윈도우즈가 EDP로 설계되어 있는 잇점을 배제하는 격이므로 사용되지 않습니다.
이 때문에 MFC 어플리케이션 내부에서는 모델과 뷰가 직접 커뮤니케이션 할 수 없기 때문에 실질적으로 MFC에서 프로그래밍할때는 모델은 뷰를, 뷰는 모델의 객체를 상호 참조해야 하며 참조시 포인터 변수나 메소드(GetDocument()같은...)를 사용합니다.
덧붙여 Event-Driven Programming은 프로그래밍 방법론이 맞습니다. EDP와 MVC는 어느 한쪽이 부분집합인 관계가 아닙니다. 참조하신 Wikipedia에서도 EDP와 MVC는 프로그래밍 방법론으로 분류되어 있습니다.
http://en.wikipedia.org/wiki/Category:Programming_paradigms
EDP와 MVC는 서로 다른 패러다임이며 상호보완적인 관계이므로 EDP위에서 MVC를, MVC위에서 EDP가 어떻게 적용되는지를 논하는 것은 의미가 없다고 생각합니다.
나는 생각하는 갈대다?
나는 생각하는 갈대다?
Java
확실치는 않지만 java에서 MVC를 사용합니다.
근데 정확히 Model, View, Controller를 구분하지 않고
Model과 View(Controller) 두가지만 따릅니다.
MFC도 마찬가지 일것 같습니다. View와 Document만 있지요.
음..그리고 좀 생각해보면 EVDP하고 MVC하고 그리 관련이 없을것 같아요.
결론은 MVC에서 controller를 어떤것으로 구현하는냐가 문제인것 같군요.
View/Controller와 Model간 message를 어떻게 할것인가 하는.
EVDP를 쓰면 꼭 MVC framework을 써야하는것도 아니고,
그 반대도 아닌것 같습니다.
도움이 되시길..
댓글 달기