IT/Computer Science

MVC 디자인 패턴

프티 2021. 11. 15. 16:15
반응형

MVC 패턴이란?

Model, View, Controller 즉 MVC는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다.

 

이 패턴은 사용자 인터페이스로부터 비즈니스 로직을 분리하여,

애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다.

비즈니스 로직이란?

회원 가입을 예로 들어보자.

아이디 중복 검사를 해야 할 때 크게 두 영역으로 나눌 수 있다.

 

하나는 중복 아이디가 있는지 없는지를 검사하기 위한 일련의 과정

또 다른 하나는 유저에게 단순히 텍스트나 다이얼로그로 알려주는 것이 있다.

 

두 번째 영역은 View 영역 또는 Presentation 영역이라고 불리는데,

가공된 데이터를 단순히 표시만 해주는 것이다.

 

데이터 가공을 담당하는 것이 첫 번째 영역이며, Logic 영역, Model 영역이라고 부른다.

여기서 모델 영역에서의 코드를 비즈니스 로직이라고 부른다.


MVC 패턴은 프로그래밍을 할 때 전체적인 구조에 관련된 여러 디자인 패턴 중 하나이며, 비즈니스 (도메인) 로직과 UI 로직을 분리하여 유지보수를 독립적으로 수행할 수 있게 하는 장점이 있다.

M( model, domain)

Model이란 프로그램이 작업하는 세계관의 요소들을 개념적으로 정의한 것이라고 볼 수 있다.

 

무인 포스기를 예시로 들면, 무인 포스기가 정상적으로 목표하는 작업을 수행하기 위해서는 우선 메뉴가 있어야 하고, 메뉴를 담을 수 있는 장바구니, 해당 메뉴의 수량, 결제수단, 할인 정책 등등이 필요할 것이다.

 

이처럼 프로그램이 목표하는 작업을 원활하게 수행하기 위해 필요한 물리적 개체, 규칙, 작업등의 요소들을 구분되는 역할로써 정의해놓은게 model이 된다.

 

model을 잘 설계하는 것은, 해당 도메인 세계를 얼마만큼 이해하고 있는지와도 밀접한 연관이 있다. 꼭 물리적인 요소뿐만 아니라 추상적인 요소 또한 해당 작업을 수행하는데 특정 책임과 역할로서 구분될 수 있다면 최대한 구체적이고 작은 entity를 유지하면서 model을 설계하는 것이 중요하다.

 

entity란?

  • 데이터의 집합을 의미한다.
  • 저장되고, 관리되어야하는 데이터이다.
  • 개념, 장소, 사건 등을 가리킨다.
  • 유형 또는 무형의 대상을 가리킨다.

V(view)

사용자가 보는 화면에 입출력 과정 및 결과를 보여주기 위한 역할을 한다. 입출력의 순서나 데이터 양식은 컨트롤러에 종속되어 결정되고, 도메인 모델의 상태를 변환하거나, 받아서 렌더링 하는 역할을 한다.

 

view를 구현할 때 주의할 점은 도메인 로직의 어떤 것도 알고 있으면 안된다는 것이다. 절대적으로 객체를 전달받아 상태를 바로 출력하는 역할만을 담당해야 한다. 그렇기 때문에 view에서는 도메인 객체의 상태를 따로 저장하고 관리하는 클래스 변수 혹은 인스턴스 변수가 있을 필요가 없다.

 

C(controller)

model과 view를 연결 시켜주는 다리 역할을 함과 동시에 도메인 객체들의 조합을 통해 프로그램의 작동 순서나 방식을 제어한다. controller는 view와 model이 각각 어떤 역할과 책임이 있는지 알고 있어야 한다.

 

Controller는 하나만 만들어야 하는가?

MVC의 뷰는 여러 개의 컨트롤러를 가지고 있다. 사용자는 컨트롤러를 사용하여 모델의 상태를 바꾼다. 컨트롤러의 모델의 mutator 함수를 호출하여 상태를 바꾼다. 이때 모델의 상태가 바뀌면 모델은 등록된 뷰에 자신의 상태가 바뀌었다는 것을 알리고 뷰는 거기에 맞게 사용자에게 모델의 상태를 보여준다.

 

controller는 하나일 필요가 없다. 프로그램이 실행될 때 로직이 병렬적으로 분기된다면 controller를 여러 개 두어도 상관없다.

반응형

'IT > Computer Science' 카테고리의 다른 글

[자료구조] linked list와 array의 차이  (0) 2021.11.14
자료구조 - Graph  (0) 2021.11.12
Hash - 오버플로우 처리 방법  (0) 2021.11.12
자료구조 - Hash  (0) 2021.11.12
Doubliy Linked List  (0) 2021.11.11