Node-js-3

Node-js - Log in ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ


๋กœ๊ทธ์ธ์—์„œ ์•„์ด๋””, ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ, ์„œ๋ฒ„์—์„œ ์ž…๋ ฅ๊ฐ’ ๋น„๊ต, ์ฒ˜๋ฆฌ DOM, fetch, Restful API bodyParser, .then โ€”

DOM์œผ๋กœ HTML ๊ฐ์ฒด ์ œ์–ดํ•˜๊ธฐ | ํ”„๋ŸฐํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ •๋ณด๋ฅผ โ€˜๋กœ๊ทธ์ธโ€™ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ๋•Œ, ์„œ๋ฒ„๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…
DOM์„ ์ด์šฉํ•ด์„œ ํ•œ๋‹ค. (document.queryselector) html ๊ฐ’์„ ์ด์šฉํ•œ๋‹ค.

js์—์„œ ejs ๋‚ด์— ์žˆ๋Š” ๊ฐ’์— ์ ‘๊ทผ ๋ถˆ๊ฐ€.. ์™œ๋ƒํ•˜๋ฉด js๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
-> script์— โ€˜deferโ€™๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์ž. (async?)

<script src="/js/home/login.js" defer></script>

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›๋Š”๋‹ค.

fetch | ํ”„๋ŸฐํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

๊ฒฝ๋กœ๋Š” ๋ณดํ†ต ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„œ๋ฒ„ ๊ฒฝ๋กœ ๊ฐœ๋ฐœ ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐ ๊ทธ ํ•ด๋‹น ๊ฒฝ๋กœ์—๋Š” ์ด๋ฏธ API๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
API ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค๋Š” ๊ฐ€์ •์„ ํ•˜๊ณ  ์ „๋‹ฌ ๊ณผ์ • ๊ฐœ๋ฐœ.

fetch๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ๊ฒฝ๋กœ์— ์ „๋‹ฌ์„ ํ•ด์ค€๋‹ค.

fetch("/login", {
  method: "POST", //restful API? -> ๋ฉ”์„œ๋“œ ์ด์šฉ
  header: {
    "Content-Type": "apaplication/json",
  },

  body: JSON.stringify(req), // ๋ฐ์ดํ„ฐ
});

body์— ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์–ด์„œ ๋ณด๋‚ด๋Š”๋ฐ method์™€ header๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
-> method, header๋Š” RESTful API๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

REST API(RESTful API, ๋ ˆ์ŠคํŠธํ’€ API)๋ž€?
REST ์•„ํ‚คํ…์ฒ˜์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. REST๋Š” Representational State Transfer์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค.

API(Application Programming Interface)๋ž€?
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ํ†ตํ•ฉํ•˜๋Š” ์ •์˜ ๋ฐ ํ”„๋กœํ† ์ฝœ ์„ธํŠธ์ž…๋‹ˆ๋‹ค.
๋•Œ๋•Œ๋กœ API๋Š” ์ •๋ณด ์ œ๊ณต์ž์™€ ์ •๋ณด ์‚ฌ์šฉ์ž ๊ฐ„์˜ ๊ณ„์•ฝ์œผ๋กœ ์ง€์นญ๋˜๋ฉฐ ์†Œ๋น„์ž์—๊ฒŒ ํ•„์š”ํ•œ ์ฝ˜ํ…์ธ (ํ˜ธ์ถœ)์™€ ์ƒ์‚ฐ์ž์—๊ฒŒ ํ•„์š”ํ•œ ์ฝ˜ํ…์ธ (์‘๋‹ต)๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ ์”จ ์„œ๋น„์Šค์šฉ API์—์„œ๋Š” ์‚ฌ์šฉ์ž๋Š” ์šฐํŽธ๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์ƒ์‚ฐ์ž๋Š” ๋‘ ๋ถ€๋ถ„(์ฒซ ๋ฒˆ์งธ๋Š” ์ตœ๊ณ  ๊ธฐ์˜จ, ๋‘ ๋ฒˆ์งธ๋Š” ์ตœ์ € ๊ธฐ์˜จ)์œผ๋กœ ๊ตฌ์„ฑ๋œ ์‘๋‹ต์œผ๋กœ ๋‹ตํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜: Redhat-Restful API

์ž์„ธํ•œ ์„ค๋ช…. ์ถœ์ฒ˜:link

Rest : ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด, ์‚ฌ์ดํŠธ ๊ตฌ์„ฑ ์›๋ฆฌ, ์‚ฌ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€?
์ฆ‰, Restful API๋Š” Rest๋ฐฉ์‹์„ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์˜๋ฏธ

(REpresntatiional : ํ‘œํ˜„, State : ์ƒํƒœ, Transter : ์ „์†ก) : ์ž์›์˜ ํ‘œํ˜„์„ ๊ฐ€์ง€๊ณ  ์ž์›์„ ์ „์†กํ•œ๋‹ค.

์ž์›(Resource) : URI

  • /feed/subscriptions

ํ‘œํ˜„(Representational) : Header ex) ๋ฐ›๊ณ  ์‹ถ์€ ์‘๋‹ต ํƒ€์ž…, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ์‘๋‹ต ํƒ€์ž…

  • โ€œContent-Typeโ€ : โ€œtext/htmlโ€, โ€œimage/gifโ€
  • โ€œAcceptโ€ : โ€œtext/htmlโ€, โ€œimage/pngโ€

์ƒํƒœ(State) : Method (HTTP method)

  • GET ์กฐํšŒ, POST ์ƒ์„ฑ, PUT ์ˆ˜์ •, DELETE ์‚ญ์ œ, PATCH ์ž์›์˜ ์ผ๋ถ€ ์ˆ˜์ •..etc

Restful API ์„ค๊ณ„ ์›์น™ : 1๋ฒˆ๋งŒ ์„ค๊ณ„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 2~6๋ฒˆ์€ ์•Œ์•„์„œ ์„ค๊ณ„๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

  1. Uniform Interface
  2. StateLess
  3. Cacheable
  4. Code on demand
  5. Layered System
  6. Client / Server

์ถœ์ฒ˜: woorimIT

๋กœ๊ทธ์ธ API ๋งŒ๋“ค๊ธฐ in ์„œ๋ฒ„ | ํ”„๋ŸฐํŠธ์˜ ์š”์ฒญ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ

rendering ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ output ๊ฐ์ฒด๋กœ ๋„ฃ์–ด ๋ถ„๋ฆฌํ•ด์ค€๋‹ค.

const output = {
home: (req, res) => {
res.render("home/index");
},

login: (req, res) => {
res.render("home/login");
},
};

login.js์—์„œ requestํ•ด์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ home.ctrl.js์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ๊ทธ๋ฆฌ๊ณ  index.js์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณธ๋‹ค.

login.js

function login() {
const req = {
id: id.value,
pwd: pwd.value,
};

fetch("/login", {
method: "POST", //restful API? -> ๋ฉ”์„œ๋“œ ์ด์šฉ
header: {
"Content-Type": "application/json",
},
body: JSON.stringify(req), // ๋ฐ์ดํ„ฐ
});
}

home.ctrl.js

const process = {
login: (req, res) => {
console.log(req.body);
},
};

index.js

router.post("/login", ctrl.process.login);

ํ•˜์ง€๋งŒ ์•„์ง ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. -> body parsing ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ ์„ค์น˜

app.js
const bodyParser = require("body-parser");

terminal npm i body-parser -s ( -s : save๋ผ๋Š” ์˜๋ฏธ๋กœ packages์•ˆ์— dependencies์•ˆ์— ๋ช…์‹œ๋œ๋‹ค. )

๊ทธ๋ž˜๋„ ์•ˆ๋œ๋‹ค. -> ๋ฏธ๋“ค์›จ์–ด ๋“ฑ๋กํ•ด์ค˜์•ผํ•œ๋‹ค.

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

-> deprecated ์˜ค๋ฅ˜ : ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ผ๋Š” ๋œป์œผ๋กœ, express ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

**๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ, ์ €์žฅ๋ฒ„ํŠผ ์—ฐ์†์œผ๋กœ ๋ˆ„๋ฅด์ง€ ๋ง๊ธฐ -> ์ด๊ฑฐ ๋•Œ๋ฌธ์— ์ž ์‹œ ์˜ค๋ฅ˜ ์ƒ๊ธด๋“ฏ ?

๋กœ๊ทธ์ธ ์ธ์ฆ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ in ์„œ๋ฒ„ | ์œ ์ € ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

๋กœ๊ทธ์ธ ์‹œ์— ์„œ๋ฒ„์— ์žˆ๋Š” ์ •๋ณด์™€ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.
ํ™•์ธํ•  users ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  req๊ฐ€ ์™”์„ ๋•Œ ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ธ process์— user์™€ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜์™€ response๋ฅผ return ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

home.ctrl.js

const users = {
id: ["hyunsoo", "rlagustn", "gustn"],
pwd: ["1234", "5678", "9012"],
};

const process = {
login: (req, res) => {
const id = req.body.id,
pwd = req.body.pwd;

    if (users.id.includes(id)) {
      const idx = users.id.indexOf(id);
      if (users.pwd[idx] === pwd) {
        return res.json({
          success: true,
        });
      }
    }

    return res.json({
      success: false,
      msg: "๋กœ๊ทธ์ธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.",
    });

},
};

res.json์„ ํ†ตํ•ด ์‘๋‹ต์„ ๋‚ ๋ ธ์„ ๋•Œ, reqํ–ˆ๋˜ ํ•จ์ˆ˜(fetch)์—์„œ ์‘๋‹ตํ•จ์ˆ˜๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด .then ๋งค์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

login.js

fetch("/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(req),
}).then((res) => console.log(res.json()));

์—ฌ๊ธฐ์„œ console์„ ํ†ตํ•ด ์‘๋‹ตํ•จ์ˆ˜์˜ json๊ฐ’์ด ๋„์ฐฉํ•˜๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Promise ๊ฐ์ฒด๊ฐ€ ๋„์ฐฉํ•˜๊ฒŒ ๋œ๋‹ค.
s1

์„ค๋ช… : res.json()์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ Promise๋‹ค. ๊ธฐ๋ณธ res์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ Response ์ŠคํŠธ๋ฆผ์ธ๋ฐ, โ€œ.json()โ€ ๋งค์„œ๋“œ๋ฅผ ํ†ตํ•ด Response(์‘๋‹ต) ์ŠคํŠธ๋ฆผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
Response๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๋ฐ›์•„์ง„ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค. โ€œ.json()โ€์œผ๋กœ Response ์ŠคํŠธ๋ฆผ์„ >๊ฐ€์ ธ์™€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ฝ๋Š”๋‹ค. ๋‹ค ์ฝ์€ body์˜ ํ…์ŠคํŠธ๋ฅผ Promise ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
-> ๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ..

then์„ ํ•œ๋ฒˆ์จ์„œ res๋ฅผ ๋ณด์ด๊ฒŒ ํ•˜๋ฉด ๊ฐ์ฒด ์•ˆ์— ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ๋œ๋‹ค.

.then((res) => res.json())
.then(console.log);

s2

์„œ๋ฒ„์˜ ์‘๋‹ต๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

thenํ›„ ์‘๋‹ต ๊ฐ’์— ๋”ฐ๋ฅธ ์กฐ๊ฑด์„ ์„ค์ •ํ•ด์ค€๋‹ค.

.then((res) => res.json())
.then((res) => {
if (res.success) {
location.href = "/";
} else {
alert(res.msg);
}
})
.catch((err) => {
console.error(new Error("๋กœ๊ทธ์ธ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ"));
});

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: