[๐ฑ๋ชฉ์ฐจ๐ฑ]
- ๋์์ธ ํจํด์ด๋?
- MVC ๋์์ธ ํจํด์ด๋?
+) ๋ผ์ฐํฐ ์ชผ๊ฐ๊ธฐ ํด๋ณด๊ธฐ
01. ๋์์ธ ํจํด์ด๋?
๋์์ธ ํจํด์ ์์์ ๋ฐ์ด๋ ์ค์ง๋์ด๊ฐ ํด๊ฒฐํ ๋ฌธ์ ๋ฅผ ๋ค์์ ์์ง๋์ด๋ค์ด ์ฒ๋ฆฌ ํ ์ ์๋๋ก ํ ๊ท์น์ด๋ฉด์, ๊ตฌํ์๋ค ๊ฐ์ ์ปค๋ฎค๋์ผ์ด์
์ ํจ์จ์ฑ์ ๋์ด๋ ๊ธฐ๋ฒ์
๋๋ค.
02. MVC ๋์์ธ ํจํด์ด๋?
Model View Controller์ ์ฝ์๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ๊ฐ์ง์ ์ญํ ๋ก ๊ตฌ๋ถํ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์
๋๋ค. ์ฌ์ฉ์๊ฐ controller๋ฅผ ์กฐ์ํ๋ฉด controller๋ Model์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๊ทธ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๊ฐ์ ์ธ ํํ์ ๋ด๋นํ๋ View๋ฅผ ์ ์ดํด์ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
[MVC๋ฅผ ์ด์ฉํ ์น ํ๋ ์์ํฌ]
- PHP
- Django
- Express
- Angular
- Etc..
์ด ๊ฐ๋
์ ์น์ ์ ์ฉํ๋ค๋ฉด
- ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์ ์ ์
- Controller๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์นํ์ด์ง๋ฅผ ์๋น์ค ํ๊ธฐ ์ํด์ ๋ชจ๋ธ ํธ์ถ
- ๋ชจ๋ธ์ DB๋ ํ์ผ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ ์ดํ ํ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
- Controller๋ Model์ด ๋ฆฌํดํ ๊ฒฐ๊ณผ๋ฅผ View์๊ฒ ๋ฐ์
- ๋ฐ์ดํฐ๊ฐ ๋ฐ์๋ View๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง
๊ณผ ๊ฐ์ ์ฌ์ดํด์ ๋๊ฒ ๋ฉ๋๋ค. ๋ชจ๋ธ/๋ทฐ/์ปจํธ๋กค๋ฌ๋ฅผ ๊ฐ๊ฐ ์์ธํ ๋ณธ๋ค๋ฉด,
[Controller]
์ฌ์ฉ์๊ฐ ์ ๊ทผ ํ URL์ ๋ฐ๋ผ์ ์ฌ์ฉ์์ ์์ฒญ์ฌํญ์ ํ์
ํ ํ์ ๊ทธ ์์ฒญ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ Model์ ์๋ขฐํ๊ณ , ๋ฐ์ดํฐ๋ฅผ View์ ๋ฐ์ํด์ ์ฌ์ฉ์์๊ฒ ์๋ ค์ค ->View์ Model์ ์ฐ๊ฒฐ
[Model]
์ผ๋ฐ์ ์ผ๋ก DB ํ
์ด๋ธ์ ๋์๋ฉ๋๋ค. -> ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ
[View]
view๋ ํด๋ผ์ด์ธํธ ์ธก ๊ธฐ์ ์ธ html/css/JavaScript๋ค์ ๋ชจ์๋ ์ปจํ
์ด๋ ์
๋๋ค. -> UI ๊ด๋ จ๋ ๊ฒ ์ฒ๋ฆฌ (์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ๋ถ๋ถ)
[MVC์ ์ฅ๋จ์ ]
์ฅ์ | ๋จ์ |
ํจํด๋ค์ ๊ตฌ๋ถํด ๊ฐ๋ฐํ๋ค | ์๋ฒฝํ ์์กด์ฑ ๋ถ๋ฆฌ๊ฐ ์ด๋ ต๋ค |
์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค | ์ค๊ณ ๋จ๊ณ๊ฐ ๋ณต์กํ๋ค |
์ ์ฐ์ฑ์ด ๋๋ค | ์ค๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค |
ํ์ฅ์ฑ์ด ๋๋ค | ํด๋์ค (๋จ์) ๊ฐ ๋ง์์ง๋ค |
ํ์ ์ ์ฉ์ดํ๋ค |
[Node.js์ MVC ๊ตฌ์กฐ]
์ผ๋จ DB์์ ๋ฐ์์ค๋ ๊ฒ์ ์์ง ์งํ ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ผ์ฐํฐ ์ชผ๊ฐ๊ธฐ ๋จผ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๋ผ์ฐํฐ๋ฅผ ์ชผ๊ฐ๊ธฐ์ ์๋ ์งํํ๋ ๋๋ก ํ์ผ์ ์์ฑํ๋ฉด
---------------------------------------------๋ผ์ฐํฐ ์ชผ๊ฐ๊ธฐ ์ --------------------------------------------------------
[app.js]
const express = require('express');
const app = express();
const PORT = 8000;
app.set('view engine', 'ejs');
app.set('views','/views');
app.use('/views', express.static(__dirname + '/views'));
app.use('/static', express.static(__dirname + '/static'));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// (์์) DB๋ก๋ถํฐ ๋ฐ์์จ ๋๊ธ ๋ชฉ๋ก
const comments = [
{
id: 1,
userid: 'helloworld',
date: '2022-10-31',
comment: '์๋
ํ์ธ์^~^',
},
{
id: 2,
userid: 'happy',
date: '2022-11-01',
comment: '๋ฐ๊ฐ์์ ',
},
{
id: 3,
userid: 'lucky',
date: '2022-11-02',
comment: '์ค ์ ๊ธฐํ๊ตฐ',
},
{
id: 4,
userid: 'bestpart',
date: '2022-11-02',
comment: '์ฒซ ๋๊ธ์
๋๋นใ
ใ
',
},
];
app.get('/', (req, res) => {
res.render('index');
});
app.get('/comments', (req, res) => {
//req.params : ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์
//= res.render('comments', { comments: comments });
res.render('comments', { comments });
});
//params ์ฌ๋ฌ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ
//http://localhost:8000/test/banana/๋ฐ๋๋
app.get('/test/:id/:name', (req, res) => {
console.log('req.params => ', req.params); //req.params => { id: 'banana', name: '๋ฐ๋๋' }
res.send('test res success!');
});
app.listen(PORT, () => {
console.log(`http://localhost:${PORT}`);
});
DB์์ ๋๊ธ์ ๋ฐ์์๋ค๊ณ ๊ฐ์ ํ๊ณ comments ๋ฐฐ์ด์ ๊ฐ์ฒด๋ก ๋๊ธ ๋ชฉ๋ก์ ํ ๋นํด์ฃผ๊ณ ๋ฃจํธ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ฉด index.ejsํ์ผ์ ๋ ๋ํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค. ํ
์คํธํ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๊ณ ์ ๊ฒฝ๋ก ๋๋ก http://localhost:8000/test/banana/๋ฐ๋๋ ๋ก ์ ์ํ๊ฒ ๋๋ฉด ์ฝ์์ req.params๋ idํค์ nameํค์ value๊ฐ ๊ฐ๊ฐ banana, ๋ฐ๋๋๋ก ์ค์ ๋ ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
/comments ๊ฒ๊ฒฝ๋ก๋ก ๋ค์ด์ค๊ฒ๋๋ค๋ฉด comments.ejs๋ฅผ ๋ ๋ํด์ฃผ๊ณ DB๋ก ๋ถํฐ ๋ฐ์์จ ๋๊ธ๋ชฉ๋ก์ธ comments๋ฅผ ๊ฐ์ฒด๋ฐฐ์ด ํํ๋ก ๋๊ฒจ์ฃผ๊ฒ๋ฉ๋๋ค.
[views/comments/.ejs]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MVC ํจํด</title>
</head>
<body>
<h1>๋๊ธ ๋ชฉ๋ก ํ์ธ</h1>
<a href="/">ํ์ผ๋ก ์ด๋ํ๊ธฐ </a>
<ul>
<%for (let cmt of comments){%>
<li>
<b><%= cmt.userid%></b> -
<a href="/comment/<%= cmt.id%>"><%= cmt.comment%></a>
</li>
<%}%>
</ul>
</body>
</html>
comments.ejsํ์ผ์์๋ DB์์ ๋ฐ์์จ ๋๊ธ๋ชฉ๋ก์ธ comments๋ฅผ ๊ฐ์ฒด๋ฐฐ์ด ํํ๋ก ๋๊ฒจ๋ฐ์์ผ๋ฏ๋ก for of ๋ฐ๋ณต๋ฌธ์์ cmt๋ comments ๊ฐ์ฑ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, cmt.userid๋ comments[0].userid ์ด๋ผ๋ฉด cmt.userid๋ helloworld๊ฐ ๋ฉ๋๋ค. ๋๊ธ์ ๋๋ฅด๋ฉด /comment/:id๋ก ์ด๋ํ๋ a ํ๊ทธ๋ฅผ ๋ฌ์์ฃผ๊ณ ๋ผ์ฐํฐ๋ฅผ ์ด์ด์ฃผ๋ฌ ๋ค์ app.js๋ก ๊ฐ๋๋ค.
[app.js]
app.get('/comment/:id', (req, res) => {
console.log('req.params -> ', req.params); //req.params -> { id: '1' }
const cmtId = Number(req.params.id);
//:id ๋ณ์์ 0,7๊ฐ์ ์กด์ฌํ์ง ์๋ id ์ ๊ทผ์ 404 ํ์ด์ง
// if (cmtId < 1 || cmtId > comments.length) {
// return res.render('404');
// }
//:id ๋ณ์์ ์ซ์๊ฐ ์๋ ๊ฐ์ด ์จ๋ค๋ฉด 404 ํ์ด์ง
// if (isNaN(cmtId)) {
// return res.render('404');
// }
// ๋๋
// if (typeof cmtId !== 'Number') {
// return res.render('404');
// }
// if (isNaN(cmtId) || cmtId < 1 || cmtId > comments.length) {
// return res.render('404');
// }
//๋๋
if (!comments[cmtId - 1]) {
//undefined -> false
res.render('404');
}
res.render('comment', { comment: comments[cmtId - 1] });
//comments ๋ฐฐ์ด์์ ๊ฐ์ฒด ์ฐพ์๊ฐ
//
});
//404 Error ์ฒ๋ฆฌ
//๋ฐ๋์ ๋งจ ๋ง์ง๋ง ๋ผ์ฐํธ๋ก ์ ์ธ
app.get('*', (req, res) => {
res.render('404');
});
app.listen(PORT, () => {
console.log(`http://localhost:${PORT}`);
});
req.params๋ string ํ์
์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋๊ธฐ ๋๋ฌธ์ Number๋ก ํ๋ณํ์ ํด์ฃผ๊ณ cmtId์ ํ ๋นํด์ฃผ์์ต๋๋ค. ๋ํ comments ๊ฐ์ฒด ๋ฐฐ์ด์์ id๋ 1๋ถํฐ ์์ํ๋ฏ๋ก 0์ด ๋ค์ด์ค๊ฒ ๋๋ฉด ํด๋น user๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ์กฐ๊ฑด๋ฌธ์ ๋ฌ์ comments ๊ฐ์ฒด๋ฐฐ์ด ์ธ๋ฑ์ค์ 1์ ๋นผ์ค์ 0๋ถํฐ ์์ํ ์ ์๋๋ก ํ ๋ค !๋ฅผ ๋ถ์ฌ ์กด์ฌํ์ง ์๋ ์ธ๋ฑ์ค๊ฐ ๋ค์ด์ค๊ฒ ๋๋ค๋ฉด 404.ejs๋ฅผ ๋ ๋ํด์ฃผ๊ฒ ์ต๋๋ค.
์กฐ๊ฑด๋ฌธ์ ํต๊ณผํ๋ฉด comment.ejs ํ์ผ์ ๋ ๋ํด์ฃผ๋ฉด์ comments ๊ฐ์ฒด ๋ฐฐ์ด์ ๋๊ฒจ์ค๋๋ค.
[views/comment]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MVC ํจํด</title>
</head>
<body>
<h1><%= comment.userid%> ๋์ ๋๊ธ์
๋๋ค.</h1>
<a href="/comments">๋๊ธ ๋ชฉ๋ก ๋ณด๊ธฐ</a>
<p>์์ฑ์ผ : <%= comment.date%></p>
<p>๋๊ธ ๋ด์ฉ :<%= comment.comment%></p>
</body>
</html>
[views/index.ejs]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MVC ํจํด</title>
</head>
<body>
<h1>Home</h1>
<a href="/comments">๋๊ธ ๋ชฉ๋ก ํ์ธ</a>
</body>
</html>
>>๊ทธ๋ฌ๋๊น ๊ฒฝ๋ก๊ฐ [localhost:8000/comment/4] ๊ฐ ๋ค์ด์ค๊ฒ ๋๋ฉด idํค์ 4๊ฐ ๋ค์ด์ค๋ฉด์ cmtId-1๋ 3 ์ด๋ฏ๋ก comments[3] ์ ๊ฐ์ฒด 4๊ฐ์ค 4๋ฒ์งธ์ธ user ๋๊ธ์ ๋ณด๊ฐ ๋ค์ด์ค๊ฒ ๋๋ ๊ฒ์
๋๋ค.
์ด ํด๋์ ๋ผ์ฐํฐ๋ฅผ MVCํจํด์ ๋ง๊ฒ ์ชผ๊ฐ๋ณด๊ฒ ์ต๋๋ค.
---------------------------------------------๋ผ์ฐํฐ ์ชผ๊ฐ๊ธฐ ํ --------------------------------------------------------
[MVC ver.]
๋จผ์ app.js์ ์๋ ์ฝ๋๋ค์ ๊ฐ๊ฐ ์ญํ ์ ๋ง๊ฒ ๋ฆฌํฉํ ๋ง ์์ผ์ฃผ๊ฒ ์ต๋๋ค.
DB์์ ๋ฐ์์จ ๋๊ธ ๋ชฉ๋ก๋ค์ model ๋๋ ํ ๋ฆฌ์ comment.js ํ์ผ์ ๋ฃ์ด์ฃผ๊ฒ ์ต๋๋ค.
[model/comment.js]
//model!!
//db์์ ์ ์ฒด ๋๊ธ ๋ชฉ๋ก์ ๋ฐ์์๋ค๊ณ ๊ฐ์
exports.getCommentAll = () => {
return [
{
id: 1,
userid: 'helloworld',
date: '2022-10-31',
comment: '์๋
ํ์ธ์^~^',
},
{
id: 2,
userid: 'happy',
date: '2022-11-01',
comment: '๋ฐ๊ฐ์์ ',
},
{
id: 3,
userid: 'lucky',
date: '2022-11-02',
comment: '์ค ์ ๊ธฐํ๊ตฐ',
},
{
id: 4,
userid: 'bestpart',
date: '2022-11-02',
comment: '์ฒซ ๋๊ธ์
๋๋นใ
ใ
',
},
];
};
๊ทธ ๋ค์
[controller/Cmain.js]
const Comment = require('../model/Comment');
// ํจ์ ๋ด๋ณด๋ด๊ธฐ 08-node math2.js ์ฐธ๊ณ
exports.main = (req, res) => {
res.render('index');
};
exports.comments = (req, res) => {
res.render('comments', { comments: Comment.getCommentAll() });
};
exports.comment = (req, res) => {
const cmtId = Number(req.params.id);
const comments = Comment.getCommentAll(); //๋๊ธ ๋ชฉ๋ก ๋ฐฐ์ด
if (!comments[cmtId - 1]) {
res.render('404');
}
res.render('comment', { comment: comments[cmtId - 1] });
};
//์ปจํธ๋กค๋ฌ์ ๋ชจ๋ธ์ ์ฐ๊ฒฐ
๊ฒฝ๋ก์ ์ฐ๊ฒฐ๋ ํจ์ ๋ด์ฉ์ ์ ์ํฉ๋๋ค. ๊ฒฝ๋ก์ ์ฐ๊ฒฐ๋๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ req ๊ฐ์ฒด์ res ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
[routes/index.js]
const express = require('express');
const controller = require('../controller/Cmain');
// controller = {
// main : ()=>{}, // ํจ์
// comments : ()=>{} //ํจ์
// }
const router = express.Router();
// const app = express();
// app.get
// router.post()
router.get('/', controller.main);
router.get('/comments', controller.comments);
router.get('/comment/:id', controller.comment);
//module.exports ๊ตฌ๋ฌธ์ ํตํด router๋ฅผ ๋ด๋ณด๋ด์ผ
//๋ค๋ฅธ ๋ชจ๋(ํ์ผ)์์ router ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
module.exports = router;
๊ฒฝ๋ก๋ฅผ controller์ ์ฐ๊ฒฐํด ์ค์ ํฉ๋๋ค.
[app.js]
const express = require('express');
const app = express();
const PORT = 8000;
app.set('view engine', 'ejs');
app.use('/views', express.static(__dirname + '/views'));
app.use('/static', express.static(__dirname + '/static'));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
//index๋ ์๋ต ๊ฐ๋ฅ!
const indexRouter = require('./routes/index');
// const indexRouter = require('./routes');
//indexRouter ์์๋ localhost:PORT/ ๊ธฐ๋ณธ๊ฒฝ๋ก
app.use('/', indexRouter); //๋ฃจํธ๊ฒฝ๋ก์ ์จ๊ฑฐ๋ฅผ indexRouter๋ก ๋๊ธฐ๊ฒ ๋ค.
//./routes/index.jsํ์ผ์ ์ ์ธํ ๋๋ก ๋์
//404 Error ์ฒ๋ฆฌ
//๋ฐ๋์ ๋งจ ๋ง์ง๋ง ๋ผ์ฐํธ๋ก ์ ์ธ
app.get('*', (req, res) => {
res.render('404');
});
app.listen(PORT, () => {
console.log(`http://localhost:${PORT}`);
});
const indexRouter = require('./routes/index'); app.use('/', indexRouter); ๋ Router ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ถ๋ถ์ผ๋ก ํด๋น ์ฝ๋๋ฅผ ํตํด ํน์ ์์ url์ ์ญํ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํฉ๋๋ค. localhost:PORT/ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ณธ์ผ๋ก routes ๋๋ ํ ๋ฆฌ์์ index.js๋๋ก ๋์ํ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค.
+ 404 Error๋?
404 ์๋ฌ๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ชป๋ ์ฃผ์๋ก ์ ์ํ์ ๋ ๋ฐ์ํ๋ Error ์
๋๋ค. ์์ ์ฝ๋๋ 404 ์๋ฌ ๋ผ์ฐํ
์ ํด์ค ์ํ๋ก app.js์ 404 ์๋ฌ ์ฒ๋ฆฌ์ *๋ ์ค์ ํด์ฃผ์ง ์์ ๊ฒฝ๋ก๋ฅผ ์ ์ธํ ๋๋จธ์ง ์ฃผ์๋ ๋ชจ๋ ์๋ชป๋ ์์ฒญ์์ ์ฌ์ฉ์์๊ฒ ์๋ ค์ผ ํ๋ฏ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ ์ฃผ์๋ก ์์ฒญ ์ Error ํ์ด์ง๊ฐ ๋ ๋๋ง๋ฉ๋๋ค.
์์ ์ฝ๋ ํ๋ฆ๋๋ก ์๊ฐํด๋ณด๋ฉด app.js์์ ๋จผ์ require ํจ์๋ก routes ํด๋์์ index.jsํ์ผ๊ฐ์ ธ์์ ๋ฃจํธ๊ฒฝ๋ก๋ก ์ค๋ฉด index.js๋ก ๋๊ฒจ์ง๊ณ index.js์์ router๋ฅผ ์ด์ฉํด ๊ฒฝ๋ก๋ง ๋๋ ์ฃผ๊ณ controller/Cmain ๊ฒฝ๋ก์ ์๋ Cmain.jsํ์ผ์ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. (ํจ์ ์ด๋ฆ์ ๋ง์ ๋๋ก) ์์ ์์ฑํ ์ฝ๋์ฒ๋ผ ๊ฒฝ๋ก๋ณ๋ก ๋ผ์ฐํ
ํด์ ํด๋น ๋ผ์ฐํฐ์์ ๋ฏธ๋ค์จ์ด ํจ์๋ง ๋ถ๋ฌ์ค๋๋ค.
Controller/Cmain.js ์์๋ ์์์ ํธ์ถํ ํจ์์ ์ด๋ฆ๋๋ก ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ๋ง๋ค์ด์ค๋๋น
+) ํ๊ณ
MVCํจํด์ ์ด๋ก ์ผ๋ก๋ง ๋ฐฐ์ ์ง ์ง์ ๋ฆฌํฉํ ๋ง๊น์ง ํด๋ณธ๊ฑด ์ฒ์์ด๋ผ ์ฌ๋ฐ์๋ค. ์ค์ตํ๊ธฐ ์ ๊น์ง,.,, ๋ฆฌ๋๋์ด ์ดํดํ๋๊ณ ํ ๋ ๋ ค๋ฌ๋ผ๊ณ ํ์ค๋๋ ์์ ์๊ฒ 1์ ๋ณด๋์ง๋ง ์ค์ตํ๋ฉด์ ๋ณด๋๊น ๋ 1์ด ์๋๋ผ 50์ ๋๋ ๋ณด๋์ด์ผ ๋ฌ๋ค..,.,, ํธํํํํํ ๊ฐ ์์ฒญ์ ๋ฐ๋ผ ์ด๋์ ์ด๋๋ก ์ด๋ํ๊ณ ์ด๋ป๊ฒ ๋์์ด ์ด๋ฃจ์ด์ง๋์ง๋ ์ดํดํ์ง๋ง ..์๋ ์ดํด๋ชปํ๊ฑด๊ฐ ํธํํ ๊ณ์ ๋ณด๋ฉด์ MVC ํจํด์ด๋ ์นํด์ ธ์ผ๊ฒ ๋ค.,, ๋ฆฌํฉํ ๋ง ํ๋ฉด์ ์ด๊ฑฐ ๋๋.,,,? ์ ๋ฐ!!!!! ์ด๋ฌ๋ฉด์ ์ค์ตํ๋ ๊ฒ ๊ฐ๋ค. ์๋ง ๋ด๊ฐ ์ ๋๋ก ์ดํด๋ชปํ ํ์ด๊ฒ ์ง,, ใ
..
'SeSAC > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 07W_19_01 : MYSQL ์ฐ๋ํ๊ธฐ (0) | 2023.08.29 |
---|---|
๋น๋๊ธฐ ์ฒ๋ฆฌ (0) | 2023.08.15 |
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 4W_11 _01: Node.js + Module + Express (0) | 2023.08.09 |
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 2W_06 _04: javascript Event (0) | 2023.08.04 |
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 2W_06 _03: javascript DOM (0) | 2023.08.02 |