TOP
class="layout-aside-left paging-number">
본문 바로가기
프로그래밍 및 기타/프로그래밍 용어, 상식 등

[웹개발] MVC(Model-View-Controller) 패턴이란?

by 기록자_Recordian 2024. 8. 15.
728x90
반응형
MVC(Model-View-Controller) 패턴이란?

 

소프트웨어 개발을 하다 보면 복잡한 애플리케이션을 보다 효율적으로 관리하고 유지 보수하기 위해서 구조적인 접근이 필요하다. 그중 가장 널리 알려진 디자인 패턴 중 하나가 바로 MVC 패턴이다.

 

모델-뷰-컨트롤러(model–view–controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다.

 

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

 

이 패턴은 문제를 분리하는 데 도움이 된다. 이 패턴을 사용하면 사용자 요청은 모델 작업을 담당하는 컨트롤러에 라우팅되어 사용자 작업을 수행하고/수행하거나 쿼리 결과를 검색한다. 컨트롤러는 사용자에게 표시할 보기를 선택하고, 보기에 필요한 모델 데이터를 제공한다.

 

MVC 패턴은 대규모 애플리케이션의 복잡성을 줄이고, 개발 효율성을 높이는 데 도움을 준다. 이를 통해 개발자들은 보다 구조적이고 안정적인 애플리케이션을 구축할 수 있다. 


MVC 패턴의 개념(구성요소)


MVC는 Model, View, Controller의 약자로, 애플리케이션을 세 가지 구성 요소로 나누어 관리하는 패턴이다.

출처: 위키백과

  • Model(모델): 애플리케이션의 데이터 구조와 비즈니스 로직을 담당한다. 데이터의 상태 변경이나 저장, 업데이트 등의 작업을 수행한다. 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보한다. 이와 같은 통보를 통해서 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가·제거·수정할 수 있다. 어떤 MVC 구현에서는 통보 대신 뷰나 컨트롤러가 직접 모델의 상태를 읽어 오기도 한다.
  • View(뷰): 사용자에게 보여지는 화면을 담당한다. 모델의 데이터를 기반으로 화면에 출력되며, 사용자로부터 입력을 받는다. 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어 온다.
  • Controller(컨트롤러): 모델과 뷰를 연결하는 중간 다리 역할을 한다. 사용자의 입력을 받아 모델을 업데이트하고, 변경된 데이터를 뷰에 전달한다. 모델에 명령을 보냄으로써 모델의 상태를 변경할 수 있다. (예: 워드 프로세서에서 문서를 편집하는 것) 또, 컨트롤러가 관련된 뷰에 명령을 보냄으로써 모델의 표시 방법을 바꿀 수 있다. (문서를 스크롤하는 것)

이와 같은 명확한 책임의 규정은 복잡성의 측면에서 애플리케이션의 크기를 조정하는 데 도움을 주는데, 작업이 하나만 있는 항목(모델, 보기 또는 컨트롤러)을 좀 더 쉽게 코딩, 디버그 및 테스트할 수 있기 때문이다. 이러한 세 영역 중 두 개 이상에 종속된 코드는 업데이트, 테스트 및 디버깅이 더 어렵다. 예를 들어 사용자 인터페이스 논리는 비즈니스 논리보다 자주 변하는 경향이 있다. 프레젠테이션 코드와 비즈니스 논리가 단일 개체에 결합되면 사용자 인터페이스가 변경될 때마다 비즈니스 논리를 포함하고 있는 개체를 수정해야 한다. 이 때문에 자주 오류가 발생하며 모든 사소한 사용자 인터페이스 변경 시마다 비즈니스 논리를 다시 테스트해야 한다.

보기와 컨트롤러는 모두 모델에 의존한다. 그러나 모델은 보기 및 컨트롤러에 의존하지 않는다. 이것이 바로 분리의 주요 이점 중 하나이며, 이와 같은 분리 덕분에 시각적 표시에 관계없이 모델을 만들고 테스트할 수 있다.


각 구성요소의 책임

출처: Microsoft

모델의 책임
MVC 애플리케이션의 모델은 애플리케이션 및 비즈니스 논리 또는 이를 통해 수행해야 하는 작업의 상태를 나타낸다. 비즈니스 논리는 애플리케이션의 상태를 유지하기 위한 구현 논리와 함께 모델에 캡슐화해야 한다. 강력한 형식의 보기는 일반적으로 해당 보기에 표시할 데이터를 포함하도록 디자인된 ViewModel 형식을 사용한다. 컨트롤러는 모델에서 이러한 ViewModel 인스턴스를 만들고 채운다.

보기의 책임
보기는 사용자 인터페이스를 통해 콘텐츠를 제공할 책임이 있다. 보기는 Razor 보기 엔진을 사용하여 HTML 태그에 .NET 코드를 포함한다. 보기 내부의 논리를 최소화해야 하며, 보기의 모든 논리는 콘텐츠 제공과 관련되어 있어야 한다. 복잡한 모델의 데이터를 표시하기 위해 보기에서 다량의 논리를 수행해야 하는 경우 보기 구성 요소, ViewModel 또는 보기 템플릿을 사용하여 보기를 간소화하는 방안을 고려해야 한다.

컨트롤러의 책임
컨트롤러는 사용자 상호 작용을 처리하고, 모델을 작업하고, 궁극적으로 렌더링할 보기를 선택하는 구성 요소이다. MVC 애플리케이션에서 보기는 정보만 표시한다. 컨트롤러가 사용자 입력 및 상호 작용을 처리하고 응답한다. MVC 패턴에서 컨트롤러는 초기 진입점으로, 작업할 모델과 렌더링할 보기를 선택할 책임이 있다(그 이름처럼 앱이 지정된 요청에 응답하는 방식을 제어).

컨트롤러에 너무 많은 책임을 부여하여 지나치게 복잡하게 만들면 안 된다. 컨트롤러 논리가 너무 복잡해지지 않도록 컨트롤러에서 도메인 모델로 비즈니스 논리를 푸시한다.


MVC 예시

 

간단한 쇼핑 리스트 앱이 있다고 가정할 때, 우리가 원하는 것은 이번 주에 사야할 각 항목의 이름, 개수, 가격의 목록이다. MVC 를 사용해 이 기능의 일부를 구현하는 방법을 간단히 설명하면,

 

◆ 모델
모델은 리스트 항목이 포함해야 하는 데이터 — 품목, 가격, 등. — 와 이미 존재하는 리스트 항목이 무엇인지를 지정한다.


쇼핑 리스트 앱에서, 뷰는 항목이 사용자에게 보여지는 방식을 정의하며, 표시할 데이터를 모델로부터 받는다.

컨트롤러
쇼핑 리스트는 항목을 추가하거나 제거할 수 있게 해주는 입력 폼과 버튼을 갖는다. 이러한 액션들은 모델이 업데이트되는 것이므로, 입력이 컨트롤러에게 전송되고, 모델을 적당하게 처리한 다음, 업데이트된 데이터를 뷰로 전송한다.

단순히 데이터를 다른 형태로 나타내기 위해 뷰를 업데이트하고 싶을 수도 있다(예를 들면, 항목을 알파벳순서로 정렬한다거나, 가격이 낮은 순서 또는 높은 순서로 정렬). 이런 경우에 컨트롤러는 모델을 업데이트할 필요 없이 바로 처리할 수 있다.


MVC 패턴의 장점
  • 유지 보수 용이성: 모델, 뷰, 컨트롤러가 각각 독립적으로 관리되므로, 특정 부분을 수정할 때 다른 부분에 영향을 최소화할 수 있다.
  • 재사용성: 각 컴포넌트가 독립적이기 때문에 다른 프로젝트나 부분에서 재사용할 수 있다.
  • 개발 속도 향상: 개발팀이 각 컴포넌트에 집중할 수 있어, 동시다발적인 개발이 가능해진다.

MVC 패턴의 구현


MVC 패턴은 다양한 프로그래밍 언어와 프레임워크에서 지원되며, 각 언어의 특징에 맞게 구현할 수 있다. 대표적인 프레임워크로는 Ruby on Rails(Ruby), Django(Python), ASP.NET MVC(C#) 등이 있다. 각 프레임워크는 MVC 패턴을 지원하며, 이를 통해 빠른 프로토타이핑과 개발을 가능하게 한다.


[출처: 위키백과, MDN Web Docs, Microsoft]

728x90
반응형