🖍️
Developer Note
  • Welcome
  • Git
    • Eslint & Prettier & Stylelint & Husky
  • Programming Language
    • JavaScript
      • Script Async vs Defer
      • Module
      • Const VS Let VS Var
      • Promise
      • Event Loop
      • Execution Context
      • Hoisting
      • Closure
      • Event Buddling and Capturing
      • Garbage Collection
      • This
      • Routing
      • Debounce and Throttle
      • Web Component
      • Iterator
      • Syntax
      • String
      • Array
      • Object
      • Proxy & Reflect
      • ProtoType
      • Class
      • Immutability
      • Typeof & Instanceof
      • Npm (Node package manager)
    • TypeScript
      • Utility Type
      • Type vs Interface
      • Any vs Unknown vs Never
      • Void and undefined
      • Strict Mode
      • Namespace
      • Enum
      • Module
      • Generic
    • Python
      • Local Development
      • Uv
      • Asyncio & Event loop
      • Context Manager
      • Iterator & Generator
      • Fast API
      • Pydantic & Data Class
    • Java
      • Compilation and Execution
      • Data Type
      • Enumeration
      • Data Structure
      • Try Catch
      • InputStream and OutputStream
      • Concurrent
      • Unicode Block
      • Build Tools
      • Servlet
      • Java 8
  • Coding Pattern
    • MVC vs MVVM
    • OOP vs Functional
    • Error Handling
    • MVC vs Flux
    • Imperative vs Declarative
    • Design Pattern
  • Web Communication
    • REST API
      • Web Hook
      • CORS issue
    • HTTPS
    • GraphQL
      • REST API vs GraphQL
      • Implementation (NodeJS + React)
    • Server-Sent Event
    • Web Socket
    • IP
    • Domain Name System (DNS)
  • Frontend
    • Progressive Web App (PWA)
    • Single Page & Multiple Page Application
    • Search Engine Optimiaztion (SEO)
    • Web bundling & Micro-frontend
      • Webpack
        • Using Webpack to build React Application
        • Using Webpack to build react library
      • Vite
      • Using rollup to build react library
      • Implementing micro frontend
    • Web Security
      • CSRF & Nonce
      • XSS
      • Click hijacking
    • Cypress
    • CSS
      • Core
        • Box Model
        • Inline vs Block
        • Flexbox & Grid
        • Pseudo Class
        • Position
      • Tailwind CSS
        • Shadcn
      • CSS In JS
        • Material UI
    • React
      • Core
        • Component Pattern
        • React Lazy & Suspense
        • React Portal
        • Error Boundary
        • Rendering Methods
        • Environment Variable
        • Conditional CSS
        • Memo
        • Forward Reference
        • High Order Component (HOC) & Custom Hook
        • TypeScript
      • State Management
        • Redux
        • Recoil
        • Zustand
      • Routing
        • React Router Dom
      • Data Fetching
        • Axios & Hook
        • React Query
        • Orval
      • Table
        • React Table
      • Form & Validation
        • React Hook Form
        • Zod
      • NextJS
        • Page Router
        • App Router
      • React Native
    • Angular
    • Svelte
      • Svelte Kit
  • Backend
    • Cache
      • Browser Cache
      • Web Browser Storage
      • Proxy
      • Redis
    • Rate limit
    • Monitoring
      • Logging
      • Distributed Tracing
    • Load Test
    • Encryption
    • Authentication
      • Password Protection
      • Cookie & Session
      • JSON Web Token
      • SSO
        • OAuth 2.0
        • OpenID Connect (OIDC)
        • SAML
    • Payment
      • Pre-built
      • Custom
    • File Handling
      • Upload & Download (Front-end)
      • Stream & Buffer
    • Microservice
      • API Gateway
      • Service Discovery
      • Load Balancer
      • Circuit Breaker
      • Message Broker
      • BulkHead & Zipkin
    • Elastic Search
    • Database
      • SQL
        • Group By vs Distinct
        • Index
        • N + 1 problem
        • Normalization
        • Foreign Key
        • Relationship
        • Union & Join
        • User Defined Type
      • NOSQL (MongoDB)
      • Transaction
      • Sharding
      • Lock (Concurrency Control)
    • NodeJS
      • NodeJS vs Java Spring
      • ExpressJS
      • NestJS
        • Swagger
        • Class Validator & Validation Pipe
        • Passport (Authentication)
      • Path Module
      • Database Connection
        • Integrating with MYSQL
        • Sequalize
        • Integrating with MongoDB
        • Prisma
        • MikroORM
        • Mongoose
      • Streaming
      • Worker Thread
      • Passport JS
      • JSON Web Token
      • Socket IO
      • Bull MQ
      • Pino (Logging)
      • Yeoman
    • Spring
      • Spring MVC
      • Spring REST
      • Spring Actuator
      • Aspect Oriented Programming (AOP)
      • Controller Advice
      • Filter
      • Interceptor
      • Concurrent
      • Spring Security
      • Spring Boot
      • Spring Cloud
        • Resilience 4j
      • Quartz vs Spring Batch
      • JPA and Hibernate
      • HATEOS
      • Swagger
      • Unit Test (Java Spring)
      • Unit Test (Spring boot)
  • DevOp
    • Docker
    • Kubernetes
      • Helm
    • Nginx
    • File System
    • Cloud
      • AWS
        • EC2 (Virtual Machine)
        • Network
        • IAM
          • Role-Service Binding
        • Database
        • Route 53
        • S3
        • Message Queue
        • Application Service
        • Serverless Framework
        • Data Analysis
        • Machine Learning
        • Monitoring
        • Security
      • Azure
        • Identity
        • Compute Resource
        • Networking
        • Storage
        • Monitoring
      • Google Cloud
        • IAM
          • Workload Identity Federation
        • Compute Engine
        • VPC Network
        • Storage
        • Kubernetes Engine
        • App Engine
        • Cloud function
        • Cloud Run
        • Infra as Code
        • Pub/Sub
    • Deployment Strategy
    • Jenkins
    • Examples
      • Deploy NextJS on GCP
      • Deploy Spring on Azure
      • Deploy React on Azure
  • Domain Knowledge
    • Web 3
      • Blockchain
      • Cryptocurrency
    • AI
      • Prompt
      • Chain & Agent
      • LangChain
      • Chunking
      • Search
      • Side Products
Powered by GitBook
On this page
  • MVC
  • Flow
  • Example (React)
  • Example (Angular)
  • MVVM
  • Flow
  • Example (React)
  • Example (Angular)
  • Similarity
  • Comparison

Was this helpful?

  1. Coding Pattern

MVC vs MVVM

PreviousCoding PatternNextOOP vs Functional

Last updated 1 year ago

Was this helpful?

MVC

Flow

Example (React)

// Model/Data
const data = {
  counter: 0,
};

export default data;
// View
import React from 'react';

const View = ({ counter, incrementCounter }) => (
  <div>
    <h1>Counter: {counter}</h1>
    <button onClick={incrementCounter}>Increment</button>
  </div>
);

export default View;
// Controller
import React, { useState } from 'react';
import View from './View';
import data from './data';

const Controller = () => {
  const [counter, setCounter] = useState(data.counter);

  const incrementCounter = () => {
    setCounter(counter + 1);
  };

  return <View counter={counter} incrementCounter={incrementCounter} />;
};

export default Controller;

Example (Angular)

// Model/Data
export class DataModel {
  counter: number;
}
<!-- View/Template -->
<div>
  <h1>Counter: {{ counter }}</h1>
  <button (click)="incrementCounter()">Increment</button>
</div>
// Controller
import { Component } from '@angular/core';
import { DataModel } from './data.model';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  counter: number;

  constructor(private dataModel: DataModel) {
    this.counter = dataModel.counter;
  }

  incrementCounter(): void {
    this.counter++;
  }
}

MVVM

Flow

Example (React)

// Model/Data
const data = {
  counter: 0,
};

export default data;
// ViewModel/Logic
import { useState } from 'react';
import data from './data';

const ViewModel = () => {
  const [counter, setCounter] = useState(data.counter);

  const incrementCounter = () => {
    setCounter(counter + 1);
  };

  return {
    counter,
    incrementCounter,
  };
};

export default ViewModel;
// View/Presentation
import React from 'react';
import ViewModel from './ViewModel';

const View = () => {
  const viewModel = ViewModel();

  return (
    <div>
      <h1>Counter: {viewModel.counter}</h1>
      <button onClick={viewModel.incrementCounter}>Increment</button>
    </div>
  );
};

export default View;

Example (Angular)

// Model/Data
export class DataModel {
  counter: number;
}
// ViewModel/Logic
import { Injectable } from '@angular/core';
import { DataModel } from './data.model';

@Injectable()
export class DataViewModel {
  private dataModel: DataModel;

  constructor() {
    this.dataModel = new DataModel();
    this.dataModel.counter = 0;
  }

  get counter(): number {
    return this.dataModel.counter;
  }

  incrementCounter(): void {
    this.dataModel.counter++;
  }
}
<!-- View/Template -->
<div>
  <h1>Counter: {{ viewModel.counter }}</h1>
  <button (click)="viewModel.incrementCounter()">Increment</button>
</div>

Similarity

  • Both acts as a bridge between model and view

  • Controller and view model both have one-to-many relationship to the view

Comparison

  • ViewModel supports data binding, which allows for automatic synchronization of data between the ViewModel and the View. The ViewModel exposes properties that the View binds to, and any changes in the ViewModel automatically update the corresponding elements in the View.

  • Controller typically does not directly support data binding. It is responsible for explicitly updating the View when there are changes in the Model. The Controller retrieves data from the Model and explicitly render the View to reflect those changes.

  • ViewModel does not have direct knowledge of the specific View instances that bind to it. The ViewModel is designed to be independent of the View implementation and easier for testing

  • Controller has direct knowledge of the View and interacts with it to update its state. The Controller may have references to specific View instances and can manipulate the View directly to reflect changes in the Model.

  • The entry point of MVC is controller while MVVM is view