๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŒˆ Chapter 9 : ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋ผ.

๐ŸŽฏ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ.โ€‹

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋น„๋™๊ธฐ ์–ธ์–ด์ด๋‹ค. ๋น„๋™๊ธฐ ์–ธ์–ด๋Š” ๊ทธ์ € ์ด์ „์˜ ์ฝ”๋“œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•„๋„ ์ด์–ด์ง€๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ ์ฝ”๋“œ์™€ ๋™๊ธฐ ์ฝ”๋“œ์˜ ์ฐจ์ด์  ์ฐธ๊ณ 
  • ๋น„๋™๊ธฐ ์–ธ์–ด์˜ ๊ฐ€์น˜๋Š” ์ง€์—ฐ๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ด ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์žˆ๋‹ค. (์ง€์—ฐ๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ฝ”๋“œ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค.)
  • ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ธ ํ”„๋ผ๋ฏธ์Šค(Promise)๊ฐ€ ์žˆ๋‹ค. (๋ชจ๋˜ JavaScript ํŠœํ† ๋ฆฌ์–ผ ์ฐธ๊ณ )
  • ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์—๋Š” ์ฝœ๋ฐฑ(Callback) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์›๋ณธ์— ๋น„์šฉ์„ ์š”์ฒญํ•  ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ๊ณ , ์ด ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„์—๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (์˜ˆ: setTimeout())
  • ๋‹ค์Œ ์˜ˆ์ œ๋Š” setTimeout()์„ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์ด๋‹ค.
function getUserPreferences(cb) {
return setTimeout(() => {
cb({
theme: 'dusk',
});
}, 1000);
}

function log(value) {
return console.log(value);
}

log('starting'); // starting

getUserPreferences(preference => {
return log(preference.theme.toUpperCase());
});

log('ending?'); // ending?

// DUSK
  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๊ณ  ์˜ค๋žซ๋™์•ˆ ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ, ๋ฌธ์ œ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ๋˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฑฐ๊ธฐ์„œ ๋˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๋งˆ์นจ๋‚ด ๋„ˆ๋ฌด๋‚˜ ๋งŽ์€ ์ฝœ๋ฐฑ์ด ์ค‘์ฒฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์ฝœ๋ฐฑ ์ง€์˜ฅ(Callback Hell) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

callback_hell

  • ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋ผ๋ฏธ์Šค๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ํ•˜๋Š” ๋Œ€์‹ ์— ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๋Œ€์‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ”„๋ผ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ „๋‹ฌ๋ฐ›์•„์„œ ์‘๋‹ต์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ํ”„๋ผ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์ถฉ์กฑ๋œ ๊ฒฝ์šฐ then() ๋ฉ”์„œ๋“œ์— ๊ฒฐ๊ณผ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
  • ๋น„๋™๊ธฐ ์ž‘์—…์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ catch() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • then()๊ณผ catch() ๋ฉ”์„œ๋“œ์—๋Š” ๋ชจ๋‘ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • ์ด๋•Œ ๋‘ ๋ฉ”์„œ๋“œ์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์—๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ์ธ ์‘๋‹ต๋งŒ์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • ํ”„๋ผ๋ฏธ์Šค๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜, resolve()์™€ reject()๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
  • resolve()๋Š” ์ฝ”๋“œ๊ฐ€ ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๊ณ  resolve()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด then() ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
function getUserPreferences() {
const preference = new Promise((resolve, reject) => {
resolve({
theme: 'dusk',
});
});
return preference;
}

// ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ then() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœ
getUserPerferences()
.then(preference => {
console.log(preference.theme);
});
// 'dusk'
  • ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์„ค์ •ํ•  ๋•Œ then()๊ณผ catch() ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ์€ ์‹คํŒจํ•˜๋Š” ํ”„๋ผ๋ฏธ์Šค์ด๋‹ค. ์ธ์ˆ˜์— ์žˆ๋Š” reject()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
function failUserPreference() {
const finder = new Promise((resolve, reject) => {
reject({
type: '์ ‘๊ทผ ๊ฑฐ๋ถ€๋จ',
});
});
return finder;
}
  • ํ”„๋ผ๋ฏธ์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ then()๋ฉ”์„œ๋“œ์™€ catch()๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
failUserPreference()
.then(preference => {
// ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
console.log(preference.theme);
})
.catch(error => {
console.log(`์‹คํŒจ: ${error.type}`);
});
// ์‹คํŒจ: ์ ‘๊ทผ ๊ฑฐ๋ถ€๋จ
  • ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ”„๋ผ๋ฏธ์Šค๋กœ ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ์ด๋‹ค.
function getMusic(theme) {
if(theme === 'dusk') {
return Promise.resolve({
album: 'music for airports',
});
return Promise.resolve({
album: 'kind of blue',
});
}
}

getUserPreferences()
.then(preference => {
return getMusic(preference.theme);
})
.then(music => {
console.log(music.album);
});
// music for airports
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ์—ฌ๋Ÿฌ ๊ฐœ์˜ then() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.
getUserPreferences()
.then(preference => getMusic(preference.theme))
.then(music => { console.log(music.album); });
  • ๋์œผ๋กœ, ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” catch() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • catch() ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•ด์„œ ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๊ฑฐ์ ˆ๋˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
function getArtist(album) {
return Promise.resolve({
artist: 'Brian Eno',
});
}

function failMusic(theme) {
return Promise.reject({
type: '๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜',
});
}

getUserPreferences()
.then(preference => failMusic(preference.them))
.then(music => getArtist(music.album))
// ๊ฑฐ๋ถ€๋  ๋•Œ(reject) ์‹คํ–‰๋œ๋‹ค.
.catch(e => {
console.log(e);
});
// {type: "๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜"}
  • ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด์„ ๋ฐ›์•„ ๋ชจ๋“  ํ”„๋ผ๋ฏธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise.all์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋„ ์žˆ๋‹ค. (MDN, ๋ชจ๋˜ javascript ํŠœํ† ๋ฆฌ์–ผ)

๐ŸŽฏ async/await๋กœ ํ•จ์ˆ˜๋ฅผ ๋ช…๋ฃŒํ•˜๊ฒŒ ์ƒ์„ฑํ•˜๋ผ.โ€‹

  • ํ”„๋ผ๋ฏธ์Šค๋Š” ์ฝœ๋ฐฑ๊ณผ ๋น„๊ตํ•˜๋ฉด ์—„์ฒญ๋‚œ ๋ฐœ์ „์ด์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ฌ์ „ํžˆ ๋‹ค์†Œ ํˆฌ๋ฐ•ํ•˜๋‹ค.
  • ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์—ฌ์ „ํžˆ ๋ฉ”์„œ๋“œ์—์„œ ์ฝœ๋ฐฑ์„ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค.
  • async/await๋ฅผ ์ด์šฉํ•ด ํ”„๋ผ๋ฏธ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • async ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์„ ์–ธํ•œ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ค‘์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • async/await๋Š” ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋Œ€์ฒดํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋‹จ์ง€ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋” ๋‚˜์€ ๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ์— ๋ถˆ๊ณผํ•˜๋‹ค.
  • ์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ async/await๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
getUserPreferences()
.then(preference => {
console.log(preference.theme);
});
// 'dusk'

async function getTheme() {
const { theme } = await getUserPreferences();
return theme;
}
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ํ”„๋ผ๋ฏธ์Šค๋กœ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ์ ์ด๋‹ค.
  • ์ฆ‰, getTheme()๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์—ฌ์ „ํžˆ then()๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
getTheme()
.then(theme => {
console.log(theme);
})
// dusk
  • async ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ข‹๋‹ค.
  • async/await๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐœ๋ณ„ ํ”„๋ผ๋ฏธ์Šค์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๋ณ€์ˆ˜์— ๋จผ์ € ํ• ๋‹นํ•˜๊ณ  ๋‹ค์Œ์— ์ด์–ด์งˆ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ์—ฐ๊ฒฐ๋œ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์ง„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
async function getArtistByPreference() {
const { theme } = await getUserPreferences();
const { album } = await getMusic(theme);
const { artist } = await getArtist(album);
return artist;
}

getArtistByPreference()
.then(artist => {
console.log(artist);
});
// Brian Eno
  • ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ ์˜ˆ์ œ์ฒ˜๋Ÿผ catch() ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.
async function getArtistByPreference() {
const { theme } = await getUserPreferences();
const { album } = await failMusic(theme);
const { artist } = await getArtist(album);
return artist;
}
getArtistByPreference()
.then(artist => {
console.log(artist);
})
.catch(e => {
console.log(e);
});
// {type: "๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜"}

๐ŸŽฏ fetch๋กœ ๊ฐ„๋‹จํ•œ AJAX ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•˜๋ผ.โ€‹

  • fetch()๋ฅผ ์ด์šฉํ•ด์„œ ์›๊ฒฉ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • API๋ฅผ ์ด์šฉํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ์†Œํ”„ํŠธ์›จ์–ด์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋งค์šฐ ๋น ๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • AJAX(Asynchronous JavaScript And XML)(๋น„๋™๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ XML)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๊ฝค ๋ฒˆ๊ฑฐ๋กœ์› ๋‹ค.
  • AJAX ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” fetch()๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๋„๊ตฌ๊ฐ€ ์ƒ๊ฒผ๋‹ค.
  • fetch()๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ช…์„ธ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ fetch() ๋ช…์„ธ๋Š” WHATWG(Web Hypertext Application Technology Working Group)๊ฐ€ ์ •์˜ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜์ง€๋งŒ Node.js์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Node.js์—์„œ fetch()๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด node-fetch ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • fetch()๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด API ๋์ (endpoint)์ด ํ•„์š”ํ•˜๋‹ค.
  • typicode๋Š” JSONPlaceholder๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒ ๋ธ”๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
  • ๋˜ํ•œ, typicode์—์„œ ์ œ๊ณตํ•˜๋Š” JSON ์„œ๋ฒ„๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋ชจ์˜ API๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ์€ fetch()๋ฅผ ์‚ฌ์šฉํ•œ GET ์š”์ฒญ์ด๋‹ค.
fetch('https://jsonplaceholder.typicode.com/posts/1');
// {
// "userId": 1,
// "id": 1,
// "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
// "body": "quia et suscipit\nsuscipit recusandae...",
// }
  • ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋‚˜๋ฉด fetch()๋Š” ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

fetch

  • then() ๋ฉ”์„œ๋“œ์— ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • fetch()๋Š” ๋‹ค์–‘ํ•œ ๋ฏน์Šค์ธ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ์‘๋‹ต ๋ณธ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ค€๋‹ค.
  • then() ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ์—์„œ ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
// Responseย {...}
return data.json();
})
.then(post => {
console.log(post.title);
// sunt aut facere repellat provident occaecati excepturi optio reprehenderit
});
  • fetch() ํ”„๋ผ๋ฏธ์Šค๋Š” ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 404์—ฌ์„œ ์š”์ฒญ์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋„ ์‘๋‹ต ๋ณธ๋ฌธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ฆ‰, ์š”์ฒญ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ catch() ๋ฉ”์„œ๋“œ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
// 200 ~ 299 ์‚ฌ์ด์ธ ๊ฒฝ์šฐ true๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ok ํ•„๋“œ.
// ์ต์Šคํ”Œ๋กœ๋Ÿฌ ์ง€์› x
if(!data.ok) {
throw Error(data.status);
}
return data.json();
})
.then(post => {
console.log(post.title);
})
.catch(e => {
console.log(e);
});
  • fetch()๋ฅผ ์‚ฌ์šฉํ•œ POST ๋ฐฉ๋ฒ•์€ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์„ค์ • ์กฐ๊ฑด์„ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์„ค์ • ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ •๋ณด๋งŒ ํฌํ•จํ•  ๊ฒƒ์ด๋‹ค.
  • ๋ฉ”์„œ๋“œ๋ฅผ POST๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์„ ์–ธํ•ด ์ฃผ๊ณ , JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ํ—ค๋”์˜ Content-Type์„ application/json์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋์œผ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋ฌธ์ž์—ด๋กœ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
const update = {
title: 'Clarence White Techniques',
body: 'Amazing',
userId: 1,
};

const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(update),
};

fetch('https://jsonplaceholder.typicode.com/posts', options)
.then(data => {
if(!data.ok) {
throw Error(data.status);
}
return data.json();
})
.then(update => {
console.log(update);
// {
// title: "Clarence White Techniques",
// body: "Amazing",
// userId: 1,
// id: 101
// }
})
.catch(e => {
console.log(e);
});

๐ŸŽฏ localStorage๋กœ ์ƒํƒœ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ์œ ์ง€ํ•˜๋ผ.โ€‹

  • localStorage๋ฅผ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • localStorage๋Š” ๋ธŒ๋ผ์šฐ์ €์—๋งŒ ์กด์žฌํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™๋‹ค.
  • localStorage์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†๋‹ค.
  • ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๋ฉด localStorage ๊ฐ์ฒด์— setItem() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์—๋Š” ํ‚ค, ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์—๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.
function saveBreed(breed) {
localStorage.setItem('breed', breed);
}
  • ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ๋•Œ๋Š” ๋น„์Šทํ•œ ๋ช…๋ น์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
function getSavedBreed() {
return localStorage.getItem('breed');
}
  • ์ถ”๊ฐ€ํ–ˆ๋˜ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
function removeBreed() {
return localstorage.removeItem('breed');
}
  • localStorage์˜ ๊ฐ•์ ์€ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ค๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๊ณ ์นจ์„ ํ•˜๋”๋ผ๋„ ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
function applyBreedPreference(filters) {
const breed = getSavedBreed();
if(breed) {
filters.set('breed', breed);
}
return filters;
}
  • ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›ํ•˜๋Š” ๋งŒํผ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๋ชจ๋“  ์กฐ๊ฑด์„ ์ €์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ํ•ญ๋ชฉ๋ณ„๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ์ €์žฅํ•˜๋ฉด ํ›จ์”ฌ ์‰ฝ๋‹ค.
  • localStorage์˜ ์œ ์ผํ•œ ๋‹จ์ ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
  • localStorage์— ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋Š” ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ด ๋‹จ์ ์€ JSON.stringify()๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” JSON.parse()๋ฅผ ์ด์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๋ชจ๋‘ ์ €์žฅํ•˜๋ ค๋ฉด ๋ชจ๋“  ์กฐ๊ฑด์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.
  • ์กฐ๊ฑด์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งต์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ๋จผ์ € ๋ฐฐ์—ด์— ํŽผ์ณ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.
let filters = new Map();
filters.set('id','seungmin');

function savePreferences(filters) {
const filterString = JSON.stringify([...filters]);
localStorage.setItem('preferences', filterString);
}

savePreferences(filters);
  • ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” localStorage์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋‹ค์‹œ ๋งต์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.
  • ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •๋งŒ ๊ฑฐ์น˜๋ฉด ๋œ๋‹ค.
function retrievePreferences() {
const preferences = JSON.parse(localStorage.getItem('preferences'));
return new Map(preferences);
}
retrievePreferences();
// Map(1)ย {"id" => "seungmin"}
  • localStorage๋ฅผ ๋น„์›Œ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” clear()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
function clearPreferences() {
localStorage.clear();
}
  • ๋‹จ์ ์€ ์—ฌ๋Ÿฌ ๊ธฐ๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, ๋กœ๊ทธ์ธ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ํ›จ์”ฌ ๋” ํฌ๋‹ค.
  • ๋ง๋ถ™์—ฌ์„œ sessionStorage๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๋„๊ตฌ๋Š” ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง๊ณผ ํด๋ผ์ด์–ธํŠธ ์ธก ๊ธฐ๋Šฅ์„ ํ˜ผํ•ฉ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
  • ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•˜๋ฉด ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ค๋ฉด ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • ์™„์ „ํžˆ ํ†ตํ•ฉ๋œ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋„๊ตฌ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋œ ์ •๋ณด์™€ API ์ ‘๊ทผ์„ ์ด์šฉํ•˜๋ฉด ์„œ๋ฒ„๋ฅผ ํ†ตํ•œ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ํ•œ ๋ฒˆ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.