Post

[Keyword] MVC


Keyword

하루에 하나씩 키워드를 정해 공부해보려고 한다.

일단은 왜 이 키워드를 공부하려고 하는가(why), 그래서 이 키워드가 무엇인가(what), 어떻게 적용해나갈 것인가(how)로 나눠 정리하려고 한다!


Why?

스프링 입문 강의를 들을 때부터 한번 정리하고 넘어가면 좋을 것 같다고 생각했던 개념이었다. 특히나 프로젝트를 진행해보면서 서비스와 컨트롤러의 역할과 책임을 구분하는 것이 어려웠는데, 리펙터링하기 앞서 이 부분을 확실히 정리해두면 좋을 것 같다.

What?

먼저, Mozilla Developer에서는 MVC를 다음곽 같이 설명한다.

MVC(model–view–controller, MVC))는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴이다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있으며, 이러한 “관심사 분리” 는 더 나은 업무의 분리와 향상된 관리를 제공한다. MVC 에 기반을 둔 몇 가지 다른 디자인 패턴으로 MVVM (모델-뷰-뷰모델), MVP (모델-뷰-프리젠터), MVW (모델-뷰-왓에버)가 있다.

위키피디아에서는 MVC를 다음과 같이 설명한다.

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

정리하면 MVC는 애플리케이션의 시각 요소와 비즈니스 로직을 구분해 서로 독립적으로 수행될 수 있도록 하는 소프트웨어 디자인 패턴이다.

용어에서 알 수 있듯, MVC는 다음의 세 가지로 구성되어 있다.

  • 모델(Model): 데이터와 비즈니스 로직을 관리한다. 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보함으로써 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가·제거·수정할 수 있다.

  • 뷰(View): 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어 오며, 레이아웃과 화면을 처리한다. 모델은 여러 개의 뷰(view)를 가질 수 있다.

  • 컨트롤러(Controller): 모델과 뷰로 명령을 전달한다. 모델에 명령을 보내 모델의 상태를 변경할 수 있으며, 뷰에 명령을 보내 모델의 표시 방법을 바꿀 수 있다.

이를 그림으로 나타내면 다음과 같다. image

모델

데이터베이스, 상수, 초기화값, 변수 등의 애플리케이션의 데이터를 나타내고, 이를 가공하는 컴포넌트를 의미한다.

모델은 다음과 같은 규칙을 가지고 있다.

  1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
  2. 뷰나 컨트롤러에 대해서 어떤 정보도 알지 않아야 한다.
  3. 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.

모델은 재사용가능해야 하며 다른 인터페이스에서도 변하지 않아야 한다.

input 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내며, 데이터 및 객체의 입출력을 담당한다. 데이타를 기반으로 사용자들이 볼 수 있는 화면을 의미한다.

뷰는 다음과 같은 규칙들이 있다.

  1. 모델이 가지고 있는 정보를 따로 저장해서는 안 된다.
  2. 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 된다.
  3. 변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.

컨트롤러

데이터와 사용자인터페이스 요소들을 잇는 다리 역할을 한며, 사용자가 데이터를 클릭하고, 수정하는 것과 같은 “이벤트”들을 처리하는 부분을 뜻한다.

컨트롤러 또한 다음과 같은 규칙이 있다.

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

모델이나 뷰는 서로의 존재를 모르고, 변경을 외부로 알리고 수신하는 방법만 가지고 있는데, 컨트롤러는 이를 중재하기 위해 모델과 그에 관련된 뷰에 대해서 알고 있어야 한다.

Reference [개발자 면접준비]#1. MVC패턴이란

++ MVC의 자세한 작동원리와 한계점 - MVC 패턴이란?

How?

다시 처음 질문으로 돌아가 왜 MVC를 사용해야 하는가 묻는다면 유지보수성 때문이라고 할 수 있다. 코드를 기능별로 분리해두면 가독성이 좋을 뿐만 아니라 기능에 변경이나 확장이 발생하는 경우에도 변화가 미치는 영향을 최소화할 수 있다.

이는 객사오에서도 수차례 강조했던 부분이며, 현재 내가 프로젝트에서 간과해 꽤나 고생을 하고 있는 부분이기도 하다. 설계하는 단계에서 MVC 패턴을 고려해 기능별로 명확히 분리하려는 연습을 더 많이 해봐야겠다!

This post is licensed under CC BY 4.0 by the author.