๐ŸŒฑ → ๐ŸŒณ

[node.js] Front์—์„œ Back์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ณธ๋ฌธ

Server/Node.js

[node.js] Front์—์„œ Back์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

BAY 2022. 9. 24. 10:50
728x90

front์˜ form์œผ๋กœ back์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

  • form 
  • XMLHttpRequest
  • Jquery
  • Fetch()

๐Ÿ“Œ users.ejs์— form ์ถ”๊ฐ€ 

 

๐Ÿ“form

  • action : ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ์ฃผ์†Œ ๊ฐ’
  • method: ๋ณด๋‚ด๋Š” method ์„ค์ •(get, post ๋งŒ ๊ฐ€๋Šฅ)
  • input์˜ name ์†์„ฑ์€ ์„œ๋ฒ„์—์„œ ๋ฐ›์„ ๋•Œ ํ•„๋“œ ๊ฐ’์ด ๋จ 
  • ๋ฒ„ํŠผ type์œผ๋กœ submit์„ ํ•˜๋ฉด ํ•ด๋‹น ํผ์˜ ๋‚ด์šฉ์„ ์ง€์ •ํ•œ ๋ฐฉ์‹ + ์ฃผ์†Œ๋กœ ์ „๋‹ฌ 
<form action="/users" method="POST">
    <div>
      <label>์•„์ด๋””</label>
      <input type="text" name="id" />
    </div>
    <div>
      <label>์ด๋ฆ„</label>
      <input type="text" name="name" />
    </div>
    <div>
      <label>์ด๋ฉ”์ผ</label>
      <input type="email" name="email" />
    </div>
    <button type="submit">Submit</button>
  </form>

 

โœ… body-parser ๋ชจ๋“ˆ ์‚ฌ์šฉ 

: form์—์„œ ์ „์†ก ๋œ, ์ •๋ณด๋ฅผ req.body์— ๋‹ด์—์„œ obj๋กœ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ•  

 

body-parser๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ body์— ๋„ฃ์€ ๋‹ค์Œ,

์ธ์ฝ”๋”ฉ์ฒ˜๋ฆฌ๊นŒ์ง€ ํ•ด์ค˜์•ผํ•จ (body-parser๋Š” ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์คŒ)

req.on('data', function(chunk) { body += chunk; });

 

โœ”๏ธ body-parser ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ

npm install body-parser --save

body-parser๋Š” ์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•œ ์ƒํƒœ์—์„œ๋„ ์„œ๋ฒ„ ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜๋ฏ€๋กœ 

--save-dev๊ฐ€ ์•„๋‹Œ --save ์˜ต์…˜์œผ๋กœ ์„ค์น˜ํ•ด์•ผ ํ•จ 

// app.js

const bodyParser = require('body-parser');

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

json()์€ jsonํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ 

urlencoded(url-encoded) ์˜ต์…˜์€ url์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉด 

localhost:4000/posts?title=title&content=content ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ json ํ˜•ํƒœ { “title”: “title, “content”: “content” } ๋ผ๊ณ  ์ „๋‹ฌํ•จ

 

๐Ÿ“ extended: false

  • query๋กœ ๋“ค์–ด์˜จ ๋ฌธ์ž์—ด์„ 
    • true: ์™ธ๋ถ€ ๋ชจ๋“ˆ์ธ qs ๋ชจ๋“ˆ๋กœ ์ฒ˜๋ฆฌ(qs ๋ชจ๋“ˆ ์„ค์น˜ ํ•„์š”, npm i qs)
    • false: express ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ queryString ๋ชจ๋“ˆ๋กœ ์ฒ˜๋ฆฌ 
  • false ์˜ต์…˜์€ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ํ—ˆ์šฉ X

 

โœ”๏ธ body-parser, express์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์œผ๋กœ ์ถ”๊ฐ€ ๋จ 

// app.js

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

๋‹จ, express 4.16 ์ด์ƒ์—์„œ๋งŒ ์ง€์›ํ•จ 

 

๐Ÿ“Œ XMLHttpRequest

  • 1999๋…„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„ ์ธก ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ํƒ„์ƒ
  • ์˜›๋‚  ๋ฐฉ์‹ -> ์ตœ์‹  ๊ธฐ๋Šฅ์ธ promise ๋“ฑ์„ ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด์žฅํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ํ†ต์‹ ์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ํ•˜๋ ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๋ฉด, promise๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ ์กด์žฌ 
  • ES6 ๋ฌธ๋ฒ•์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „ ๊นŒ์ง€๋Š” ์ฃผ๋กœ JQuery๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•จ
<script>
  function deleteUser(id) {
    const xhr = new XMLHttpRequest();
    xhr.open('DELETE', `http://localhost:4000/users/${id}`);
    xhr.responseType = 'json';
    xhr.onload = () => {
      console.log(xhr.response);
      location.reload();
    };
    xhr.send();
  }
</script>

 

๐Ÿ“Œ JQuery

: JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

2006๋…„ ๋“ฑ์žฅํ•˜์—ฌ ํŽธ๋ฆฌํ•œ DOM ๊ธฐ๋Šฅ, ๋ฐ์ดํ„ฐ ํ†ต์‹  ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉ

JQuery ์˜ ๊ธฐ๋Šฅ๋“ค์ด JS ์— ๊ธฐ๋ณธ ๋‚ด์žฅ ๋˜๋ฉด์„œ ์ ์ฐจ ์‚ฌ์šฉ์ด ์ค„์–ด๋“œ๋Š” ์ถ”์„ธ

<script>
  function deleteUser(id) {
    console.log(`http://localhost:4000/users/${id}`);
    $.post(`http://localhost:4000/users/${id}`, function (res) {
      console.log(res);
      location.reload();
    }).done(function (data) {
      console.log(data);
    }).fail(function (err) {
      console.log(err);
    })
  }
</script>

 

๐Ÿ“Œ Fetch 

๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„ ์‚ฌ์ดํŠธ ํ†ต์‹ ์„ ์œ„ํ•ด 2015๋…„ ES6์—์„œ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ 

๊ธฐ์กด์˜ XMLHttpRequest์˜ ๋ฌธ์ œ์ ์„ ๊ฐœ์„ ํ•˜๊ณ  Promise๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋‚ด์žฅํ•˜์—ฌ ์„œ๋ฒ„ ํ†ต์‹  ์ฝ”๋“œ๋ฅผ ๋ฒก์—”๋“œ ์ฝ”๋“œ์™€ ๋น„์Šทํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ์Œ 

<script>
  function deleteUser(id) {
    fetch(`http://localhost:4000/users/${id}`, {
      method: 'delete',
      headers: {
        'Content-type': 'application/json'
      },
    }).then((res) => {
      console.log(res);
      location.reload();
    })
  }
</script>

 

โœ”๏ธ Fetch๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ 

์‚ญ์ œ ๊ธฐ๋Šฅ ์ž์ฒด๋Š” ์ด๋ฏธ back-end api์— ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ 

front์—์„œ๋Š” fetch๋ฅผ ์ด์šฉํ•˜์—ฌ back-end์— ์š”์ฒญ๋งŒ ์ž˜ ๋ณด๋‚ด๋ฉด ๋จ

 

li ์š”์†Œ์— ์‚ญ์ œ ๋ฒ„ํŠผ ์ถ”๊ฐ€ ํ›„ 

<a> tag์— onclick์œผ๋กœ ์‚ญ์ œ ํ•จ์ˆ˜ ์—ฐ๊ฒฐ -> ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ fetch๋กœ ์‚ญ์ œ api ์š”์ฒญ

<ul>
    <% if(userCounts> 0) { %>
      <% for(let i=0; i < userCounts; i++) { %>
        <li>
          <p>ID: <%= USER[i].id %>
          </p>
          <p>์ด๋ฆ„: <%= USER[i].name %>
          </p>
          <p>email: <%= USER[i].email %>
          </p>
          <!-- ์‚ญ์ œ ํ•  user.id ๊ฐ’ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ -->
          <a href="" onclick="deleteUser('<%= USER[i].id %>');">์‚ญ์ œ</a>
        </li>
        <% } %>
     <% } else { %>
        <li>
          ํšŒ์› ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!
        </li>
     <% } %>
  </ul>

 

๐Ÿ“ deleteUser() ํ•จ์ˆ˜ ๊ตฌํ˜„ 

fetch์˜ ์ฃผ์†Œ๋กœ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ id๊ฐ’ ๋„ฃ์–ด์„œ ์ „๋‹ฌ 

์ „๋‹ฌ ๊ฐ’์œผ๋กœ๋Š” method, headers๋ฅผ ์ „๋‹ฌ (๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ํ•„์š”ํ•˜๋ฉด body์— ๋‹ด์•„์„œ ์ „๋‹ฌ)

ํ†ต์‹ ์ด ์™„๋ฃŒ๋˜๋ฉด then์œผ๋กœ ๋ฐ›์Œ

function deleteUser(id) {
    fetch(`http://localhost:4000/users/${id}`, {
      method: 'delete',
      headers: {
        'Content-type': 'application/json'
      },
    }).then((res) => {
      console.log(res);
      location.reload();
    })
  }

 

 

728x90