MVC 패턴

사요·2023년 11월 12일

MVC 패턴이란?

  • MVC 는 Model, View, Controller의 약자 입니다. 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 세가지의 역할로 구분한 패턴이다.
  • MVC 에 기반을 둔 몇 가지 다른 디자인 패턴으로 MVVM (모델-뷰-뷰모델), MVP (모델-뷰-프리젠터), MVW (모델-뷰-왓에버)도 있다.
  • 유지보수의 편의성을 위해 개발 초반부터 준수해야할 규칙들을 정하게 되고 계속해서 반복적으로 사용되는 규칙들은 나중에 패턴이 된다. MVC 패턴도 그 중 하나에 해당한다.

MVC 패턴의 본질

뷰와 도메인(비즈니스 로직)의 분리

  • "어떻게 나눌 것인가"에 대한 해답 중 하나
  • 비지니스 처리 로직과 사용자 인터페이스 요소들을 분리

  • 자주 변경되는 View로부터 Model에 영향을 주지 않도록 한다.

MVC 패턴을 사용해야하는 이유

  • 각각 맡은 역할에만 집중 -> 유지보수성, 확장성, 유연성 증가

구성요소

  1. 모델: 데이터와 비즈니스 로직을 관리합니다.
  2. 뷰: 레이아웃과 화면을 처리합니다.
  3. 컨트롤러: 모델과 뷰를 중계합니다.

모델

애플리케이션의 정보(데이터)

  • 데이터와 비지니스 로직을 담당한다. 컨트롤러의 요청에 의해 원하는 값을 제공한다.
  • 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
  • 데이터를 조작하는 함수를 포함할 수 있다.
  • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.

데이터를 받으면 화면에 표시해주는 역할

  • 모델이 가지고 있는 정보를 따로 저장해서는 안된다.

컨트롤러

모델과 뷰를 잇는 다리 역할, 데이터와 비즈니스 로직 사이 상호동작을 관리

  • 화면에서 사용자의 요청을 받아서 처리되는 부분을 구현
  • 모델에 명령을 보냄으로써 모델의 상태를 변경할 수 있다.
  • 사용자에게 받은 입력 값을 통해 모델의 상태를 변경하고,

MVC 패턴 실전 규칙

Model 은 Controller 와 View 에 의존하지 않는다.

= 모델 내부에 Controller,View 관련된 코드가 있으면 안된다.

View 는 Model 에만 의존해야 하고, Controller 에는 의존하지 않는다.

= 뷰 내부에 모델코드만 있고, 컨트롤러 코드는 없어야 함.

View 가 Model 로부터 데이터를 받을 때에는, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받는다.

즉, 뷰는 사용자로부터 공통으로 보여줘야 하는 부분(뷰가 자체적으로 가지고 있어할 정보들) + 개별화된 부분

  • 잘못된 예시
class Car{

\# static string ONE_STEP ="-";

	public Result move(){
      ...
      OutputView.printResult(ONE_STEP);
      return result;
      
    }
}

ONE_STEP은 자동차가 전진정보를 표시할 마크 정보를 담는다.
ex) car: ------
이는 모든 자동차 공통에 해당하므로 View 로 전달할 필요가 없다. 뷰가 자체적으로 정보를 가지고 있으면 된다.

Controller는 Model과 View에 의존한다.

Controller 내부에는 Model과 View에 관련한 코드가 있어도 된다.

View가 Model 로부터 데이터를 받을 때, 반드시 Controller 에서 받도록 한다.

View 내부에서 Model 을 불러와서 보여주는 것이 아니라,
다음과 같이 컨트롤러 내부에서 모델 데이터를 불러와서 outputView 에 전달한다.
View 는 데이터를 받아서 보여주는 역할만 수행할 수 있도록 한다.

  • controller
 async handleBuyLottos() {
    const money = await InputView.readMoney();
    this.#customer = new Customer(money);
    this.#customer.buyLottos();
    OutputView.printLottos(this.#customer.getLottos());
  }

기타 궁금증

Q. 모델의 데이터를 보기 좋은 형태로 가공하는 것(ex. 소숫점 이하 둘째자리)은 누구의 역할인가?
A. View 의 역할이라고 생각한다.

Q. 데이터에 대한 유효성 검증은 어디에서 진행하나?

  • Model 에서만
  • Model 과 View 둘다
profile
하루하루 나아가는 새싹 개발자 🌱

0개의 댓글