처음 MVC 패턴을 공부하게 되면서 잘 이해하지 못한 상태로 1단계 코드를 제출한 것 같다. 객체가 핵심적인 비지니스 로직을 담당해야 한다 라는 부분을 간과하고 모든 도메인 모델에 대한 로직을 모두 Controller로 넘겼다. 하지만 MVC는 그렇게 분리되는 것이 아니었다.

이 부분에 대해 리뷰어에게 질문을 했더니 좋은 소스와 함께 정성스럽게 답해주셨다.

즉, Controller는 도메인 모델과 View를 연결한다 인데 Controller는 View로 부터 받은 입력을 기반으로 Model에 적절한 메세지를 보낸다. 그리고, Model은 해당 메시지에 따른 로직을 수행하고, 그에 따른 결과를 다시 Controller에 전달한다. 이렇게 왔다갔다 상호작용 하는 중간다리 역할이 Controller이다. 모든 서비스 로직을 Controller에다가만 구현하는 것이 아니다.

우테코에서 제공한 MVC 패턴에 대한 설명에도 핵심적인 설명이 있다. 핵심 비지니스 로직을 가지는 객체를 domain 패키지로 리뷰어도 이것만 챙겨도 절반 이상이 MVC 패턴에 맞추어 진다고 한다.

공부하기에 좋은 자료로 추천한 위키피디아와, 모델-뷰-컨트롤러 도 한번 살펴보자.

MVC 패턴이란 무엇인가?

위키피디아에 나온 정의에 따르면 다음과 같다.

MVC에서 모델은 어플리케이션의 정보(데이터)를 나타내며, 
뷰는 텍스트, 체크박스 항목 등과 같은 상요자 인터페이스 요소를 나타내고, 
컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다. 

이때 나오는 질문이 각각의 역할이 뭐지? 컨트롤러의 역할은 어디까지인가? 이다. 하나씩 간단히 살펴보자

모델(Model)

데이터를 가진 객체이다. 내부 상태에 대한 정보이거나, 모델을 표현하는 이름 속성을 가질 수 있다.
모델이 가지고 있는 규칙은 다음과 같다.

  1. 사용자가 편집하기를 원하는 모든 데이터를 가지고 있다.
  2. View나 Controller에 대한 어떤 정보도 알지 말아야 한다.
  3. 변경이 일어나면 변경에 대한 통지를 해야한다.

모델은 무엇을 할 것인지 정의한다. 내부 비지니스 로직을 처리하기 위한 역할을 담당한다.

  • 처리도는 알고리즘, DB와 상호작용, 데이터 등등

뷰(View)

화면에 표시되는 글자, 체크박스, 윈도우와 같은 UI 시작적 요소들이다.
뷰가 가지고 있는 규칙은 다음과 같다.

  1. 모델이 가지고 있는 정보를 따로 저장하지 않는다.
  2. 모델이나 컨트롤러와 같은 다른 구성 요소를 몰라야 한다.
    • 자기 자신을 빼고는 참조하거나 동작하는지 알아서는 안된다.
    • 뷰는 데이터를 받으면 화면에 표시해주는 역할만 가진다고 본다.
  3. 변경이 일어났을 때, 변경 통지에 대한 처리 방법이 있어야 한다.
    • 모델과 유사하다.
    • 사용자가 화면에 표시된 내용을 변경하게 되면, 이것을 모델에 전달하여 모델을 변경해야 한다.

즉, 모델이나 뷰에서 변경이 일어나면, 컨트롤러에 이것을 알리고, 컨트롤러가 처리 방법을 결정해 다른 구성 요소들에게 또 알리는 방식으로 중재자 역할을 하도록 한다. 뷰는 무엇을 보여주기 위한 역할을 하는 것이다. 컨트롤러의 하위에 종속되어서 모델이나 컨트롤러가 보여주려고 하는 필요한 것들을 보여줄 것이다.

컨트롤러(Controller)

모델과 뷰를 연결해주는 역할을 한다.

  1. 모델이나 뷰에 대해서 알고 있다.
  2. 모델이나 뷰의 변경을 모니터링 한다.

컨트롤러는 모델이 어떻게 처리할지 알려주는 역할을 할 것이다. 즉, 화면의 로직처리 부분이라고 할 수 있다. 화면에서 사용자의 요청을 받아서 처리되는 부분을 구현하고, 요청 내용을 분석해서 모델과 뷰에 업데이트 요청을 하게 된다.

컨트롤러는 모델과 뷰가 각각 무엇을 해야 할 지를 알아서 통제한다. 때문에 비지니스 로직을 처리하는 모델과 뷰는 서로 직접 이야기할 수 없다.

MVC에서 발생할 수 있는 문제점

우선 지금 당장 MVC 패턴으로 구현을 할 때는 지나치게 복잡한 정도로 구현을 하지는 않지만 훨씬 복잡한 어플리케이션이 작성이 된다면 다수의 뷰와 다수의 모델이 컨트롤러에 연결되어 있는 상황이 생길 수 있다. 그러면서 소스 코드 테스트나 분석이 어려워지는 Massive ViewController 탄생하게 되면서 문제가 발생한다.

이러한 문제를 해결하기 위한 다른 다수의 패턴이 있다는 것을 기억하자.