
1강-설치
2강-VS Code 다운로드
3강-Nodejs 실행
4강-NPM 명령어
5강-자신만의 Module 만들기
6강-Core Module (readline)
7강-Core Module (file system)
8강-Sync와 Async (동기 vs 비동기)
9강-단어장 App Overview
10강-NPM 패키지 (3rd party module)
11강-JSON 읽고 쓰기
12강-HTTP 서버 만들기
13강-Express로 서버 만들기
14강-Express 기초 원리와 HTML 보내는 방법
15강-Middleware
16강-Template (Handlebars)
17강-Semantic-ui 적용
18강-간단한 Layout 만들기
19강-Handlebars Array를 Each사용하여 나타내기
20강-Post Request와 Body Parser 사용
21강-Delete Request 보내는 방법
강의 : https://www.youtube.com/playlist?list=PLHGvDasahwZMko2OayS24NEzWYf3sMq2w
소스 : https://github.dev/DannyTWLC/complete-nodejs-code
https://github.dev/braverokmc79/Nodejs-conquer
1강-설치
nodejs 다운로드
https://nodejs.org/ko/download/
2강-VS Code 다운로드
vscode 다운로드
https://code.visualstudio.com/download
3강-Nodejs 실행
4강-NPM 명령어
5강-자신만의 Module 만들기
stat.js
exports.pi = 3.14;
const mean = (...arr) => {
if (arr.length === 0) {
return 0;
}
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum / arr.length;
};
exports.mean = mean;
app.js
console.log("Hello from Daniel");
const add = require("./add");
const mult = require("./mult");
const stat = require("./stat");
const result1 = add(1, 2);
const result2 = mult(10, 2);
console.log(result1, result2);
console.log(stat.pi, stat.mean(1, 2, 3, 4, 5));
실행
$ node app.js
6강-Core Module (readline)
7강-Core Module (file system)
8강-Sync와 Async (동기 vs 비동기)
9강-단어장 App Overview
10강-NPM 패키지 (3rd party module)
$ npm install express
$ npm install readline-sync
11강-JSON 읽고 쓰기
app.js
const fs = require("fs");
const data = fs.readFileSync("./vocab.json", { encoding: "utf-8" });
let arr = JSON.parse(data);
console.log(arr);
const ob = {
name: "Daniel",
age: 20,
description: "I go to school.",
};
fs.writeFileSync("test.json", JSON.stringify(ob, null, 2));
vocab.json
[
{
"word": "Eat",
"definition": [
"먹다",
"식사를 하다"
],
"examples": [
{
"sentence": "I eat an apple",
"definition": "저는 사과를 먹습니다."
},
{
"sentence": "I cat't eat that.",
"definition": "나는 저것을 먹을 수 없다."
}
]
},
{
"word": "Learn",
"definition": [
"배우다",
"학습하다"
],
"examples": [
{
"sentence": "I learn English.",
"definition": "저는 영어를 배웁니다."
},
{
"sentence": "Programming languages are fun to learn.",
"definition": "프로그래밍 언어를 배우는 것은 정말 재미있는 일입니다."
}
]
}
]
12강-HTTP 서버 만들기
app.js
const http = require("http");
const server = http.createServer((req, res) => {
if (req.url === "/") {
res.write("<h1>Hello from nodejs</h1>");
} else {
res.write(`<h1>You have entered this url : ${req.url}</h1>`);
}
res.end();
});
server.listen(3000, () => {
console.log("The server is listening on port 3000");
});
13강-Express로 서버 만들기
app_13.js
const express = require("express");
const server = express();
server.get("/", (req, res) => {
res.send("<h1></h1>")
});
server.listen(3000, (err) => {
if (err) return console.log(err);
console.log("The server is listening on port 3000");
})
14강-Express 기초 원리와 HTML 보내는 방법
app_14.js
const express = require("express");
const server = express();
server.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
server.get("/about", (req, res) => {
res.sendFile(__dirname + "/about.html");
});
server.listen(3000, (err) => {
if (err) return console.log(err);
console.log("The server is listening on port 3000");
});
15강-Middleware
app_15.js
const express = require("express");
const server = express();
server.use(express.static(__dirname + "/public"));
server.get("/", (req, res) => {
res.sendFile(__dirname + "/index.html");
});
server.get("/about", (req, res) => {
res.sendFile(__dirname + "/about.html");
});
server.use((req, res) => {
res.sendFile(__dirname + "/404.html");
});
server.listen(3000, (err) => {
if (err) return console.log(err);
console.log("The server is listening on port 3000");
});
16강-Template (Handlebars)
nodemon 설치
$ npm install nodemon --save-dev
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "nodemon ./app.js"
},
실행
$npm run dev
뷰템플릿 설치
$ npm install express-handlebars
app.js
const express = require("express");
const hbs = require("express-handlebars");
const server = express();
server.use(express.static(__dirname + "/public"));
server.set("view engine", "hbs");
server.engine(
"hbs",
hbs.engine({
extname: 'hbs',
defaultLayout: 'layout',
layoutsDir: __dirname + '/views/layouts/',
partialsDir: __dirname + '/views/partials'
}
));
server.get("/", (req, res) => {
res.render("home", { message: "Hello from node.js", });
});
server.use((req, res) => {
res.sendFile(__dirname + "/404.html");
});
server.listen(3000, (err) => {
if (err) return console.log(err);
console.log("The server is listening on port 3000");
});
17강-Semantic-ui 적용
views/layouts/layout.hbs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="/semantic/semantic.min.css" />
<script src="/semantic/semantic.min.js"></script>
</head>
<body>
{{{ body }}}
</body>
</html>
views/home.hbs
<h1>{{ message }}</h1>
<button class="ui button red">
Hello
</button>
18강-간단한 Layout 만들기
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "nodemon ./app.js -e js,json,mjs,hbs"
},
app.js
const express = require("express");
const hbs = require("express-handlebars");
const server = express();
server.use(express.static(__dirname + "/public"));
server.set("view engine", "hbs");
server.engine(
"hbs",
hbs.engine({
extname: 'hbs',
defaultLayout: 'layout',
layoutsDir: __dirname + '/views/layouts/',
partialsDir: __dirname + '/views/partials/'
}
));
server.get("/", (req, res) => {
res.render("home", { message: "Hello from node.js", });
});
server.get("/add", (req, res) => {
res.render("add");
});
server.get("/quiz", (req, res) => {
res.render("quiz");
});
server.use((req, res) => {
res.sendFile(__dirname + "/404.html");
});
server.listen(3000, (err) => {
if (err) return console.log(err);
console.log("The server is listening on port 3000");
});
quiz.hbs
<div class="ui main text container">
<h1 class="ui header">Quiz</h1>
</div>
home.hbs
<div class="ui main text container">
<h1 class="ui header">Semantic UI Fixed Template</h1>
<p>This is a basic fixed menu template using fixed size containers.</p>
<p>A text container is used for the main container, which is useful for single column layouts</p>
</div>
add.hbs
<div class="ui main text container">
<h1 class="ui header">Add</h1>
</div>
404.hbs
<div class="ui main text container">
<h1 class="ui header">Error 404 - Page Not Found</h1>
</div>
19강-Handlebars Array를 Each사용하여 나타내기
views/home.hbs
<div class="ui main text container">
<h1 class="ui header">Semantic UI Fixed Template</h1>
{{#each words}}
<div class="card flex-box">
<div class="flex-1 main-word">
<h1>{{this.word}}</h1>
</div>
<div class="flex-1 word-list">
<ul>
{{#each this.definition}}
<li>{{this}}</li>
{{/each}}
</ul>
</div>
</div>
{{/each}}
</div>
public/styles/index.css
.flex-box {
display: flex;
}
.flex-1 {
flex: 1;
}
.flex-2 {
flex: 2;
}
.flex-3 {
flex: 3;
}
.flex-4 {
flex: 4;
}
.flex-5 {
flex: 5;
}
.flex-6 {
flex: 6;
}
.flex-7 {
flex: 7;
}
.card {
border: 1px solid black;
border-radius: 5px;
align-items: center;
display: flex;
flex-wrap: wrap;
}
.main-word {
text-align: center;
min-width: 300px;
}
.word-list {
min-width: 300px;
}
views/layouts/layout.hbs
<link href="/styles/index.css" rel="stylesheet" />
20강-Post Request와 Body Parser 사용
body-parser 설치
$ npm install body-parser
app.js
const express = require("express");
const hbs = require("express-handlebars");
const words = require("./db/words.json");
const bodyParser = require("body-parser");
const server = express();
server.use(express.static(__dirname + "/public"));
server.set("view engine", "hbs");
server.engine(
"hbs",
hbs.engine({
extname: 'hbs',
defaultLayout: 'layout',
layoutsDir: __dirname + '/views/layouts/',
partialsDir: __dirname + '/views/partials/'
}
));
server.use(bodyParser.urlencoded({ extended: false }))
server.get("/", (req, res) => {
res.render("home", { words });
});
server.post("/", (req, res) => {
const { query } = req.body;
const wordsFilter = words.filter((w) =>
w.word.toLowerCase().includes(query.toLowerCase())
);
res.render("home", { words: wordsFilter });
});
server.get("/add", (req, res) => {
res.render("add");
});
server.get("/quiz", (req, res) => {
res.render("quiz");
});
server.use((req, res) => {
res.sendFile(__dirname + "/404.html");
});
server.listen(3000, (err) => {
if (err) return console.log(err);
console.log("The server is listening on port 3000");
});
views/home.hbs
<form method="POST" action="/">
<div class="ui action input fluid">
<input type="search" placeholder="Search..." name="query">
<button class="ui button" type="submit">Search</button>
</div>
</form>
21강-Delete Request 보내는 방법
views/layouts/layout.hbs
<script src="https://code.jquery.com/jquery-3.5.1.min.js"
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
public/styles/index.css
.card {
border: 1px solid black;
border-radius: 5px;
align-items: center;
display: flex;
flex-wrap: wrap;
}
.main-word {
text-align: center;
min-width: 300px;
}
.word-list {
min-width: 300px;
}
.card {
position: relative;
border: 1px solid black;
border-radius: 5px;
align-items: center;
display: flex;
flex-wrap: wrap;
}
.main-word {
text-align: center;
min-width: 300px;
}
.word-list {
min-width: 300px;
}
.delete-btn{
position:absolute;
top: 50%;
right: 10px;
transform:translateY(-50%);
cursor:pointer;
}
views/home.hbs
<div class="ui main text container">
<h1 class="ui header">Semantic UI Fixed Template</h1>
<form method="POST" action="/">
<div class="ui action input fluid">
<input type="search" placeholder="Search..." name="query">
<button class="ui button" type="submit">Search</button>
</div>
</form>
{{#each words}}
<div class="card flex-box">
<div class="flex-1 main-word">
<h1>{{this.word}}</h1>
</div>
<div class="flex-1 word-list">
<ul>
{{#each this.definition}}
<li>{{this}}</li>
{{/each}}
</ul>
</div>
<div class="delete-btn" onclick="deleteWord(this, '{{this.word}}')">
<div>X</div>
</div>
</div>
{{/each}}
</div>
<script>
const deleteWord = (el, word) => {
$.ajax("/", {
method: "DELETE",
data: {
word,
}
})
let p = el.parentNode.parentNode;
let c = el.parentNode;
p.removeChild(c)
}
</script>














댓글 ( 4)
댓글 남기기