노트

MVC·MVP·MVVM

MVC, MVP, and MVVM

설계#architecture#pattern · 연결된 개념 8개

쉽게 말하면

MVC·MVP·MVVM은 데이터와 화면을 나눠 두고, 그 사이를 누가 잇느냐로 갈리는 설계예요. 창고와 진열대 사이에 직원이 물건을 직접 채우는지, 진열대가 창고와 자동으로 맞춰지는지의 차이와 비슷해요.

비유가 깨지는 곳 실제 차이는 역할 이름보다 계층 간 의존 방향과 결합 정도에 있어요. 그리고 React는 이 중 어느 것도 아닌, 데이터가 단방향으로 흐르는 뷰 렌더링 라이브러리예요.

MVC(Model-View-Controller)·MVP(Model-View-Presenter)·MVVM(Model-View-ViewModel)은 UI 애플리케이션을 데이터(Model)와 화면(View)으로 나누고, 둘 사이를 무엇이 어떻게 잇느냐로 구분되는 아키텍처 패턴 가족이다.

  • MVC: Model은 비즈니스 데이터, View는 그 시각적 표현으로 Model을 관찰하다 바뀌면 갱신한다. Controller는 사용자 입력을 받아 Model을 실제로 바꾸는 중재자다. View가 Model에 직접 접근할 수 있다
  • MVP: Controller 자리에 Presenter가 들어간다. View는 이벤트를 Presenter에게 넘기기만 하는 수동적인 존재이고, Presenter가 UI 로직을 맡아 View 인터페이스를 통해 화면을 갱신한다. 그래서 View를 대역으로 바꿔 Presenter를 테스트하기 쉽다
  • MVVM: ViewModel이 View의 상태와 동작을 가진다. 선언적 데이터 바인딩(Data Binding)으로 View와 ViewModel을 자동 동기화해서 Model 전체를 View에 노출하지 않는다. 대신 둘 사이 변환 비용이 생긴다. Vue와 Knockout·AngularJS가 이 계열이다(Vue 3와 React 대응표)
View가 아는 것연결 방식
MVCModelView가 Model 관찰
MVPPresenter 인터페이스Presenter가 View를 직접 갱신
MVVMViewModel데이터 바인딩

세 패턴의 차이는 상당 부분 계층 간 의존 방향과 결합 정도의 차이다(결합도). 템플릿은 View 자체가 아니라 View를 선언적으로 만드는 수단이라는 점도 구분해 둔다.

React는 MVC 프레임워크가 아니다. 중앙 컨트롤러나 라우터가 없는 뷰 렌더링 라이브러리이고, 데이터는 단방향으로 흐른다. 백엔드의 같은 패턴은 Spring MVC 요청 흐름·Django MVT 구조, 구독 구조는 옵저버 패턴, 표현과 동작 분리는 Presentational·Container 컴포넌트에서 이어진다.

출처: 『자바스크립트 + 리액트 디자인 패턴』 애디 오스마니 (원서 Learning JavaScript Design Patterns, 2nd Edition)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

  • 컴파운드 컴포넌트 패턴

    컴파운드 컴포넌트(Compound Components)는 여러 컴포넌트가 상태를 공유하며 협력해 하나의 기능을 이루는 패턴이다. HTML(HyperText Markup Language)의 select와 option처럼, 부모가 상태를 들고 자식들은 각자 한 역할만 맡는다.

  • Pages Router에서 App Router로

    App Router는 Next.js 13에서 도입된 app/ 디렉터리 기반 라우터로, 서버 컴포넌트·중첩 레이아웃(Nested Layouts)·스트리밍을 기본으로 한다. pages/ 기반의 Pages Router에서 옮길 때 바뀌는 생각을 정리한다.

  • 행동 패턴

    객체 사이의 책임 분배와 대화 방식을 정리하는 패턴들. 요청 전달, 알고리즘 교체, 상태 변화, 알림, 작업 캡슐화 같은 문제를 다룬다.

  • Fiber 아키텍처

    Fiber는 React 16부터 쓰는 내부 자료구조이자 렌더링 엔진이다. 엘리먼트마다 Fiber 노드를 만들어 렌더 작업을 작은 단위로 쪼개고, 우선순위를 매기고, 중간에 멈췄다 다시 이어 갈 수 있게 한다.

보기 옵션