[ํฌ์Šค์ฝ” x ์ฝ”๋”ฉ์˜จ] ์›น ๊ฐœ๋ฐœ์ž ๋ถ€ํŠธ์บ ํ”„ 7์ฃผ์ฐจ ์ˆ˜์—… ํšŒ๊ณ 

2023. 3. 14. 00:04ใ†Coding On X Posco

 

๐Ÿฏ  ํฌ์Šค์ฝ” x ์ฝ”๋”ฉ์˜จ ์›น๊ฐœ๋ฐœ์ž ๋ถ€ํŠธ์บ ํ”„ 7์ฃผ์ฐจ ์ˆ˜์—… ํšŒ๊ณ  

 

1.  ๋ฐฑ์—”๋“œ ์‹œ์ž‘

๋ฐฑ์—”๋“œ - ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ

ํ”„๋ก ํŠธ์—”๋“œ - ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ฃผ๋ณด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ด€๋ฆฌ

 

 

http? - HyperTextTransferProtocol์˜ ์•ฝ์ž๋กœ ์›น์ƒ์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„๋•Œ ์“ฐ์ด๋Š” ํ”„๋กœํ† ์ฝœ(ํ†ต์‹  ๊ทœ์•ฝ) ์ด๋‹ค. ์„œ๋ฒ„์ธก๊ณผ ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

API?

- Aplication Programming Interface

- ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ๊ทœ์•ฝ์ด๋‹ค.

- ์˜ˆ๋ฅผ๋“ค์–ด ์„œ๋ฒ„์ธก์€ java, ํ”„๋ก ํŠธ์—”๋“œ์ธก์€ javascript๋กœ ๋˜์–ด์žˆ๋‹ค๋ฉด api๊ฐ€ ์„œ๋กœ์˜ ๋ง๋กœ ํ†ต์—ญ์„ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

ํ”„๋ก ํŠธ์—์„œ ๋ฐฑ์—”๋“œ์—๊ฒŒ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์„œ ๊ทธ๋ ค์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

api๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‹€์„ ์งœ๋†“๊ณ  Back End data๋งŒ ๋ณ€๊ฒฝ๋˜๋ฉด ์•Œ์•„์„œ ๋ฐ”๋€๋‹ค.

 

2. Node-JS

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ๋Š” V8 ์—”์ง„์„ ํ™œ์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค. Node์•ˆ์—์„œ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

Nod-JS๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ผ ์–ด๋А ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ž‘ํ•˜๋ฉฐ ์„ฑ๋Šฅ์ด ๋น ๋ฅด๊ณ  ์ข‹๋‹ค. ๋˜ํ•œ ๋ฐฉ๋Œ€ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์ƒํƒœ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

npm? - Node Package Manager, ์ง์ ‘ ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” node package๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. node.js ๊ด€๋ จ package์˜ ๋ชจ๋“  ์ •๋ณด๋Š” ์ƒ์„ฑ๋˜๋Š” Package.json ํŒŒ์ผ์— ๋“ค์–ด๊ฐ„๋‹ค.

 

 

3. JSON

- javascript object notation์˜ ์•ฝ์ž๋กœ js์˜ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์†์„ฑ๊ณผ ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์Œ์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ์ฒดํ˜• ์ž๋ฃŒ์ด๋‹ค.

- ์„œ๋ฒ„ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ํฌ๋งท์ด๋ฏ€๋กœ ์‰ฝ๊ฒŒ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ๋Œ€ํ•œ ์••์ถ• ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

- ์‚ฌ๋žŒ์˜ ๋ˆˆ์—๋Š” ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ๋กœ ์ „๋‹ฌ ๋  ๋•Œ์—๋Š” ํ•˜๋‚˜์˜ ๊ธด ๋ฌธ์ž์—ด ์ฒ˜๋Ÿผ ์ „๋‹ฌ๋œ๋‹ค.

- ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ๊ณณ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ JSONํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.

- ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์€ ์‹œ์Šคํ…œ์—์„œ๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ์‹œ์Šคํ…œ์— ๋งž๋Š” ์ž๋ฃŒํ˜•์œผ๋กœ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•ด์„œ ์“ด๋‹ค.

 

 

4. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

- ๋™๊ธฐ, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋™๊ธฐ - ํ•˜๋‚˜์˜ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ํ›„์— ๋‹ค์Œ ์š”์ฒญ์„ ์‹คํ–‰ํ•œ๋‹ค.

๋น„๋™๊ธฐ - ํ•˜๋‚˜์˜ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋‹ค์Œ ์š”์ฒญ์„ ์‹คํ–‰ํ•œ๋‹ค.

Node.js๋Š” ๋น„๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

- ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‹จ์ 

์„œ๋ฒ„ ํ†ต์‹ ์„ ํ•  ๋•Œ์—๋Š” ๋™๊ธฐ์ (์ ˆ์ฐจ์ )์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š”๋ฐ node.js๋Š” ๋น„๋™๊ธฐ์  ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ ์ฒ˜๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด js์—์„œ ์ง€์›ํ•˜๋Š” ๋ฐฉ์‹œ๊ธฐ callback์ด๋‹ค. 

 

5. Callback ํ•จ์ˆ˜

- callback ํ•จ์ˆ˜๋Š” ํŠน์ • ํ•จ์ˆ˜์˜ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜์–ด์•ผ๋งŒ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

- callback์€ ํ•จ์ˆ˜์— ๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ ๋œ ์‹œ์ ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

- callback์œผ๋กœ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

function buySync(item, price, quantity, callback) {
console.log(`${item} ์ƒํ’ˆ์„ ${quantity} ๊ฐœ ๊ณจ๋ผ์„œ ์ ์›์—๊ฒŒ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.`);
setTimeout(function () {
console.log("๊ณ„์‚ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค."); 
const total = price * quantity; callback(total);
}, 1000); }


// function pay(tot) {
// console.log(`${tot} ์›์„ ์ง€๋ถˆํ•˜์˜€์Šต๋‹ˆ๋‹ค.`); // }
buySync('ํฌ์ผ“๋ชฌ๋นต', 1000, 5, function (total) { console.log(`${total} ์›์„ ์ง€๋ถˆํ•˜์˜€์Šต๋‹ˆ๋‹ค.`);
});

 

- CallbackHell : ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ ˆ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ฝœ๋ฐฑ์•ˆ์— ์ฝœ๋ฐฑ์•ˆ์— ์ฝœ๋ฐฑ์•ˆ์—... ์•„์ฃผ ๋ณด๊ธฐ ํž˜๋“  ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํƒ„์ƒํ•จ

const fs = require('fs');
backend/file.js
fs.readFile('./readme.txt', (err, data) => {
  if (err) {
throw err; }
console.log('1๋ฒˆ', data.toString()); });
fs.readFile('./readme.txt', (err, data) => { if (err) {
throw err; }
console.log('2๋ฒˆ', data.toString()); });
fs.readFile('./readme.txt', (err, data) => {
  if (err) {
throw err; }
console.log('3๋ฒˆ', data.toString()); });
fs.readFile('./readme.txt', (err, data) => { if (err) {
throw err; }
console.log('4๋ฒˆ', data.toString()); });

ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋ฉด js์˜ ๋น„๋™๊ธฐ์  ํŠน์„ฑ์— ๋”ฐ๋ผ ์ฐจ๋ก€๋Œ€๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๋Š”๋‹ค.

๋‹ค์Œ์„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์„œ ๋™๊ธฐ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿผ Callback Hell์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

const fs = require('fs');
fs.readFile('./readme.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log('1๋ฒˆ', data.toString());
  fs.readFile('./readme.txt', (err, data) => {
    if (err) {
      throw err;
    }
    console.log('2๋ฒˆ', data.toString());
    fs.readFile('./readme.txt', (err, data) => {
      if (err) {
        throw err;
      }
      console.log('3๋ฒˆ', data.toString());
      fs.readFile('./readme.txt', (err, data) => {
        if (err) {
          throw err;
        }
        console.log('4๋ฒˆ', data.toString());
      });
    });
  });
});

์ด๋Ÿฌํ•œ Callback Hell์„ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด promise๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

6. Promise

- promise๋Š” ์ƒ์„ฑ์ž์ด๋ฏ€๋กœ new๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

const promise = new Promise(function(resolve, reject){});

- resolve, reject๋ผ๋Š” 2๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค.

- promise๊ฐ€ ํ• ๋‹น๋˜๋ฉด promise๋Š” reslove๋˜๋Š” reject ํ•จ์ˆ˜๊ฐ€ callback ๋  ๋•Œ ๊นŒ์ง€ ๋ฌดํ•œ ๋Œ€๊ธฐํ•œ๋‹ค.

- resolve๋Š” Promise๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ดํ–‰ ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉฐ, reject๋Š” ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

- resosve๋Š” ์ถ”ํ›„์— then์œผ๋กœ ๋ฐ›์œผ๋ฉฐ reject๋Š” catch๋กœ ๋ฐ›๋Š”๋‹ค.

- resolve, reject๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด promise๋Š” ํ•ด๋‹น ์ฝœ๋ฐฑ์ด ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ pending(๋Œ€๊ธฐ) ์ƒํƒœ๊ฐ€ ๋˜์–ด ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด promise chaining์„ ํ†ตํ•ด Callback Hell์„ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

const fs = require('fs').promises;
fs.readFile('./readme.txt')
  .then((data) => {
    console.log('1๋ฒˆ', data.toString());
    return fs.readFile('./readme.txt');
  })
  .then((data) => {
    console.log('2๋ฒˆ', data.toString());
    return fs.readFile('./readme.txt');
  })
  .then((data) => {
    console.log('3๋ฒˆ', data.toString());
    return fs.readFile('./readme.txt');
  })
  .then((data) => {
    console.log('4๋ฒˆ', data.toString());
  })
  .catch((err) => {
    throw err;
  });

 

7.  Async, Await

- Function ์•ž์— async๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- ์ฆ‰ async๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜์—์„œ return์„ ์“ฐ๋ฉด ๋‹ค์Œ๊ณผ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

async function f1(){
	return 1;
}

async function f2(){
	return Promise.resolve(1);
}

- async๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๋ฐ await๋Š” promise๊ฐ€ ๊ฒฐ๊ณผ(resolve, reject)๋ฅผ ๊ฐ€์ ธ๋‹ค ์ค„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

- async๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์“ฐ์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ์ •์˜ ํ›„ ํ•ด๋‹นํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด ์ค˜์•ผํ•œ๋‹ค.

- promise๋Š” ๊ธฐ์กด์— js์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— promise๋ฅผ ๊ธฐ์กด ์ฝ”๋“œ ์Šคํƒ€์ผ๋กœ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๊ฒƒ์ด Async, Await์ด๋‹ค.(syntatic sugar)

- async await๋กœ promise chaining์„ ๋ณ€๊ฒฝ

const fs = require('fs').promises;
async function main() {
  let data = await fs.readFile('./readme.txt');
  console.log('1๋ฒˆ', data.toString());
  data = await fs.readFile('./readme.txt');
  console.log('2๋ฒˆ', data.toString());
  data = await fs.readFile('./readme.txt');
  console.log('3๋ฒˆ', data.toString());
  data = await fs.readFile('./readme.txt');
  console.log('4๋ฒˆ', data.toString());
}
main();

 

8.  Express ์‚ฌ์šฉํ•˜๊ธฐ

- Middleware: ์„œ๋กœ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด,์–‘์ชฝ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ€์šด๋ฐ์„œ ์—ญํ• ์„ ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด

- express๋Š” ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋งž๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„œ๋น„์Šค ๋ฏธ๋“ค์›จ์–ด ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค.

- ์ฆ‰, express์˜ ๋ฏธ๋“ค์›จ์–ด๋Š” ์„œ๋ฒ„์— ๋“ค์–ด์˜จ ์š”์ฒญ์ด ๋“ค์–ด์™€ ์‘๋‹ต์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ๊ฑฐ์น˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜ ๋˜๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.

- express์—์„œ app.use ๋˜๋Š” app.method ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

- App.use('์š”์ฒญ์ฃผ์†Œ',(req,res,next)=>{}); ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. req: ์š”์ฒญ, res: ์‘๋‹ต, next: ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰

 

๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ์‘๋‹ต ๋ณด๋‚ด๊ธฐ

const express = require('express');
const app = express();
const PORT = 4000;
app.use('/', (req, res, next) => {
  console.log('Middleware 1');
  next();
});
app.use((req, res, next) => {
  console.log('Middleware 2');
  res.send('res.send!');
  next();
});
app.use((req, res, next) => {
  console.log('Middleware 3');
});
app.listen(PORT, () => {
  console.log(`The express server is running at port: ${PORT}`);
});

 

9.  CRUD

- ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ง„ ๊ธฐ๋ณธ์ ์ธ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ธ Create Read Update Delete ๋ฅผ ๋ฌถ์–ด์„œ ์ผ์ปซ๋Š” ๋ง์ด๋‹ค.  

- http์š”์ฒญ ๋ฉ”์„œ๋“œ๋กœ Create - Post, Read - Get, Update - PUT, Delte - DELETE๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

10.  HTTP status

- http ํ†ต์‹ ์˜ ์ƒํƒœ๋ฅผ ์ฝ”๋“œ๋ฅผ ์ƒํƒœ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

- 100๋ฒˆ๋Œ€ : ์ •๋ณด/ ๋ฆฌํ€˜์Šคํ‹€ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌ์ค‘

- 200๋ฒˆ๋Œ€ : ์„ฑ๊ณต/ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ •์ƒ ์ฒ˜๋ฆฌ

- 300๋ฒˆ๋Œ€ : ๋ฆฌ๋””๋ ‰์…˜/ ์ฒ˜๋ฆฌ ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€ ๋™์ž‘ ํ•„์š”

- 400๋ฒˆ๋Œ€ : ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ/ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ์ž˜๋ชป ๋ณด๋ƒ„

- 500๋ฒˆ๋Œ€ : ์„œ๋ฒ„ ์—๋Ÿฌ/ ๋ฆฌํ€˜์ŠคํŠธ๋Š” ์ž˜ ๋“ค์–ด๊ฐ”์œผ๋‚˜ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ๋ชปํ•จ

11.  ๋ฐฑ์—”๋“œ์—์„œ ํ”„๋ก ํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• - Req.Params

- ๋ณดํ†ต ์š”์ฒญ์€ ์ฃผ์†Œ๋กœ ๋“ค์–ด์˜ค๋ฏ€๋กœ ํ”„๋ก ํŠธ์—์„œ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ •๋ณด๋Š” ์ฃผ์†Œ๊ฐ’์— ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.

- ๋ฐ›์„ url์—์„œ :ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด ๋‘๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์€ req.params์— ๋‹ด๊ฒจ์„œ ๋ฐฑ์—”๋“œ์— ์ „๋‹ฌ๋œ๋‹ค.

- ์–ด๋– ํ•œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š”์ง€ ๋ณด๋‚ด๋Š” ์ชฝ์— ์ธ์ง€์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ณด๋‚ด๋Š” paramsr๊ฐ€ ์–ด๋– ํ•œ params์ธ์ง€ ๋ช…์‹œํ•ด์„œ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

app.get('/id/:id',(req,res)=>{
	console.log(req.params);
    res.end(`ID ๋ฒˆํ˜ธ๊ฐ€ ${req.params.id}์ธ ํšŒ์› ์ •๋ณด`);
});

12.  ๋ฐฑ์—”๋“œ์—์„œ ํ”„๋ก ํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• - Query

- parmas์˜ ์•ฝ์ ์€ ์ •์˜ ๋œ ํ˜•ํƒœ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜์žˆ๋Š”๋ฐ query๋ฅผ ์“ฐ๋ฉด ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

- query๋Š” url๋’ค์— ?๋ฅผ ๋ถ™์ธ ๋’ค, ํ•„๋“œ๋ช… = ๊ฐ’ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค. ์—ฌ๋Ÿฌ๊ฐค๋ฅด ๋ณด๋‚ด๊ณ  ์‹ถ์œผ๋ฉด &๋กœ ๋ฌถ์–ด์„œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

app.get('/', (req,res) => {
	console.log(req.query);
    res.send(req.query);
});

 

13.  Express Routing

- ํ”„๋ก ํŠธ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ์—๋Š” ์ฃผ์†Œ ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ์š”์ฒญํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฑ์—”๋“œ์—์„œ๋Š” ๊ฐ๊ฐ ์ฃผ์†Œ์— ๋”ฐ๋ผ์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

- ์ด๋ ‡๊ฒŒ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๋„๋ก ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์„ Routing์ด๋ผ๊ณ  ํ•œ๋‹ค.

- express์—์„œ๋Š” app.๋ฉ”์†Œ๋“œ๋ช…();์˜ ํ˜•ํƒœ๋กœ ์š”์ฒญ ๋ฐฉ์‹์„ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

const express = require('express');
const app = express();
const PORT = 4000;
app.get('/', (req, res) => {
  res.send('GET request');
});
app.post('/', (req, res) => {
  res.send('POST request');
});
app.put('/', (req, res) => {
  res.send('PUT request');
});
app.delete('/', (req, res) => {
  res.send('DELETE request');
});

- Express์—์„œ๋Š” Routing์„ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด์ธ Router()๊ฐ€ ์กด์žฌํ•˜๊ณ  ์‚ฌ์šฉ ์‹œ ํŠน์ • url์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒƒ๋“ค์„ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค

const express = require('express');
const app = express();
const userRouter = express.Router();
const PORT = 4000;
userRouter.get('/', (req, res) => { res.end('ํšŒ์› ๋ชฉ๋ก');
});
userRouter.get('/:id', (req, res) => { res.end('ํŠน์ • ํšŒ์› ์ •๋ณด');
});
userRouter.post('/', (req, res) => { res.end('ํšŒ์› ๋“ฑ๋ก');
});
app.use('/users', userRouter);
app.use('/', (req, res) => {
  res.end('Hello, express world!');
});
app.listen(PORT, () => {
console.log(`The express server is running at port: ${PORT}`);

 

14.  ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ๋™์ ์ธ ์›น ๊ทธ๋ฆฌ๊ธฐ

- res.write๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ทธ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

userRouter.get('/show', (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html;charset=UTF-8' });
  res.write('<h1>hello, Dynamic Web page</h1>');
  for (let i = 0; i < USER.length; i++) {
    res.write(`<h2>USER id is ${USER[i].id}`);
    res.write(`<h2>USER name is ${USER[i].name}`);
  }
  res.end('');
});

- ํ•˜์ง€๋งŒ css์„ค์ •, ๋‚ด๋ถ€ js์ฝ”๋“œ๋ถˆ๋Ÿฌ์˜ค๊ธฐ, ๋“ฑ๋“ฑ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“  ๋ถ€๋ถ„์ด ๋งŽ๊ณ  ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋กœ ์›น์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” view engine์„ ์ด์šฉํ•˜๋ฉด ๋‹จ์ ๋“ค์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋ทฐ์—”์ง„๋“ค์˜ ํŠน์ง•

15.  ejs ์‚ฌ์šฉํ•˜๊ธฐ

- npm์œผ๋กœ ejs๋ฅผ ์„ค์น˜ํ•˜๊ณ  express์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์–ด๋–ค viewEngine์œผ๋กœ ์›นํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ฆด ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

app.set('view engine', 'ejs');

- ์„œ๋ฒ„ํด๋” ๊ฐ€์žฅ ์™ธ๋ถ€์— views ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด index.ejs ํŒŒ์ผ์„ ๋„์šด๋‹ค.

userRouter.get('/ejs', (req, res) => {
  res.render('index');
});

- ejs๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” res.render('ejsํŒŒ์ผ๋ช…',{๋„˜๊ธธ๋ฐ์ดํ„ฐ}); ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๋ฉฐ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

- ์˜ค๋ธŒ์ ํŠธ๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋Š” ejsํŒŒ์ผ์—์„œ <%= %>์•ˆ์— js๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

- /ejs ์ฃผ์†Œ๋กœ ์š”์ฒญ์ด ์˜ค๋ฉด index.ejs๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์„œ๋ฒ„ํŒŒ์ผ (๋ฐ์ดํ„ฐ ์ „๋‹ฌ)

userRouter.get('/ejs', (req, res) => {
    const userLen = USER.length;
    res.render('index', { USER, userCounts: userLen });
    });

- ๋ทฐ ์ฝ”๋“œ

<body>
<h1>ํšŒ์› ๋ชฉ๋ก</h1>
<h2>์ด ํšŒ์› ์ˆ˜ <%= userCounts %> </h2>
<ul>
<li>
<p>ID: <%= USER[0].id%> </p>
<p>์ด๋ฆ„: <%= USER[0].name%> </p>
</li> </ul>
</body>

 

15.  Static

- ์‹ค์ œ๋กœ ๊ตฌ์„ฑํ•œ back-end์˜ ํด๋” ๊ตฌ์กฐ์™€ ํ”„๋ก ํŠธ์—์„œ url๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜๋‹ค๋ฉด ๋ณด์•ˆ์ ์œผ๋กœ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋”ฐ๋ผ์„œ express ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” url์ฃผ์†Œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ back-end ํด๋” ๊ตฌ์กฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๋„๋ก static์ด๋ผ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

- static์€ ๋ธŒ๋ผ์šฐ์ €์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ํด๋”์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด ์ค€๋‹ค

- ์‚ฌ์šฉ๋ฒ•์€ app.use(express.static('ํด๋”์œ„์น˜')๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋ณดํ†ต public์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

app.use(express.static(public));

 

16.  express ๊ธฐ๋ณธ ํด๋” ๊ตฌ์กฐ

- express๋กœ ๋งŒ๋“ค์–ด์ง„ ์„œ๋น„์Šค์˜ ๊ธฐ๋ณธ ํด๋” ๊ตฌ์กฐ

17.  ๋А๋‚€ ์ 

์ฒ˜์Œ ์ ‘ํ•ด๋ณด๋Š” ๋ฐฑ์—”๋“œ๋ผ์„œ ์ •๋ง ์ •์‹ ์—†์ด ํ•œ์ฃผ๊ฐ€ ์ง€๋‚˜๊ฐ”๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์•„๋ฌด๋ž˜๋„ ์ฒ˜์Œ์ด๋‹ค๋ณด๋‹ˆ ๋จธ๋ฆฌ์— ์‰ฝ๊ฒŒ ๋ฐ•ํžˆ์ง€ ์•Š์•˜๋˜ ๊ฒƒ๊ฐ™์€๋ฐ ๋ฐ˜๋ณต ์ˆ™๋‹ฌ ํ•˜๋ฉด์„œ ๊ตฌ์กฐ๋ฅผ ์ตํžˆ๊ณ  ์ƒ๊ฐ๋„ ๋นจ๋ฆฌ๋นจ๋ฆฌ ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–๊ณ ์‹ถ๋‹ค.

๊ทธ๋ž˜๋„ ๋‚ด๊ฐ€ ์„œ๋ฒ„๋ฅผ ์—ด๊ณ  ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ๋˜ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์ž‘์—…์„ ํ•ด๋ณด์•˜๋Š”๋ฐ ์žฌ๋ฏธ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์šฐ๋ ค์™€ ๋‹ฌ๋ฆฌ ์ƒ๊ฐ๋ณด๋‹ค ์žฌ๋ฐŒ์—ˆ๋‹ค.

์•ž์œผ๋กœ ๋ฐฐ์šธ ๊ฒƒ๋“ค์ด ์กฐ๊ธˆ ๊ฑฑ์ •๋„ ๋˜์ง€๋งŒ ํ•œํŽธ์œผ๋กœ๋Š” ๊ธฐ๋Œ€๊ฐ€ ๋œ๋‹ค.