
개발자라면 한번쯤은 들어봤을 단어, MVC 패턴이란 도대체 무엇일까?
먼저, MVC 패턴에 대한 정의부터 알아보자.
MDN Web Docs 용어 사전에 의하면 다음과 같다.
MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다. 이러한 "관심사 분리" 는 더나은 업무의 분리와 향상된 관리를 제공합니다.
쉽게 말하자면, 프로그램 개발을 하기 위한 여러 디자인 패턴중 하나로,
모델, 뷰, 컨트롤러로 이루어진 디자인이라고 볼 수 있다.
여기서 이야기하는 디자인 패턴이란 프로그램을 개발하는 중에 빈번하게 발생하는 과제를 해결하는 방법 중 하나로, 과거에 발견한 설계의 노하우를 재이용하기 좋도록 특정 규약으로 묶어 정리한 것을 의미한다.
즉, 프로그램 개발을 조금 더 편리하게 하기 위한 방법이라고 보아도 무방하다.
먼저 MVC 패턴을 이미지화하면 위와 같이 볼 수 있다. View는 사용자의 입력을 받아 값을 Controller 에게 전달하고 Controller는 Model을 통해 값을 수정한다. Model은 값을 갱신하여 View에게 전달하고 Controller를 통해 사용자에게 보여지는 것이다. 만약 이 순환 구조를 모두 이해했다면 MVC 패턴에 대해 잘 알고 있다 하여도 무방하다. 이제 Model, View, Controller를 하나씩 살펴보자.
모델은 위에서 Controller에게서 값을 전달받아 데이터를 처리한다고 언급하였다. 즉, 프로그램에 존재하는 모든 데이터를 처리한다고 생각하면 이해하기 쉽다. 프로그램을 실행하기 위한 데이터 처리 기능, 변수, 초기화 등등 데이터 가공 및 처리를 담당한다. Model을 디자인 하기 위해 다음과 같은 규칙을 지켜야 한다.
- 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
- 만약 사용자가 게임을 하길 원한다면 게임 캐릭터, 이동 방향, 스킬 목록, 캐릭터 이름 등등 게임을 하기 위해 필요한 모든 데이터를 Model이 가지고 있어야 한다는 의미이다.
- View 나 Controller 에 대한 어떤 정보도 알지 말아야 한다.
- Model을 디자인할 때 View, Controller를 참조하면 안되며 단순히 데이터를 처리, 가공하는데에 집중을 해야한다는 의미이다.
- 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야 한다.
- Model의 속성중, 정보가 변경 되면 이를 알리는 처리 방법을 구현하여 변경이 일어 나는 것에 유연하게 대처해야함을 의미한다.
뷰는 말 그대로 보여주는 요소이다. 사용자의 입력 값을 받고 사용자에게 출력 값을 보여주는 인터페이스를 의미한다. View 또한 디자인하는데 지켜야할 규칙이 존재한다.
- Model이 가지고 있는 정보를 따로 저장해서는 안된다.
- View는 단순히 사용자의 입력값을 Model에게 전달하거나 Model이 전달해준 값을 최종적으로 사용자에게 보여주는 역할만 해야한다.
- Model 이나 Controller와 같이 다른 구성 요소들을 몰라야 한다.
- Model, Controller에 무엇이 있는지, 어떻게 동작하는지 알지 말아야하고 단순히 입출력만을 담당해야 한다.
- 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야만 한다.
- Model과 마찬가지고 View에 대한 정보가 변경되면 이를 처리해야하는 과정을 구현해야 한다.
컨트롤러는 Model과 View를 이어주는 다리와 같은 역할을 한다. 사용자가 데이터를 입력하고 수정, 처리에 대한 이벤트를 처리하는 부분이다.
- Model 이나 View에 대하여 알고 있어야 한다.
- Model 과 View는 서로의 존재를 모르기 때문에 이를 중재해주는 것이다.
- Model 이나 View의 변경에 대해 모니터링 해야 한다.
- Model이나 View의 변경에 대한 통지를 받으면 Controller는 이를 해석하여 각각의 구성요소에 대해 통지를 해야한다.
그렇다면 왜 수많은 디자인 패턴 중에서 MVC Pattern의 사용 빈도수가 높을까?
위와 같은 장점이 나오는 계기에 대한 공통점은 바로 MVC 패턴이 Model, View, Controller로 나누어져 있고 각자의 역할만을 수행하는데 집중되어 있다는 것이다.
그러나 이러한 MVC에 대한 이론적인 부분에 대해 이해하고 있다고 하여도 실제로 사용해보지 않으면 패턴 구조에 대해 실수를 할 가능성이 높다. 따라서 MVC 패턴에 대해 충분히 숙지하려면 프로그램 개발을 많이 해봐야하고 그에 대한 피드백도 많이 받아야 한다.
그렇다면 이러한 MVC 패턴에는 장점만 존재하는 것일까. 당연히 한계점도 존재한다. 다음을 살펴보자.
이러한 문제가 발생하는 경우를 우리는 Massive-View-Controller라고 한다.

위와 같은 한계점을 극복하기 위해 요즘에는 다음과 같은 5개의 레이어로 이루어진 디자인을 사용한다.

MVC 패턴의 View 와 같은 역할을 하는 계층으로, 사용자의 인터페이스를 담당하는 레이어이다.
MVC 패턴의 Controller 와 같은 역할을 하는 계층으로, 아래 계층의 데이터 처리 이벤트를 관리하는 역할을 한다.
Service Layer
Control Layer 와 Persistence Layer를 연결해주는 역할을 하며 대표적으로 클래스간의 관계를 관리해주는 레이어이다.
Domain
데이터의 행위를 갖는 객체이며 핵심 비즈니스 로직을 가진다. 데이터 가공에 필요한 주요한 기능을 가지고 있으므로 테스트 주도 개발을 통하여 짜임 있게 작성해야 한다. Persistence Layer에 맵핑되는 성격을 가지고 있다.
개발자의 편리함을 위해 존재하는 계층이라고 봐도 무방할 정도로 데이터 처리를 보다 쉽게 하기 위해 존재한다. 각종 영속성 프레임워크를 많이 사용한다.
각 계층 사이에서 전달되는 레이어로, 대부분 DTO 패턴을 따른다. DTO 패턴은 Data Transfer Object 의 약자로, 데이터 전송 객체를 의미한다. 즉, 각 계층 사이에서 데이터의 전송을 담당하는 레이어라고 이해하여도 무방하다.
블로그의 첫 글로 어떠한 주제의 기술을 담으면 좋을까 생각하다가 프로그램 개발을 시작할 때 항상 고려해야하는 디자인 패턴에 대해 작성해보면 좋을 것 같아 대표적인 MVC 패턴에 대해 기록을 남겨본다. 앞으로 매일 기록을 남겨 더욱더 완성된 개발자가 되기 위한 지름길을 그려 나아갈 것이다. 생각하고 있는 포스팅 주제로는 객체지향, TDD, 다양한 디자인 패턴, Java 에 대한 고급 이론들 등등 초~중급 개발자가 마스터 개발자로의 길을 걷기 위해 필요한 지식들을 정리할 계획이다.
참고자료