21강. Node.js 실무 프로젝트 구조(MVC 패턴)
이번 강의에서는 실무에서 가장 많이 사용하는 MVC(Model-View-Controller) 구조를 배웁니다.
목표: 하나의 파일에 모든 코드를 작성하지 않고, 기능별로 분리하여 유지보수하기 쉬운 프로젝트를 만들 수 있습니다.
1. MVC란?
MVC는 프로젝트를 역할별로 나누는 설계 방식입니다.
Model : 데이터베이스 처리
View : 화면(EJS, HTML, React)
Controller : 비즈니스 로직 처리
2. MVC 구조
사용자
↓
Route
↓
Controller
↓
Model
↓
MySQL
↓
Controller
↓
View(JSON/EJS)
↓
사용자
3. 프로젝트 구조
node-project
│
├── app.js
├── package.json
├── .env
│
├── config
│ db.js
│
├── routes
│ member.js
│ board.js
│
├── controllers
│ memberController.js
│ boardController.js
│
├── models
│ memberModel.js
│ boardModel.js
│
├── middleware
│ auth.js
│
├── uploads
│
├── public
│
└── views
4. app.js
const express = require("express");
const memberRouter = require("./routes/member");
const boardRouter = require("./routes/board");
const app = express();
app.use(express.json());
app.use("/member", memberRouter);
app.use("/board", boardRouter);
app.listen(3000, () => {
console.log("Server Running");
});
5. Route 만들기
routes/member.js
const express = require("express");
const router = express.Router();
const memberController = require("../controllers/memberController");
router.get("/", memberController.list);
router.post("/", memberController.insert);
module.exports = router;
6. Controller 만들기
controllers/memberController.js
const memberModel = require("../models/memberModel");
exports.list = (req, res) => {
memberModel.list((result) => {
res.json(result);
});
};
exports.insert = (req, res) => {
memberModel.insert(req.body, () => {
res.send("회원 등록 완료");
});
};
7. Model 만들기
models/memberModel.js
const db = require("../config/db");
exports.list = (callback) => {
const sql = "SELECT * FROM member";
db.query(sql, (err, result) => {
callback(result);
});
};
8. DB 연결
config/db.js
const mysql = require("mysql2");
const db = mysql.createConnection({
host: "localhost",
user: "root",
password: "1234",
database: "node_db"
});
module.exports = db;
9. Controller 역할
Controller는
데이터 검증
로그인 확인
Model 호출
결과 반환
을 담당합니다.
Controller
↓
회원가입 검사
↓
Model 호출
↓
JSON 반환
10. Model 역할
Model은
SQL 작성
INSERT
UPDATE
DELETE
SELECT
만 담당합니다.
Model
↓
SQL 실행
↓
MySQL
↓
결과 반환
11. Route 역할
Route는
GET
/member
↓
memberController.list
처럼 URL과 Controller를 연결합니다.
12. Middleware
function auth(req, res, next){
console.log("로그인 확인");
next();
}
사용
router.get("/mypage",
auth,
memberController.mypage);
13. 환경 변수(.env)
설치
npm install dotenv
.env
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=1234
DB_NAME=node_db
PORT=3000
JWT_SECRET=mySecretKey
app.js
require("dotenv").config();
사용
process.env.DB_HOST
14. 실제 프로젝트 구조
쇼핑몰
│
├── 회원
├── 상품
├── 주문
├── 장바구니
├── 관리자
└── 결제
각 기능마다
routes
controllers
models
를 하나씩 만듭니다.
15. 게시판 구조
board
│
├── board.routes.js
├── board.controller.js
├── board.model.js
16. 회원 구조
member
│
├── member.routes.js
├── member.controller.js
├── member.model.js
17. API 흐름
React
↓
GET /member
↓
Route
↓
Controller
↓
Model
↓
MySQL
↓
JSON
↓
React
18. 실습 1
회원 Route 만들기
routes/member.js
19. 실습 2
회원 Controller 만들기
controllers/memberController.js
20. 실습 3
회원 Model 만들기
models/memberModel.js
21. 실무에서 많이 사용하는 폴더
project
│
├── config
├── routes
├── controllers
├── models
├── middleware
├── utils
├── services
├── uploads
├── public
└── views
추가 폴더 설명
폴더 역할
services 비즈니스 로직 분리
utils 공통 함수(날짜, 암호화 등)
middleware 인증, 권한, 로그 처리
config DB, 환경 변수 설정
22. MVC의 장점
유지보수가 쉽다.
기능별로 역할이 명확하다.
여러 명이 동시에 개발하기 좋다.
코드 재사용성이 높다.
프로젝트 규모가 커져도 관리하기 쉽다.
23. 이번 강의 핵심 정리
구성 요소 역할
Route URL 연결
Controller 요청 처리 및 비즈니스 로직
Model 데이터베이스 처리
View 화면(EJS/React)
Middleware 공통 기능 처리
Config 환경 설정
실무 팁
실무에서는 Controller에 SQL을 직접 작성하지 않습니다.
좋은 구조는 다음과 같습니다.
React
↓
Route
↓
Controller
↓
Service (선택)
↓
Model
↓
MySQL
Service 계층을 추가하면 복잡한 비즈니스 로직을 Controller에서 분리할 수 있어 대규모 프로젝트에서 특히 유용합니다.
실습 미션
다음 기능을 MVC 구조로 분리해 보세요.
✅ 회원관리
✅ 로그인
✅ 게시판
✅ 댓글
✅ 파일 업로드
✅ JWT 인증
이번 강의에서는 실무에서 가장 많이 사용하는 MVC(Model-View-Controller) 구조를 배웁니다.
목표: 하나의 파일에 모든 코드를 작성하지 않고, 기능별로 분리하여 유지보수하기 쉬운 프로젝트를 만들 수 있습니다.
1. MVC란?
MVC는 프로젝트를 역할별로 나누는 설계 방식입니다.
Model : 데이터베이스 처리
View : 화면(EJS, HTML, React)
Controller : 비즈니스 로직 처리
2. MVC 구조
사용자
↓
Route
↓
Controller
↓
Model
↓
MySQL
↓
Controller
↓
View(JSON/EJS)
↓
사용자
3. 프로젝트 구조
node-project
│
├── app.js
├── package.json
├── .env
│
├── config
│ db.js
│
├── routes
│ member.js
│ board.js
│
├── controllers
│ memberController.js
│ boardController.js
│
├── models
│ memberModel.js
│ boardModel.js
│
├── middleware
│ auth.js
│
├── uploads
│
├── public
│
└── views
4. app.js
const express = require("express");
const memberRouter = require("./routes/member");
const boardRouter = require("./routes/board");
const app = express();
app.use(express.json());
app.use("/member", memberRouter);
app.use("/board", boardRouter);
app.listen(3000, () => {
console.log("Server Running");
});
5. Route 만들기
routes/member.js
const express = require("express");
const router = express.Router();
const memberController = require("../controllers/memberController");
router.get("/", memberController.list);
router.post("/", memberController.insert);
module.exports = router;
6. Controller 만들기
controllers/memberController.js
const memberModel = require("../models/memberModel");
exports.list = (req, res) => {
memberModel.list((result) => {
res.json(result);
});
};
exports.insert = (req, res) => {
memberModel.insert(req.body, () => {
res.send("회원 등록 완료");
});
};
7. Model 만들기
models/memberModel.js
const db = require("../config/db");
exports.list = (callback) => {
const sql = "SELECT * FROM member";
db.query(sql, (err, result) => {
callback(result);
});
};
8. DB 연결
config/db.js
const mysql = require("mysql2");
const db = mysql.createConnection({
host: "localhost",
user: "root",
password: "1234",
database: "node_db"
});
module.exports = db;
9. Controller 역할
Controller는
데이터 검증
로그인 확인
Model 호출
결과 반환
을 담당합니다.
Controller
↓
회원가입 검사
↓
Model 호출
↓
JSON 반환
10. Model 역할
Model은
SQL 작성
INSERT
UPDATE
DELETE
SELECT
만 담당합니다.
Model
↓
SQL 실행
↓
MySQL
↓
결과 반환
11. Route 역할
Route는
GET
/member
↓
memberController.list
처럼 URL과 Controller를 연결합니다.
12. Middleware
function auth(req, res, next){
console.log("로그인 확인");
next();
}
사용
router.get("/mypage",
auth,
memberController.mypage);
13. 환경 변수(.env)
설치
npm install dotenv
.env
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=1234
DB_NAME=node_db
PORT=3000
JWT_SECRET=mySecretKey
app.js
require("dotenv").config();
사용
process.env.DB_HOST
14. 실제 프로젝트 구조
쇼핑몰
│
├── 회원
├── 상품
├── 주문
├── 장바구니
├── 관리자
└── 결제
각 기능마다
routes
controllers
models
를 하나씩 만듭니다.
15. 게시판 구조
board
│
├── board.routes.js
├── board.controller.js
├── board.model.js
16. 회원 구조
member
│
├── member.routes.js
├── member.controller.js
├── member.model.js
17. API 흐름
React
↓
GET /member
↓
Route
↓
Controller
↓
Model
↓
MySQL
↓
JSON
↓
React
18. 실습 1
회원 Route 만들기
routes/member.js
19. 실습 2
회원 Controller 만들기
controllers/memberController.js
20. 실습 3
회원 Model 만들기
models/memberModel.js
21. 실무에서 많이 사용하는 폴더
project
│
├── config
├── routes
├── controllers
├── models
├── middleware
├── utils
├── services
├── uploads
├── public
└── views
추가 폴더 설명
폴더 역할
services 비즈니스 로직 분리
utils 공통 함수(날짜, 암호화 등)
middleware 인증, 권한, 로그 처리
config DB, 환경 변수 설정
22. MVC의 장점
유지보수가 쉽다.
기능별로 역할이 명확하다.
여러 명이 동시에 개발하기 좋다.
코드 재사용성이 높다.
프로젝트 규모가 커져도 관리하기 쉽다.
23. 이번 강의 핵심 정리
구성 요소 역할
Route URL 연결
Controller 요청 처리 및 비즈니스 로직
Model 데이터베이스 처리
View 화면(EJS/React)
Middleware 공통 기능 처리
Config 환경 설정
실무 팁
실무에서는 Controller에 SQL을 직접 작성하지 않습니다.
좋은 구조는 다음과 같습니다.
React
↓
Route
↓
Controller
↓
Service (선택)
↓
Model
↓
MySQL
Service 계층을 추가하면 복잡한 비즈니스 로직을 Controller에서 분리할 수 있어 대규모 프로젝트에서 특히 유용합니다.
실습 미션
다음 기능을 MVC 구조로 분리해 보세요.
✅ 회원관리
✅ 로그인
✅ 게시판
✅ 댓글
✅ 파일 업로드
✅ JWT 인증
#21강. Node.js 실무 프로젝트 구조(MVC 패턴)