2012. 1. 1. 04:00

MVC패턴에 대한 글은 조금만 검색해도 많이 나옵니다.

그렇기 때문에 MVC패턴 자체에 관한 설명은 하지 않겠습니다.

(참고 : 안드로이드님 블로그 - MVC패턴 이해하기(소리 주의!))

 

이게 많이 쓴다는 것과 어떻게 동작하는지는 알고 있지만 갑자기 설명하라고 하면 여전히 잘 말하질 못합니다 ㅡ.-;;;

아마도 인식하지 않고 써서 그런듯합니다.

그래서 가볍게 c++로 만들어 보면 더 기억에 남지 않을까 해서 한번 정리해 봅니다.

 

디자인 패턴에 가장 기본이 되는 MVC패턴은 기본적으로 모든 활동을 컨트롤러가 통제합니다.

비주얼 프로그래밍툴에서는 보통 MVC패턴의 모양을 만들어 줍니다.

비하인드 코드 페이지가 컨트롤러가 되죠.

MVC패턴의 기본 구조

 

 

1. 프로젝트 생성

프로젝트는 콘솔 프로젝트로 만듭니다.

모든 클래스는 위저드를 이용하여 생성합니다.

이 프로젝트의 동작은 입력받은 숫자를 2배 하여 리턴합니다.

 

 

2. 모듈(Model) 생성

모듈은 데이터를 직접적으로 가지고 있는 역활을 합니다.

데이터의 기본적인 가공을 하기도 합니다.

#pragma once

class Model
{
private:
	char* m_sData;

public :
	Model();
	~Model();

public:
	char* GetData()
	{
		return m_sData;
	}

	void SetData(char* sData)
	{
		m_sData = sData;
	}
};

 

 

3. 뷰(View) 생성

뷰는 화면에 표시되는 모든 것을 처리합니다.

화면의 표시와 사용자의 응답 에대한 정보를 컨트롤로 넘기는 역활도 합니다.

 

뷰에서 간단한 데이터처리를 하기도 합니다.

천 단위 콤마(,) 같은 처리는 뷰에서 하는 편이 더 효율적이죠.

 

원래 뷰에서는 사용자 반응에 대한 정보를 컨트롤러로 넘겨주기 위해 함수 포인터를 쓰는 것이 좋습니다.

하지만 이 프로젝트에서 사용자 입력은 scanf로도 충분하므로 따로 이벤트를 구현하지는 않습니다.

#pragma once

#include "conio.h"

class View
{
public:
	View(void);
	~View(void);

	void ShowMessage(char *sMessage)
	{
		printf("%s\n", sMessage);
	}

	void ShowInputData(char* sReturn )
	{
		scanf("%s", sReturn);
	}

	void Wait()
	{
		getch();
	}
};

 

 

4. 컨트롤러(Controller) 생성

컨트롤러는 프로그램의 모든 처리를 합니다.

데이터 흐름을 제어한다거나 하는 역할을 합니다.

 

프로그램의 목적에 따라 데이터를 직접 처리하는 로직 등이 포함됩니다.

필요에 따라 컨트롤러는 여러 개가 될 수도 있습니다.

(그래도 일반적으로 메인 컨트롤러는 통합해서 하나만 사용하죠.)

 

비주얼 프로그램 툴들이 일반적으로 폼 단위로 컨트롤을 생성해줍니다.

#pragma once

#include 
#include 

#include "Model.h"
#include "View.h"

class Controller
{
public:
	Model* insModel;
	View* insView;

	Controller(void);
	~Controller(void);

	void Start()
	{
		insModel = new Model();
		insView = new View();

		insView->ShowMessage("--------------아무숫자나 입력하세요------------");
		insView->ShowInputData(insModel->GetData());
	
		insView->ShowMessage("--------------결과------------");
		DataProcessing(insModel->GetData());
		insView->ShowMessage(insModel->GetData());
		insView->ShowMessage("------------------------------");
		insView->Wait();
	}

	void DataProcessing(char* sData)
	{
		int nOneData = 0;

		//입력받은 값을 숫자로 변환한다.
		nOneData = atoi(sData);

		//곱한다
		nOneData = nOneData * 2;

		//리턴해준다.
		sprintf(sData, "%d", nOneData);

	}	
};

 

 

5. 샘플 소스

MVC_Pattern.zip
다운로드

 

 

6. 분석

이 샘플 코드에서는 뷰와 모듈의 상호작용까지도 컨트롤러를 통해 하는 모양새입니다.

하지만 모듈에서 업데이트가 일어나면 모듈이 직접 뷰에 알리기도 하죠.

뷰는 뷰대로 모듈의 데이터를 직접 추출하여 출력하기도 합니다.

 

 

마무리

이것도 제대로 이해하고 썼다고 하기에는....