MVC 패턴

위키피디아

Model-View-Controller 는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.

MVC 패턴은 소프트웨어를 Model, View, Controller 라는 계층으로 나누는 디자인 패턴입니다. 소프트웨어 전반에 적용될 수 있는 개념이고, 특히 웹 분야에서 적극적으로 채택하여 사용하고 있습니다. 현재 대다수의 백엔드 언어는 MVC 패턴을 기반으로 제공되는 프레임워크가 존재합니다. Java 의 Spring 과 Python 의 Django 가 그 대표적인 예 입니다. 이 아래에서는 각각의 계층이 어떤 일을 하는지에 대해 일반적인 이야기를 한 후, 스프링에서 이 개념이 어떻게 구현됐는지 알아보겠습니다.

Model

데이터비즈니스 로직을 담당하는 계층이 Model입니다. 소프트웨어 내의 변화하는 주요 데이터를 처리하고 관리하며 다른 계층에서 요청이 있다면 데이터를 가공하여 반환합니다. Model은 데이터를 처리하는 역할과 책임을 갖기 때문에, View 계층이나 Controller 계층에서 어떤 일이 일어나는지 알 필요가 없습니다. 그저 데이터 조회 요청이 온다면 데이터를 반환하고, 데이터를 변경하라는 요청이 오면 로직에 맞게 데이터를 변경하여 보관할 뿐입니다.

View

View 는 사용자에게 보여지는 부분을 담당하는 계층입니다. 이런 의미에서 프론트엔드와 가장 연관이 깊은 계층이라고 할 수도 있겠습니다. View는 소프트웨어 내에서 오직 사용자에게 보여줄 페이지를 생성하는데에만 집중합니다. 뷰는 내부 데이터 모델이 유효한 값인지, 이 요청에 이 페이지를 반환하는것이 맞는 로직인지 신경쓰지 않습니다. 오직 자신의 페이지에 전달받은 값들을 잘 배치하여 사용자에게 반환하는 역할만을 갖습니다.

Controller

컨트롤러는 프로그램의 주요 흐름을 담당하는 계층입니다. Controller 는 사용자에게 요청이 들어오면, 요청을 분석하여 어떤 비즈니스 로직이 실행되어야 하고 어떤 뷰를 반환해야하는지 선택합니다. 컨트롤러는 일종의 중간자로서, Model과 View 사이에서 각각 필요한 요청을 하고 반환값을 전달해주는 역할을 합니다.

MVC 특징

UI-Layer 와 Non-UI Layer

View와 Controller 계층을 묶어서 UI Layer, Model은 이와 구분되어 Non-UI Layer라고 표현하기도 합니다. View와 Controller는 사용자 인터페이스와 관련이 깊습니다. 사용자에게 어떤 형태로 정보를 제공할 것인지, 어떤 형태로 user gesture를 전달 받을 것인지 결정합니다. 반면 Model은 사용자 인터페이스와는 분리되어 시스템에서 운영해야하는 비즈니스 도메인과 그 도메인을 처리하는 로직으로 이루어져 있습니다.

MVC간 의존성

Model Layer에서는 View의 코드를 직접 호출하지 않아야하며, 마찬가지로 View Layer에서는 Model의 코드를 직접 호출하지 않아야 합니다. 두 레이어를 분리하면 자주 변하는 영역을 자주 변하지 않는 영역 뒤에 숨기는 Information Hiding의 효과를 얻습니다. 두 계층을 Controller가 중개할 때, 자주 일어나는 View Layer의 코드 변경이 Model에 전파되지 않으며, 하나의 Model 만으로 여러 사용자 인터페이스를 제공할 수 있습니다.

MVC 패턴의 장점

대규모 애플리케이션 생성에서 유리

코드가 세 가지의 구성요소로 역할이 명확하게 분리되어있기 때문에, 대규모 애플리케이션에서 어떤 코드를 어디에다 작성해야할지 그 경계가 명확해지고 새로운 기능을 신속하게 추가할 수 있다.