본문 바로가기

카테고리 없음

MVC 패턴

주로 웹을 설계할 때 쓰이는 디자인 패턴 중에 하나인 MVC 패턴에 대해 알고있는 지식들을 정리한다.

먼저, 디자인 패턴이란 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 쉽게 쓸 수 있는 형태로 만든 것을 말한다.

 

MVC

MVC란 Model, View, Controller의 약자로, 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세 가지의 역할로 구분한 패턴이다.

Model : 모델은 어플리케이션이 모델이 무엇을 할 것인지를 정의한다. 내부 비지니스 로직을 처리하기 위한 역할을 합니다.

(e.g.) 처리되는 알고리즘, DB와 상호작용 (CRUD), 데이터 등등..

Controller : 모델이 어떻게 처리할 지를 알려주는 역할을 한다. 모바일에서는 화면의 로직 처리 부분이다. 화면에서 사용자의 요청을 받아 처리되는 부분을 구현하게 되며, 요청 내용을 분석해서 model, view에 업데이트 요청을 받게 된다.

View : 화면에 무엇인가를 보여주기 위한 역할을 한다. 컨트롤러 하위에 종속되어, 모델이나 컨트롤러가 보여주려고 하는 모든 필요한 것들을 보여준다.

 

이를 간략하게 도식화 하면 다음과 같다.

View에서는 Controller에게 영향을 미칠 수 있지만, model에선 영향을 미칠 수 없다.

이렇게 역할을 분리하게 된 이유는 각각의 컴포넌트에게 책임을 지게 하여, 다른 컴포넌트들에게 영향을 미치는 것을 최소화하기 위함이다.

 

그렇다면, 어떠한 책임을 가져야 할까.

Model

1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.

  • 즉, 화면 요소가 표현된다면, 표현되는 텍스트의 내용이나 이미지 등을 가지고 있어야 한다.

2. 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다.

  • 데이터 변경이 일어났을 때, 모델에서 화면 UI를 직접 조정해서 수정할 수 있도록 뷰를 참조하는 내부 속성 값을 가지면 안된다.

3. 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야 한다.

  • 모델의 속성 중 텍스트 정보가 변경된다면, 이벤트를 발생시켜 누군가에게 전달해야 하며, 누군가 모델을 변경하도록 요청하는 이벤트를 보냈을 때 이를 수신할 수 있는 처리 방법을 구현해야 한다. 또한 모델은 재사용 가능해야 하며, 다른 인터페이스에서도 변하지 않아야 한다.

View

1. 모델이 가지고 있는 정보를 따로 저장해서는 안된다.

  • 화면에 글자를 표시하기 위해, 모델이 가지고 있는 정보를 전달받고, 그 정보를 유지하기 위해 임의의 뷰 내부에 저장하면 안된다. 즉, 화면을 그릴 땐 그림에 필요한 정보들만 받고 그 외에는 저장하면 안된다.

2. 모델이나 컨트롤러와 같이 다른 구성요소를 몰라야 된다.

  • 자기 자신을 제외하고, 다른 요소는 참조하거나 어떻게 동작하는지 알아서는 안된다. 데이터를 받으면 화면에 표시해주는 역할만 해야 한다.

3. 변경이 일어나면 변경통지에 대한 처리방법을 구현해야 한다.

  • 변경이 일어났을 때, 변경을 알려줘야 하는 방법을 구현해야 한다. 뷰에서는 화면에서 사용자가 화면에 표시된 내용을 변경하게 되면, 이를 모델에게 전달해서 모델을 변경해야 한다.

Controller

1. 모델이나 뷰에 대해서 알고 있어야 한다.

  • 모델이나 뷰는 서로의 존재를 모르고, 변경을 외부로 알리고, 수신하는 방법만 가지고 있기 때문에 이를 중재하기 위해 컨트롤러가 모델과 그와 관련된 뷰에 대해 알고 있어야 한다.

2. 모델이나 뷰의 변경을 모니터링 해야 한다.

  • 모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성요소에게 통지를 해야 한다.

앞서 각각의 컴포넌트마다 책임을 진다고 이야기하였다. 그렇다면 왜 책임을 지게 하는지 구체적으로 분석해보자.

모델에서 컨트롤러에 대한 로직을 고려하여 데이터를 처리하게 되면, 컨트롤러 입장에서 모델이 어떤 동작을 해야할 지 미리 알고 대응해야 한다. 즉, 결합도가 강해지는 것이다.

이렇게 되면, 컨트롤러에 변화가 일어났을 때 모델도 같이 변해야 하는 상황이 생길 수 있다.

따라서 모델, 뷰, 컨트롤러는 각각의 일에만 묵묵히 수행할 뿐 다른 컴포넌트들에는 신경을 쓰지 않아야 결합도가 느슨해질 수 있다.