Backend Study

MVC(Model-View-Controller) 패턴이란?

jimmmy_jin 2025. 1. 31. 09:58

1. MVC란 무엇인가?

MVC(Model-View-Controller)는 애플리케이션의 코드 구조를 모델(Model), 뷰(View), 컨트롤러(Controller) 세 부분으로 분리하는 소프트웨어 디자인 패턴이다.

이 패턴을 사용하면 코드의 구조화유지보수가 쉬워지고, 역할별로 모듈화할 수 있어 확장성이 높아진다.

  • Model (모델) → 데이터 및 비즈니스 로직을 처리한다.
  • View (뷰) → 사용자에게 보이는 화면을 담당한다.
  • Controller (컨트롤러) → 사용자 요청을 받아 Model과 View를 연결하는 역할을 한다.

2. MVC 패턴의 구조

사용자 ←→ [Controller] ←→ [Model]
                     ↓
                   [View]

1) Model (모델)

  • 애플리케이션의 데이터(데이터베이스)와 비즈니스 로직을 담당한다.
  • 데이터의 생성, 수정, 삭제 등을 수행한다.
  • 예) 사용자의 정보를 저장하는 User 모델.
const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
    name: String,
    email: String,
    password: String
});

module.exports = mongoose.model('User', UserSchema);

2) View (뷰)

  • 사용자에게 보여지는 화면(UI)를 담당한다.
  • Express.js에서 Pug, EJS, React 등을 사용해 구현할 수 있다.
  • API 서버라면 JSON 응답을 반환하는 것이 뷰 역할을 대신할 수도 있다.
app.get('/user/:id', async (req, res) => {
    const user = await User.findById(req.params.id);
    res.json(user); // API 서버에서는 JSON이 View 역할을 한다.
});

3) Controller (컨트롤러)

  • 사용자의 요청을 받아 Model과 View를 연결하는 역할을 한다.
  • Model에서 데이터를 가져와 가공 후 View에 전달한다.
  • 예) 사용자 정보를 요청하면 User 모델에서 데이터를 가져와 JSON으로 반환.
const User = require('../models/userModel');

const getUser = async (req, res) => {
    try {
        const user = await User.findById(req.params.id);
        res.json(user);
    } catch (err) {
        res.status(500).json({ error: '사용자를 찾을 수 없습니다.' });
    }
};

module.exports = { getUser };

3. Express.js에서 MVC 패턴 적용하기

프로젝트 구조 예시:

/project
│── server.js          # 메인 서버 파일
│── routes
│   ├── userRoutes.js  # 라우트 설정
│── controllers
│   ├── userController.js  # 컨트롤러
│── models
│   ├── userModel.js  # 모델

1) 서버 설정 (server.js)

const express = require('express');
const app = express();
const userRoutes = require('./routes/userRoutes');

app.use(express.json());
app.use('/users', userRoutes);

app.listen(3000, () => console.log('서버가 3000번 포트에서 실행 중입니다.'));

2) 라우트 설정 (routes/userRoutes.js)

const express = require('express');
const router = express.Router();
const { getUser } = require('../controllers/userController');

router.get('/:id', getUser);

module.exports = router;

3) 컨트롤러 (controllers/userController.js)

const User = require('../models/userModel');

const getUser = async (req, res) => {
    try {
        const user = await User.findById(req.params.id);
        res.json(user);
    } catch (err) {
        res.status(500).json({ error: '사용자를 찾을 수 없습니다.' });
    }
};

module.exports = { getUser };

4) 모델 (models/userModel.js)

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
    name: String,
    email: String,
    password: String
});

module.exports = mongoose.model('User', UserSchema);

4. MVC 패턴을 사용하는 이유

코드 분리 → 역할별로 파일을 분리하여 유지보수 용이 ✅ 재사용성 → Model과 Controller는 여러 View에서 재사용 가능 ✅ 확장성 → 새로운 기능 추가 시 구조 변경 없이 쉽게 확장 가능 ✅ 협업 용이 → 프론트엔드/백엔드 개발자가 역할을 분리하여 작업 가능


5. 결론

MVC 패턴은 Node.js + Express.js 백엔드에서 API 서버를 만들 때 코드를 체계적으로 관리할 수 있도록 도와주는 아키텍처 패턴이다.

  • Model: 데이터베이스 및 비즈니스 로직 담당
  • View: 사용자에게 보여지는 UI 또는 API 응답 (JSON)
  • Controller: 요청을 받아 Model과 View를 연결

Express.js에서 API 서버를 개발할 때 프로젝트 규모가 커지면 MVC 구조를 적용하는 것이 유지보수와 협업에 도움이 된다. 🚀