MVC (Model, View, Controller)

dev_jubbyยท2022๋…„ 8์›” 3์ผ
0

Node.js

๋ชฉ๋ก ๋ณด๊ธฐ
1/8

๐ŸŽƒ MVC

Model, View, Controller์˜ ์•ฝ์ž๋กœ, ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์™€ ๊ด€๋ จ๋œ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.



๐ŸŒˆ Model

๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, model์˜ ์ƒํƒœ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ controller์— ์ด๋ฅผ ํ†ต๋ณดํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ํ†ต๋ณด๋ฅผ ํ†ตํ•ด view๋Š” ์ตœ์‹ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ณ , controller๋Š” model์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์„ ์ถ”๊ฐ€, ์ œ๊ฑฐ, ์ˆ˜์ • ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽฒ View

UI์™€ ๊ด€๋ จ๋œ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด controller๋กœ ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์–ป์–ด ์˜จ๋‹ค.

๐ŸŽ€ Controller

view์™€ model์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์œผ๋กœ, model์— ๋ช…๋ น์„ ๋ณด๋ƒ„์œผ๋กœ์จ model์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์žˆ๋‹ค. ๋˜, ๊ด€๋ จ๋œ view์— ๋ช…๋ น์„ ๋ณด๋‚ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์งˆ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”จ MVC ์ด์šฉ ์›น ํ”„๋ ˆ์ž„ ์›Œํฌ



๐Ÿ’ก MVC์˜ ์žฅ๋‹จ์ 

๐Ÿ‘ ์žฅ์ 

  1. ํŒจํ„ด๋“ค์„ ๊ตฌ๋ถ„ํ•ด ๊ฐœ๋ฐœํ•œ๋‹ค.
  2. ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  3. ์œ ์—ฐ์„ฑ์ด ๋†’๋‹ค.
  4. ํ™•์žฅ์„ฑ์ด ๋†’๋‹ค.
  5. ํ˜‘์—…์— ์šฉ์ดํ•˜๋‹ค.

๐Ÿ‘Ž ๋‹จ์ 

  1. ์™„๋ฒฝํ•œ ์˜์กด์„ฑ ๋ถ„๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค.
  2. ์„ค๊ณ„ ๋‹จ๊ณ„๊ฐ€ ๋ณต์žกํ•˜๋‹ค.
  3. ์„ค๊ณ„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.
  4. ํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„์ง„๋‹ค.


โณ MVC ํ๋ฆ„

๐Ÿ“ ํด๋” ๊ตฌ์กฐ

Controller ๐Ÿ“‚ ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ จ ํŒŒ์ผ
Model ๐Ÿ“‚ ๋ชจ๋ธ ๊ด€๋ จ ํŒŒ์ผ
routes ๐Ÿ“‚ ๋ผ์šฐํŠธ ํŒŒ์ผ
uploads ๐Ÿ“‚ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๋™์  ํŒŒ์ผ ๊ด€๋ฆฌ
views ๐Ÿ“‚ ๋ทฐ ๊ด€๋ จ ejs ํŒŒ์ผ
index.js ๐Ÿ“„ main ํŒŒ์ผ



๐Ÿ’Ž express ํ”„๋กœ์ ํŠธ๋กœ MVC ์•Œ์•„๋ณด๊ธฐ

  1. Client๊ฐ€ Browser์— ์ ‘์†ํ•œ๋‹ค.

  2. Browser: ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ index.js (main)ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค.

  3. Router: app.use()๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋“ค์–ด์˜จ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ผ์šฐํ„ฐ ํด๋” ์•ˆ์˜ ๋ผ์šฐํ„ฐ ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค. ๋”ฐ๋กœ ๋ผ์šฐํ„ฐ ํŒŒ์ผ ๋ช…๊นŒ์ง€ ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ index.js ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค. ๋งŒ์•ฝ app.use()๊ฐ€ ์—†์œผ๋ฉด app.get()์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ์‹คํ–‰ํ•œ๋‹ค.

/* index.js */

const express = require("express");
const app = express();
const port = 8080;
const bodyParser = require("body-parser"); 

app.set("view engine", "ejs");
app.use( express.static( "uploads" ));
app.use(express.urlencoded({extended: true}));
app.use( bodyParser.json() );

// ๋ผ์šฐํŠธ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
const router = require("./routes");
// /user ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์™”์„ ๋•Œ ๋ผ์šฐํŠธ์˜ index.js ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค.
app.use("/user", router); 

app.get("/", function(req,res){
  res.send("Index");
})

app.listen(port, () => {
  console.log( "Server Port: ", port);
}) 
  1. express์˜ Router()๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
/* ./routes/index.js */
const express = require("express");
const userRouter = express.Router();
const user = require("../controller/UserController");

// /user๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ UserController์˜ index ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰
userRouter.get("/", user.index);
// /user/register๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ UserController์˜ register ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰
userRouter.get("/register", user.register);
// /user/register ์—์„œ post ์š”์ฒญ์œผ๋กœ ์ ‘์†ํ•˜๋ฉด UserController์˜ post_register ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰
userRouter.post("/register", user.post_register); 
// /user/login ์—์„œ ์ ‘์†ํ•˜๋ฉด UserController์˜ login ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰
userRouter.get("/login", user.login);
// /user/login ์—์„œ post ์š”์ฒญ์œผ๋กœ ์ ‘์†ํ•˜๋ฉด UserController์˜ post_login ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰
userRouter.post("/login", user.post_login); 

module.exports = userRouter; 
  1. ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์–ด๋–ค view๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ธ์ง€๋ฅผ Controller์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
/* ./controller/UserController.js */
const User = require("../model/User");

exports.index = (req, res) => {
  	// views ํด๋”์˜ index.ejs ํŒŒ์ผ์„ rendering ํ•œ๋‹ค.
    res.render("index");
}

exports.register = (req, res) => {
  	// views ํด๋”์˜ register.ejs ํŒŒ์ผ์„ rendering ํ•œ๋‹ค.
    res.render("register");
}

exports.post_register = (req, res) => {
  	// User model post_user()๋กœ req.body ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
    User.post_user(req.body);
    res.send( "success_join" );
}

exports.login = (req, res) => {
  // views ํด๋”์˜ login.ejs ํŒŒ์ผ์„ rendering ํ•œ๋‹ค.
    res.render( "login" );
}

exports.post_login = async (req, res) => {
   // User model์˜ get_user() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค.
    var data = await User.get_user();

    var info = data.split("//");


    if (info[0] != req.body.id) {
        res.send("์•„์ด๋”” ๋‹ค๋ฆ„");
    } else if (info[2] != req.body.password) {
        res.send("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฆ„")
    } else {
        res.send("๋กœ๊ทธ์ธ ์„ฑ๊ณต!");
    }

    console.log( data );
}
  1. User ๋ชจ๋ธ๋กœ ๋„˜์–ด์˜จ req.body ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋Š”์ง€๋ฅผ User.js ํŒŒ์ผ์— ์ž‘์„ฑํ•œ๋‹ค.
/* ./model/User.js */
const fs = require("fs").promises;

exports.post_user = function( data ){
    console.log( data );
    const {id, password, name, age} = data;

    fs.writeFile("./info.txt", `${id}//${password}//${name}//${age}`, (err) => {
        if (err) {
            console.log(err);
            res.status(400).send("err!!");
        }
    });
}

exports.get_user = async function( data ){
    var buffer = await fs.readFile("./info.txt");
    return buffer.toString();
}


profile
์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ฅฌ๋น„์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€