Skip to content

Latest commit

ย 

History

History
339 lines (272 loc) ยท 14.8 KB

File metadata and controls

339 lines (272 loc) ยท 14.8 KB

AJAX

๋น„๋™๊ธฐ ํ†ต์‹ 

  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • ๋™๊ธฐ ๋ฐฉ์‹์—์„œ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋˜๋ฉฐ, ์„œ๋ฒ„์˜ ์‘๋‹ต์ด ๋„์ฐฉํ•˜๋ฉด ๊ทธ๋•Œ ๋ณ„๋„๋กœ ์‘๋‹ต์„ ์ฒ˜๋ฆฌ

๋น„๋™๊ธฐ ํ†ต์‹  ํŠน์ง•

  • Non-blocking(๋น„์ฐจ๋‹จ): ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • ์„ฑ๋Šฅ ํ–ฅ์ƒ: UI๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ(์‘๋‹ต ์ง€์—ฐ)๊ฐ€ ์ค„์–ด๋“ค์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๊ฐœ์„ ๋จ
  • ์„œ๋ฒ„์™€์˜ ํšจ์œจ์  ํ†ต์‹ : ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Œ

Ajax (Asynchronous Javascript And XML)

  • Ajax๋Š” ์–ธ์–ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธ
  • Ajax๋Š” ์›น์—์„œ ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์™€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธ
    • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ CSR ๋ฐฉ์‹์„ ํ†ตํ•ด ํŽ˜์ด์ง€์— ๋™์ ์œผ๋กœ ์ ์šฉ
  • JavaScript์˜ XMLHttpRequest ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์กฐํšŒ
  • ํ™”๋ฉด ๊ฐฑ์‹ ์ด ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋™์ ์œผ๋กœ DOM์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ตฌํ˜„์ด ๋ณต์žก

Ajax ์‘๋‹ต

์ผ๋ฐ˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต

  • data ์ž…๋ ฅ ํ›„ event ๋ฐœ์ƒ
  • Ajax๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์€ ์š”์ฒญ์€ ์„œ๋ฒ„์—์„œ data๋ฅผ ์ด์šฉํ•˜์—ฌ logic ์ฒ˜๋ฆฌ
  • ๋กœ์ง ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์‘๋‹ต page๋ฅผ ์ƒ์„ฑํ•˜๊ณ  client์— ์ „์†ก
    • ํ™”๋ฉด ์ „ํ™˜ ๋ฐœ์ƒ

Ajax ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต

  • data ์ž…๋ ฅ ํ›„ event ๋ฐœ์ƒ
  • Ajax๋ฅผ ์ ์šฉํ•˜๋ฉด event ๋ฐœ์ƒ์‹œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ Text, XML ๋˜๋Š” JSON์œผ๋กœ ์‘๋‹ต
  • ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ด ์‘๋‹ต data๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™”๋ฉด ์ „ํ™˜ ์—†์ด ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ๋™์ ์œผ๋กœ ํ™”๋ฉด์„ ์žฌ๊ตฌ์„ฑ

SSR, CSR

  • ์›น ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ์„œ๋ฒ„ ์ค‘์‹ฌ์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹๊ณผ ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋ถ„

SSR (Server Side Rendering)

  • ์„œ๋ฒ„ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ํ™”๋ฉด ๊ตฌ์„ฑ์ด ์„œ๋ฒ„์—์„œ ์ด๋ฃจ์–ด์ง
    • ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์˜์—ญ์˜ JSP๋‚˜ PHP, ASP ๋“ฑ

CSR (Client Side Rendering)

  • ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ™”๋ฉด์„ ๊ตฌ์„ฑ
    • ์ฃผ๋กœ JavaScript
  • Ajax๋Š” ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด๋ฉฐ ๋น„๋™๊ธฐ ์š”์ฒญ๋ณด๋‹ค๋Š” ๋™์  ํ™”๋ฉด๊ตฌ์„ฑ์ด ๊ด€๊ฑด์ž„

Ajax ์‚ฌ์šฉ๋ฐฉ์‹

  • XMLHttpRequest ์ด์šฉ ๋ฐฉ์‹ (Browser)
  • fetch() ์ด์šฉ ๋ฐฉ์‹ (Browser)
  • ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์šฉ ๋ฐฉ์‹ - jQuery, axios

๋น„๋™๊ธฐ ํ†ต์‹  ์‚ฌ์šฉ ๊ฐ์ฒด (XMLHttpReqeust)

  • ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ๊ฐ์ฒด
  • ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›น ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  • XML๋ฟ๋งŒ ์•„๋‹ˆ๋ผ JSON, HTML, plain text ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
  • XMLHttpRequest๋Š” ๋น„๊ต์  ๋ณต์žกํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ ๋Œ€์ฒด API๋กœ fetch๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋จ
// XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ
var xhr = new XMLHttpRequest();

// ์š”์ฒญ ์ดˆ๊ธฐํ™”: 'POST' ์š”์ฒญ์„ ๋ณด๋‚ผ URL ์ง€์ •
xhr.open('POST', 'https://jsonplaceholder.typicode.com/posts', true);

// ์š”์ฒญ ํ—ค๋” ์„ค์ • (๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ JSON์ž„์„ ๋ช…์‹œ)
xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

// ์š”์ฒญ์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ •์˜
xhr.onreadystatechange = function() {
    if (xhr.readyState === XMLHttpRequest.DONE) {
        if (xhr.status === 201) {
            // ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ (201 Created)
            console.log('Response:', xhr.responseText);
            // JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ
            var data = JSON.parse(xhr.responseText);
            console.log('Created Post ID:', data.id);
        } else {
            // ์š”์ฒญ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ
            console.error('Request failed. Status:', xhr.status);
        }
    }
};

// ์ „์†กํ•  ๋ฐ์ดํ„ฐ ๊ฐ์ฒด ์ƒ์„ฑ
var postData = {
    title: 'foo',
    body: 'bar',
    userId: 1
};

// ์š”์ฒญ ์ „์†ก (JSON ๋ฐ์ดํ„ฐ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ „์†ก)
xhr.send(JSON.stringify(postData));

JavaScript XMLHttpRequest AJAX

  • XMLHttpRequest ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ Ajax ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด
  • XMLHttpRequest ๊ฐ์ฒด๋Š” Ajax ํ†ต์‹  ์‹œ ์ „์†ก๋ฐฉ์‹, ๊ฒฝ๋กœ, ์„œ๋ฒ„๋กœ ์ „์†กํ•  data ๋“ฑ ์ „์†ก ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์—ญํ• 
  • ์‹ค์ œ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์€ ๋ธŒ๋ผ์šฐ์ €์˜ Ajax ์—”์ง„์—์„œ ์ˆ˜ํ–‰
  • ์ง์ ‘ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ Ajax๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ ํ†ต์‹  ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง

Ajax httpRequest ์†์„ฑ๊ฐ’

1. readyState

๊ฐ’ ์ƒํƒœ ์„ค๋ช…
0 Uninitialized ๊ฐ์ฒด๋งŒ ์ƒ์„ฑ (open ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ „)
1 Loading open ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
2 Loaded send ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, status์˜ ํ—ค๋”๊ฐ€ ์•„์ง ๋„์ฐฉ๋˜์ง€ ์•Š์Œ
3 Interactive ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ๋ฐ›์€ ์ƒํƒœ
4 Completed ๋ฐ์ดํ„ฐ ์ „๋ถ€๋ฅผ ๋ฐ›์€ ์ƒํƒœ

2. status

์ฝ”๋“œ ์ƒํƒœ ์„ค๋ช…
200 OK ์š”์ฒญ ์„ฑ๊ณต
403 Forbidden ์ ‘๊ทผ ๊ฑฐ๋ถ€
404 Not Found ํŽ˜์ด์ง€ ์—†์Œ
500 Internal Server Error ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

fetch()

  • ๋ธŒ๋ผ์šฐ์ €์—์„œ fetch() ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜๊ธฐ ์ด์ „์—๋Š” XMLHttpRequest๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ HTTP ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ์ง์ ‘ ๊ตฌํ˜„
  • ๋ณต์žกํ•œ ๊ตฌํ˜„๋•Œ๋ฌธ์— jQuery์™€ axios ๋“ฑ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ fetch() ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ ์œ„์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

์‚ฌ์šฉ๋ฒ•

  • fetch() ํ•จ์ˆ˜๋Š” ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ URL, ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ options ๊ฐ์ฒด๋ฅผ ๋ฐ›์Œ
  • options์— ์•„๋ฌด๊ฒƒ๋„ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์€ GET ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ url๋กœ ๋ถ€ํ„ฐ content๊ฐ€ ๋‹ค์šด๋กœ๋“œ ๋จ
  • ์‹คํ–‰ ๊ฒฐ๊ณผ Promise ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ๋ฐ˜ํ™˜๋œ Promise ๊ฐ์ฒด๋Š” API ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ–ˆ์„ ๊ฒฝ์šฐ ์‘๋‹ต ๊ฐ์ฒด๋ฅผ resolveํ•˜๊ณ  ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ rejectํ•จ
    • ํ•ด๋‹น ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ํ”ผํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ณด๋‹ค ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒํ•จ

์‘๋‹ต ๋ณธ๋ฌธ(data) ๋ฐ›๋Š” ๋ฐฉ๋ฒ•

  • response.text() : ์‘๋‹ต์„ ์ฝ๊ณ  text๋ฅผ ๋ฐ˜ํ™˜
  • response.json() : ์‘๋‹ต์„ JSON ํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑํ•จ
  • response.formData() : ์‘๋‹ต์„ FormData ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
  • response.blob() : ์‘๋‹ต์„ Blob ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

fetch() ์‚ฌ์šฉ ์˜ˆ

  • method option : POST ์„ค์ •
  • headers option : Content-Type์— JSON ์—ฌ๋ถ€ ์„ค์ •
  • body option : ์š”์ฒญ data ๊ฐ’์„ JSON ํ˜•์‹์œผ๋กœ ์ง๋ ฌํ™” ํ•˜์—ฌ ์„ค์ •
  • PUT ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ method option ๋งŒ PUT์œผ๋กœ ์ˆ˜์ •ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฑฐ์˜ ๋น„์Šทํ•จ
    • PATCH ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค์˜ ๋ถ€๋ถ„์ ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰. ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„๋กœ ๋ณด๋ƒ„
    • PUT ๋ฉ”์†Œ๋“œ๋Š” ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜, ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ฌ
// POST ์š”์ฒญ ์˜ˆ์‹œ
fetch('https://example.com/api/data', {
    method: 'POST', // HTTP ๋ฉ”์„œ๋“œ (POST)
    headers: {
        'Content-Type': 'application/json' // ์š”์ฒญ์ด JSON ๋ฐ์ดํ„ฐ์ž„์„ ๋ช…์‹œ
    },
    body: JSON.stringify({ name: 'John', age: 30 }) // ์š”์ฒญ ๋ณธ๋ฌธ์„ JSON ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”
})
.then(response => {
    if (!response.ok) {
        throw new Error('Network response was not ok');
    }
    return response.json(); // ์‘๋‹ต์„ JSON ํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑ
})
.then(data => {
    console.log('Success:', data); // ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ์‘๋‹ต ๋ฐ์ดํ„ฐ
})
.catch(error => {
    console.error('Error:', error); // ์š”์ฒญ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
});

Promise

  • Promise ๋ž€ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
    • ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋จ. ์ฃผ๋กœ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋Œ€์‹  ์‚ฌ์šฉ๋˜์–ด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ด
  • Promise๋Š” ์ด 3๊ฐœ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง
    • Pending(๋Œ€๊ธฐ) : ์‹ค์ œ ์ž‘์—…์„ ์œ„ํ•œ ์ค€๋น„ ๋‹จ๊ณ„๋กœ Promise ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ fulfilled, rejected ์ƒํ™ฉ์—์„œ ํ˜ธ์ถœํ•  handler ํ•จ์ˆ˜ ๋ฐ”์ธ๋”ฉํ•จ
    • Fulfilled(์ดํ–‰) : ๋™์ž‘์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ƒํƒœ๋กœ 'resolve'๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ
    • Rejected(๊ฑฐ๋ถ€) : ๋™์ž‘์ด ์‹คํŒจํ•œ ์ƒํƒœ๋กœ 'reject'๊ฐ€ ํ˜ธ์ถœ๋œ ์ƒํƒœ

Promise ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ํ˜ธ์ถœ

  • Promise ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ์ž์— executor๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋ฐ executor๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
    • new Promise(executor)
  • executor๋Š” resolver์™€ rejecter ๋ผ๋Š” 2๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋ฐ Promise๋Š” executor ๋‚ด๋ถ€์—์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ž‘์—… ์„ฑ๊ณต ์‹œ resolver๋ฅผ, ์‹คํŒจ ์‹œ rejecter๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์•ฝ์†ํ•จ (ํ™•์‹คํžˆ ํ˜ธ์ถœ)
    • Promise๊ฐ€ ์ •์ƒ๋™์ž‘ํ•ด์„œ ํ˜ธ์ถœ๋˜๋Š” resolver๋Š” handler์—์„œ ์‚ฌ์šฉํ•  ๊ฐ’ ํ•˜๋‚˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
    • Promise๊ฐ€ ์‹คํŒจํ•ด์„œ ๋™์ž‘ํ•˜๋Š” rejecter๋Š” ์‹คํŒจ ์ด์œ  ํ•˜๋‚˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ

Promise ์ฃผ์š” ๋ฉ”์„œ๋“œ

  • resolve(value): ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜์—ฌ value๋ฅผ ์ „๋‹ฌ
  • reject(reason): ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜์—ฌ reason(์‹คํŒจ ์ด์œ )์„ ์ „๋‹ฌ
  • then(onFulfilled, onRejected): Promise๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด onFulfilled๋ฅผ, ์‹คํŒจํ•˜๋ฉด onRejected๋ฅผ ํ˜ธ์ถœ
  • catch(onRejected): Promise๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ onRejected๋ฅผ ํ˜ธ์ถœ. then(null, onRejected)์™€ ๋™์ผ
  • finally(onFinally): Promise๊ฐ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ํ›„ ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜

Callback Hell

  • ๋ฌธ์ œ๋Š” 1์ดˆ ํ›„์— ๋˜ 1์ดˆ ํ›„์—.. ์ด๋Ÿฐ์‹์œผ๋กœ ๊ณ„์† callback ๋‚ด์—์„œ ๋‹ค๋ฅธ callback ๋‚ด์—์„œ ๋‹ค๋ฅธ callback ์ด ๋ถˆ๋Ÿฌ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ
  • ๋™์ž‘์€ ์ž˜ ๋˜์ง€๋งŒ ์ถ”์ ์ด ๋งค์šฐ ํž˜๋“ค์–ด์ง€๋Š” ์ƒํƒœ๋ฅผ callback hell ์ด๋ผ๊ณ  ํ•จ
  • ํ•ด๋‹น Callback Hell์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Promise ๊ฐ์ฒด๊ฐ€ ๋“ฑ์žฅ

Data ์ „์†ก ํ˜•์‹

  • Server์™€ Client๋Š” ์ฃผ๊ณ  ๋ฐ›์„ data์˜ ํ˜•์‹์„ ๋งž์ถฐ์•ผํ•จ
  • ๋Œ€ํ‘œ์ ์ธ data์˜ ํ˜•์‹์€ CSV, XML, JSON ๋“ฑ์ด ์žˆ์Œ

1. SCV

  • ๊ฐ ํ•ญ๋ชฉ์„ ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋‹ค๋ฅธ ๋‘ ํ˜•์‹์— ๋น„ํ•ด ๊ต‰์žฅํžˆ ์งง์Œ. ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์œ ๋ฆฌ
  • ๋‹จ, ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›€ (์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์™„๋ฒฝํžˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•  ๊ฒฝ์šฐ ๊ฐ€๋Šฅ)
20201111, ํ™๊ธธ๋™, A, 90,
20201111, ํ™๊ธธ๋™2, B, 85,

2. XML

  • XML์€ ํƒœ๊ทธ๋กœ data๋ฅผ ํ‘œํ˜„ํ•จ
  • tag๋ฅผ ๋ณด๋ฉด ๊ฐ data๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํŒŒ์•… ๊ฐ€๋Šฅ
  • tag์— ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณต์žกํ•œ data ์ „๋‹ฌ ๊ฐ€๋Šฅ
<students>
    <student>
        <id>2022111</id>
        <name>ํ™๊ธธ๋™</name>
        <class>A</class>
        <grade>90</grade>
    </student>
    <student>
        <id>2022111</id>
        <name>ํ™๊ธธ๋™2</name>
        <class>B</class>
        <grade>85</grade>
    </student>
</students>

3. JSON

  • CSV์™€ XML์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•œ ํ˜•์‹
  • JS ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์˜ ํ˜•์‹์œผ๋กœ data๋ฅผ ํ‘œํ˜„
  • Ajax ์‚ฌ์šฉ์‹œ ๊ฑฐ์˜ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” data ํ‘œํ˜„ ๋ฐฉ์‹
  • JSON์˜ ํŠน์ง•
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ํฌ๋งท
    • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ๋‹นํžˆ ๊ฐ€๋ฒผ์›€
    • ์ฝ๊ธฐ ํŽธํ•จ
    • Key์™€ Value์˜ ์Œ์œผ๋กœ ๋˜์–ด ์žˆ์Œ
    • ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉ
    • ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋‚˜ ํ”Œ๋žซํผ์— ์ƒ๊ด€์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋™๊ธฐ/๋น„๋™๊ธฐ ์ž‘์—…

1. ๋™๊ธฐ(Synchronous)

  • ๋™๊ธฐ ์ž‘์—…์€ ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ ํ•œ์ค„ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ด์ „ ์ฝ”๋“œ์˜ ๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์€ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ

2. ๋น„๋™๊ธฐ(Asynchronous)

  • ๋น„๋™๊ธฐ ์ž‘์—…์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ์ด์ „ ์ฝ”๋“œ์˜ ๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ
// ๊ฐ„๋‹จํ•œ setTimeout ๋น„๋™๊ธฐ ์ž‘์—… 
let num = 0;

setTimeout(() => {
  console.log(`์ž‘์—… ์ง„ํ–‰: ${num++} ๋ฒˆ์งธ ์ž‘์—… ์ง„ํ–‰ ..`);
}, 1000);

console.log(`์ž‘์—… ๊ฒฐ๊ณผ num: ${num}`);
//  setTimeout์€ 1์ดˆ ํ›„์— ์ฒ˜๋ฆฌ๋  ์ž‘์—…(callback)์„ ๋น„ ๋™๊ธฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๋˜์ ธ๋ฒ„๋ฆฌ๊ณ  ๋ฐ”๋กœ "์ž‘์—… ๊ฒฐ๊ณผ .."๊ฐ€ ์ฝ˜์†”์— ์ถœ๋ ฅ

async/await

  • async/await๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด, ๊ฐ€๋…์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ด
  • async ํ‚ค์›Œ๋“œ๋ฅผ ํ•จ์ˆ˜ ์•ž์— ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•จ. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ returnํ•œ ๊ฐ’์€ ์ž๋™์œผ๋กœ Promise.resolve๋กœ ๊ฐ์‹ธ์ ธ ๋ฐ˜ํ™˜๋จ
  • await ํ‘œํ˜„์‹์€ await ํ‚ค์›Œ๋“œ๋Š” Promise๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ. await์€ async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
// Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

// async/await ์‚ฌ์šฉ ์˜ˆ์‹œ
async function fetchDataAsync() {
    try {
        const result = await fetchData(); // fetchData()๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
        console.log(result); // "Data fetched!" ์ถœ๋ ฅ
    } catch (error) {
        console.error("Error:", error);
    } finally {
        console.log("Fetch attempt completed.");
    }
}

fetchDataAsync();

ํŠน์ง• Promise async/await
๊ตฌ๋ฌธ then, catch, finally ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐ async ํ•จ์ˆ˜์™€ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ
๊ฐ€๋…์„ฑ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์ค‘์ฒฉ๋˜๋ฉด ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ์ข‹์Œ
์—๋Ÿฌ ์ฒ˜๋ฆฌ catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ try/catch ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
์ง€์› ํ™˜๊ฒฝ ๋ชจ๋“  JavaScript ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ES2017(ES8) ์ด์ƒ์—์„œ ์ง€์›, ๊ตฌํ˜• ํ™˜๊ฒฝ์—์„œ๋Š” ํด๋ฆฌํ•„ ํ•„์š”
์‚ฌ์šฉ ๋ฐฉ์‹ ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ์ž‘์—…์„ then์œผ๋กœ ์—ฐ๊ฒฐ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ์‹ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒด์ธ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ