๐Ÿš€ Javascript ๋น„๋™๊ธฐ ํ™•์‹คํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ! (promise, async/await)+ HTTP, REST API, fetch API

์ด์˜จยท2023๋…„ 8์›” 21์ผ
3

Javascript

๋ชฉ๋ก ๋ณด๊ธฐ
1/1

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ œ์–ด ํ๋ฆ„

โ€ข ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(JAVA, C++๋“ฑ)์™€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
โ€ข ์ฒ˜์Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ‘ํ•˜๋Š” ๊ฒฝ์šฐ, ๋™์ž‘์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ดํ•ด๊ฐ€ ์—†์œผ๋ฉด ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์–ด๋ ต๋‹ค.
โ€ข ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋“ฑ์˜ ๊ฐœ๋…์„ ์•Œ์•„์•ผ๋งŒ ํ•œ๋‹ค.

โ€ข ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
โ€ข ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•œ๋‹ค.
โ€ข ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ์œ ์ € ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ™”๋ฉด์„ ๊ทธ๋ฆฐ๋‹ค.

[ ๋‘๊ฐ€์ง€ ์–ธ์–ด์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ์˜ˆ์‹œ ]

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋Š” setTimeout์„ ์ฒ˜๋ฆฌํ•  ๋•Œ setTimeout์ด๋ผ๋Š” ๋น„๋™๊ธฐ API๊ฐ€ ์ž‘๋™ํ•ด ํ•จ์ˆ˜๋ฅผ ํŠน์ • ํ(JS์—”์ง„์ด ์•„๋‹Œ ๋ณ„๋„์˜ ํ™˜๊ฒฝ)์— ์ €์žฅํ•˜๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” task queue๋ฅผ ํ™•์ธํ•˜๋ฉฐ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰ = ์ฆ‰ ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ!
๋ฐ˜๋ฉด ์ž๋ฐ”์˜ ๊ฒฝ์šฐ, setTimeout์„ ๋งŒ๋‚˜๋ฉด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ) ํƒ€์ด๋จธ๊ฐ€ ์ง€๋‚ ๋•Œ๊นŒ์ง€ ๊ทธ ์Šค๋ ˆ๋“œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฐ๋‹ค

(1) ๋™๊ธฐ์  ์ œ์–ด ํ๋ฆ„

โ€ข ๋™๊ธฐ์  ์ œ์–ด ํ๋ฆ„์€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
โ€ข ๋ถ„๊ธฐ๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ์ด ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
โ€ข ์ฝ”๋“œ์˜ ํ๋ฆ„๊ณผ ์‹ค์ œ ์ œ์–ด ํ๋ฆ„์ด ๋™์ผํ•˜๋‹ค.
โ€ข ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธด ์‹œ๊ฐ„ ์ ์œ ํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉˆ์ถ”๊ฒŒ ํ•œ๋‹ค.

// ๋™๊ธฐ์  ์ฝ”๋“œ์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ์„์ง€!

// ์„ ์–ธ๋ฌธ
let a = 10

// ๋™๊ธฐ์  ์‹คํ–‰
console.log("a : ", a)

// ๋ฐ˜๋ณต๋ฌธ
function foo(num) {
  for (let i = 0; i < 10; ++i) {
    console.log(num)
  }
} 

// ํ•จ์ˆ˜ ํ˜ธ์ถœ
foo(num)

//๋“ฑ์ด ์žˆ๋‹ค!


๋™๊ธฐ์‹ ์ œ์–ด์˜ ๋‹จ์ : ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ๋ช…์ด๋ผ๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ , ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€๋Šฅ

(2) ๋น„๋™๊ธฐ์  ์ œ์–ด ํ๋ฆ„

โ€ข ๋น„๋™๊ธฐ์  ์ œ์–ด ํ๋ฆ„์€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ๋‹ค์Œ ๋ผ์ธ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
โ€ข ํ”„๋กœ๋ฏธ์Šค, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ๋“ฑ์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
โ€ข ์ฝ”๋“œ ํ๋ฆ„๊ณผ ์‹ค์ œ ์ œ์–ด ํ๋ฆ„์ด ๋‹ค๋ฅด๋‹ค.
โ€ข ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

let a = 10

setTimeout(function callback() { 
  	console.log('a : ', a)
}, 3000) 

console.log('Finished')

//Finished
//a: 10

2. ์ด๋ฒคํŠธ ๋ฃจํ”„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ

โ€ข ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข ๋Œ€์‹ , ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ •ํ•ด์ง„ 'ํ•จ์ˆ˜'๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข ์ด ํ•จ์ˆ˜๋“ค์„ API(Application Programming Interface)๋ผ ํ•œ๋‹ค.
โ€ข ๋น„๋™๊ธฐ API์˜ ์˜ˆ์‹œ๋กœ, setTimeout, XMLHttpRequest, fetch ๋“ฑ์˜ Web API๊ฐ€ ์žˆ๋‹ค.
โ€ข node.js์˜ ๊ฒฝ์šฐ ํŒŒ์ผ ์ฒ˜๋ฆฌ API, ์•”ํ˜ธํ™” API ๋“ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

// ํƒ€์ด๋จธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
setTimeout(() => console.log('ํƒ€์ด๋จธ๋'), 1000) 
setInterval(() => console.log('์ธํ„ฐ๋ฒŒํƒ€์ด๋จธ'), 1000)

// ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ
fetch('https://google.com')
	.then(() => console.log('๋„คํŠธ์›Œํฌ์š”์ฒญ์„ฑ๊ณต.')) 
  	.catch(() => console.log('๋„คํŠธ์›Œํฌ์š”์ฒญ์‹คํŒจ.'))

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ชจ๋ธ


=> ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝœ์Šคํƒ์„ ์ฝ๊ณ  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•จ, ์ฝœ์Šคํƒ์€ ์•„๋ž˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์Œ“์ด๊ฒŒ ๋œ๋‹ค, ์˜ˆ๋ฅผ๋“ค์–ด setTimeout์€ WEB API์— ๋“ฑ๋ก๋˜์—ˆ์„ ๋•Œ ๋ช‡ ์ดˆ ๋’ค ์ข…๋ฃŒ๋˜๋ฉด task queue๋กœ ๋“ค์–ด๊ฐ€๋„๋ก ์„ค์ • ๋˜์–ด์žˆ๋‹ค.

โ€ข ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ์™ธ๋ถ€์— ์žˆ๋‹ค.
โ€ข ์ด๋ฒคํŠธ ๋ฃจํ”„(event loop), ํƒœ์Šคํฌ ํ(task queue), ์žก ํ(job queue) ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
โ€ข API๋ชจ๋“ˆ์€ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ›„ ํƒœ์Šคํฌํ์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š”๋‹ค.
โ€ข ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋œ ํ›„ ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„(API ๋ชจ๋“ˆ ๋“ฑ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)์€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ํƒœ์Šคํฌ ํ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ฝœ์Šคํƒ์— ๋„ฃ๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์˜ˆ์‹œ

request("user-data", (userData) => { 
  	console.log("userData ๋กœ๋“œ") 
  	saveUsers(userData)
});

console.log("DOM ๋ณ€๊ฒฝ") 
console.log("์œ ์ € ์ž…๋ ฅ")

request๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•ด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚ฌ์„ ๋•Œ, userData๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜ task queue์— ๋„ฃ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

3. Promise

Promise API

โ€ข Promise API๋Š” ๋น„๋™๊ธฐ API ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
โ€ข ํƒœ์Šคํฌ ํ๊ฐ€ ์•„๋‹Œ ์žก ํ(Job queue, ํ˜น์€ microtask queue)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
โ€ข ์žก ํ๋Š” ํƒœ์Šคํฌ ํ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.

setTimeout(() => { 
  console.log("ํƒ€์ž„์•„์›ƒ 1");
}, 0);

Promise.resolve().then(() => console.log("ํ”„๋กœ๋ฏธ์Šค1"));

setTimeout(() => { 
  console.log("ํƒ€์ž„์•„์›ƒ 2");
}, 0);

Promise.resolve().then(() => console.log("ํ”„๋กœ๋ฏธ์Šค2"));

//ํ”„๋กœ๋ฏธ์Šค1 ํ”„๋กœ๋ฏธ์Šค2 
//ํƒ€์ž„์•„์›ƒ1 ํƒ€์ž„์•„์›ƒ2

//ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋น ๋ฅธ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

Promise

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

new Promise(callback)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ fetch()๊ฐ™์€ promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

promise์˜ ์ƒํƒœ

pending(์ง„ํ–‰) ์ƒํƒœ -> settled (์„ฑ๊ณต=resolved,fulfilled ํ˜น์€ ์‹คํŒจ=rejected) ์ƒํƒœ

Promise ์ƒ์„ฑ์ž

โ€ข new Promise(callback)
โ€ข callback ํ•จ์ˆ˜๋Š” (resolve, reject) ๋‘ ์ธ์ž๋ฅผ ๋ฐ›๋Š”๋‹ค.
โ€ข Promise๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ resolve๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
โ€ข Promise๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ reject๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

let promise = new Promise((resolve, reject) => {
	if (Math.random() < 0.5) { 
    	return reject("์‹คํŒจ") //0.5๋ณด๋‹ค ์ž‘์œผ๋ฉด '์‹คํŒจ'๋ฐ˜ํ™˜
	}
	resolve(10) //์„ฑ๊ณต ์‹œ 10์„ ๋ฐ˜ํ™˜
 })

Promise ๋ฉ”์„œ๋“œ

โ€ข then() ๋ฉ”์„œ๋“œ์— ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธด๋‹ค.
โ€ข catch() ๋ฉ”์„œ๋“œ์— ์‹คํŒจํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธด๋‹ค.
โ€ข finally() ๋ฉ”์„œ๋“œ๋Š” ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ชจ๋‘ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธด๋‹ค.
โ€ข then(callback1, callback2)๋กœ callback1์˜ ์ž๋ฆฌ์— ์„ฑ๊ณต์‹œ ์ฝœ๋ฐฑ, callback2์˜ ์ž๋ฆฌ์— ์‹คํŒจ์‹œ ์ฝœ๋ฐฑ์„ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.
(catch์—†์ด! ์˜ˆ๋ฅผ๋“ค๋ฉด .then(function onSuccess(){...},function onFailure(){...})

promise
  .then(data => {
	 console.log("์„ฑ๊ณต:", data) 
  })
  .catch(e => { 
  	 console.log("์‹คํŒจ:", e)
  })
  .finally(() => {
	 console.log("promise ์ข…๋ฃŒ") 
  })

Promise ๋ฉ”์„œ๋“œ ์ฒด์ธ

โ€ข then/catch ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜ ๋‹ค๋ฅธ promise๋ฅผ ๋ฆฌํ„ดํ•˜์—ฌ, ๋น„๋™๊ธฐ ์ฝ”๋“œ์— ์ˆœ์„œ๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.
โ€ข ์ด๋ ‡๊ฒŒ ๋™์ผํ•œ ๊ฐ์ฒด์— ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ฒด์ด๋‹(chaining) ์ด๋ผ ํ•œ๋‹ค.
โ€ข ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ฃผ์ฒด๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋๋‚ธ ๋’ค ์ž๊ธฐ ์ž์‹ ์„ ๋ฆฌํ„ด(return this๋ฅผ ์ƒ๋žตํ•œ ์ƒํƒœ)ํ•˜๋„๋ก ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

promise
  .then(data => {
	 return fetchUser(data) }) //ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
	 //๊ทธ ๋‹ค์Œ then์ด ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— promise๊ฐ€ ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค =๋น„๋™๊ธฐ ์ฝ”๋“œ์— ์ˆœ์„œ ๋ถ€์—ฌ
  .then(user => {
    console.log('User : ', user)
  })
  .catch(e => {
	console.log("์‹คํŒจ:", e) 
  })

Promise.resolve, Promise.reject

ํ”„๋กœ๋ฏธ์Šค๋Š” ์ •์ ์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค
new Promise๊ฐ€ ์•„๋‹ˆ๋ผ Promise๋ผ๋Š” ํด๋ž˜์Šค ๋ช…์— ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  ํ•จ์ˆ˜

โ€ข Promise.resolve ํ•จ์ˆ˜๋Š” ์„ฑ๊ณตํ•œ Promise๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ€ข Promise.reject ํ•จ์ˆ˜๋Š” ์‹คํŒจํ•œ Promise๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ€ข ์ธ์œ„์ ์œผ๋กœ Promise ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. promise๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”์—†์ด ๋ฐ”๋กœ ์„ฑ๊ณต,์‹คํŒจ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ!
โ€ข ๋น„๋™๊ธฐ ์ฝ”๋“œ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ ๋“ฑ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Promise
	.resolve(10) 
  	.then(console.log)

Promise 
   .reject("Error") 
   .catch(console.log)

Promise.all

์ด ๋˜ํ•œ ์ •์ ์ธ ๋ฉ”์„œ๋“œ : ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ• ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค
โ€ข Promise.all์€ Promise์˜ ๋ฐฐ์—ด์„ ๋ฐ›์•„ ๋ชจ๋‘ ์„ฑ๊ณต ์‹œ ๊ฐ Promise์˜ resolved ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ€ข ํ•˜๋‚˜์˜ Promise๋ผ๋„ ์‹คํŒจํ•  ์‹œ, ๊ฐ€์ • ๋จผ์ € ์‹คํŒจํ•œ Promise์˜ ์‹คํŒจ ์ด์œ ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Promise.all([ 
  promise1, 
  promise2, 
  promise3
])
  .then(values => {
	 console.log("๋ชจ๋‘์„ฑ๊ณต:", values) 
  })
  .catch(e => { 
  	 console.log("ํ•˜๋‚˜๋ผ๋„์‹คํŒจ:", e)
  })

4. async/await

โ€ข Promise๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ๋ฒ•.
โ€ข async/await ๋ฌธ๋ฒ•์œผ๋กœ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ '๋™๊ธฐ ์ฝ”๋“œ'์ฒ˜๋Ÿผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข async ํ•จ์ˆ˜๊ณผ await ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.
โ€ข await ํ‚ค์›Œ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
โ€ข async๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ Promise๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

async ํ•จ์ˆ˜

โ€ข async ํ•จ์ˆ˜๋Š” function ํ‚ค์›Œ๋“œ ์•ž์— async๋ฅผ ๋ถ™์—ฌ ๋งŒ๋“ ๋‹ค.
โ€ข async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
โ€ข fetchData, fetchUser๋Š” Promise๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

//์˜ˆ๋ฅผ๋“ค๋ฉด ์ด๋ ‡๊ฒŒ..
function fetchData(){
	return new Promise
}

//fetchData()
//	.then() //then์—์„œ data๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค
//	.catch()

async function asyncFunc() { 
	let data = await fetchData() 
    let user = await fetchUser(data)
  return user
}

โ€ข await ํ‚ค์›Œ๋“œ๋Š”, then ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.
โ€ข ๋น„๋™๊ธฐ ์ฝ”๋“œ์— ์‰ฝ๊ฒŒ ์ˆœ์„œ๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.

async function asyncFunc() {
  let data1 = await fetchData1()
  let data2 = await fetchData2(data1) //๋งŒ์•ฝ ์ด๊ฒŒ promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹ค์Œ await๋กœ ๊ฐ€๊ธฐ ์ „์— resolve๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค, promise์™€ ๊ฐ™๋‹ค
  let data3 = await fetchData3(data2)
  return data3
}

function promiseFunc() {
  return fetchData1() 
    .then(fetchData2) 
    .then(fetchData3)
}

์—๋Ÿฌ ์ฒ˜๋ฆฌ

โ€ข Promise๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด catch ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
โ€ข catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด async ํ•จ์ˆ˜์—์„œ try-catch ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

function fetchData1() {
  return request()
	.then((response) => response.requestData) 
    .catch(error => {
	  // error ๋ฐœ์ƒ
    }) 
}

โ€ข try-catch ๊ตฌ๋ฌธ์œผ๋กœ async/await ํ˜•ํƒœ ๋น„ ๋™๊ธฐ ์ฝ”๋“œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ€ข catch ์ ˆ์˜ e๋Š”, Promise์˜ catch ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ›๋Š” ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ๋™์ผํ•˜๋‹ค.

async function asyncFunc() {
  try {
	let data1 = await fetchData1()
    return fetchData2(data1)
  } catch (e) {
	console.log("์‹คํŒจ:", e) 
  }
}

4-1. ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋‚ด์šฉ

Callback -> Promise -> async/await

์ฝœ๋ฐฑํ•จ์ˆ˜

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋น„๋™๊ธฐ๋กœ ์ž‘๋™๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” 2์ดˆ ๋’ค์— Elice๋ผ๋Š” ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋ฐ›์€ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.

function getName(cb) {
    setTimeout(() => {
        cb("Elice");
    }, 2000);
}

์•ž์„  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด getName ํ•จ์ˆ˜์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

getName((name) => {
    console.log(name);
})
// 2์ดˆ ํ›„ Elice

๋งŒ์•ฝ getName ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ Elice๋ผ๋Š” ์ด๋ฆ„์„ 3๋ฒˆ ์ถœ๋ ฅํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?

๋‹ค์Œ๊ณผ ๊ฐ™์ด getName ํ•จ์ˆ˜๋ฅผ ์ ˆ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ค๋ฉด 2์ดˆ ๋’ค์— Elice๋ผ๋Š” ์ด๋ฆ„์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

getName((name) => {
    console.log(name);
})

getName((name) => {
    console.log(name);
})

getName((name) => {
    console.log(name);
})
// 2์ดˆ ํ›„
// Elice
// Elice
// Elice

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

function getName(cb) {
    setTimeout(() => {
        cb("Elice");
    }, 2000);
}

function getAge(cb) {
    setTimeout(() => {
        cb(6);
    }, 2000);
}

function getAddress(cb) {
    setTimeout(() => {
        cb("Seoul");
    }, 2000);
}

ํ•ด๋‹น ์ •๋ณด ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ console.log๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?
๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ง€ ์•Š๊ณ  ์ง์ ‘ ํ•œ๋ฒˆ ์‹œ๋„ํ•ด๋ณด์„ธ์š”.

getName((name) => {
    getAge((age) => {
        getAddress((address) => {
            console.log(name, age, address)
        })
    })
})

์•ž์„  ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ํ˜ธ์ถœํ•ด์•ผ name, age, address๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ 3๊ฐœ ์“ฐ์ด๊ณ , ๊ฐ 2์ดˆ์”ฉ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— 6์ดˆ ๋’ค์— Elice 6 Seoul์ด๋ผ๋Š” log๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค.

๋ฐ”๋กœ ์ด๊ฒƒ์„ ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ 3๊ฐœ๋งŒ ์ผ์„ ๋ฟ์ธ๋ฐ๋„,
์ฝ”๋“œ๊ฐ€ ์ •๋ง ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋” ๋งŽ๋‹ค๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ ๋” ํž˜๋“ค๊ฒ ์ฃ ?

Promise

์ž ์ด๋ฒˆ์—๋Š” Promise๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋ฐ”๊พธ์–ด ๋ด…์‹œ๋‹ค.
์•ž์„œ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ getName, getAge, getAddress๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Promise ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function getName() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve("Elice");
        }, 2000);
    })
}

function getAge() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(6);
        }, 2000);
    })
}

function getAddress() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve("Seoul");
        }, 2000);
    })
}

๊ฐ ํ•จ์ˆ˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Promise ๊ฐ์ฒด๋Š” ํ•ญ์ƒ 2์ดˆ ํ›„์— resolve ๋˜์–ด ์ด๋ฆ„, ๋‚˜์ด, ์ฃผ์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฃผ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

getName().then((res) => {
    console.log(res);
})

getAge().then((res) => {
    console.log(res);
})

getAddress().then((res) => {
    console.log(res);
})

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์—์„œ ์ œ์–ดํ•˜๊ธฐ ํž˜๋“ค๊ฒ ์ฃ ?
๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Promise
    .all([getName(), getAge(), getAddress()])
    .then((res) => {
        const [name, age, address] = res;
        console.log(name, age, address)
    })

Promise.all์€ ์ฒซ๋ฒˆ์งธ ์ธ์ž์— ๋ฐฐ์—ด์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐฐ์—ด์˜ ์›์†Œ๋Š” ๋ชจ๋‘ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
getName, getAge, getAddress ํ•จ์ˆ˜๋Š” ๋ชจ๋‘ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Promise.all์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Promise.all์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ์›์†Œ์— ์žˆ๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ์ ์œผ๋กœ 2์ดˆ ํ›„์— Elice 6 Seoul์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋™์‹œ์— Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ๋Š” ํ•  ์ˆ˜ ์—†๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

async/await

ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰์‹œ์‹คํ–‰ ํ•จ์ˆ˜ ํ˜•ํƒœ์— async ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await ํ‚ค์›Œ๋“œ์—์„œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolve ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— 6์ดˆ ํ›„์— Elice 6 Seoul์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

(async () => {
    const name = await getName();
    const age = await getAge();
    const address = await getAddress();

    console.log(name, age, address);
})();

Promise์™€ async/await๋Š” ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—
๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์—์„œ๋Š” Promise๊ฐ€ ์ฝ”๋“œ์— ์ผ๊ด€์„ฑ์„ ์ง€์ผœ์„œ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๊ณ , ๊ฐœ๋ณ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” asyne/await์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

5. HTTP, REST API

HTTP(Hypertext Transfer Protocol)

โ€ข Web์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ•œ ๊ฒƒ.
โ€ข ํด๋ผ์ด์–ธํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ € ๋“ฑ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋Œ€์ƒ.
โ€ข ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „๊นŒ์ง€ ๋Œ€์‘ํ•˜์ง€ ์•Š์Œ.
โ€ข ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์—๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ์š”์†Œ๊ฐ€ ์กด์žฌ.
โ€ข HTTP๋Š” ์ด๋Ÿฐ ์กด์žฌ๋“ค ์‚ฌ์ด์˜ ํ†ต์‹  ๋ฐฉ๋ฒ•์„ ๊ทœ์ •.

HTTP Message

โ€ข ์„œ๋ฒ„ ์ฃผ์†Œ, ์š”์ฒญ ๋ฉ”์„œ๋“œ, ์ƒํƒœ ์ฝ”๋“œ, target path, ํ—ค๋” ์ •๋ณด, ๋ฐ”๋”” ์ •๋ณด ๋“ฑ์ด ํฌํ•จ.
โ€ข ์š”์ฒญ ๋ฉ”์‹œ์ง€, ์‘๋‹ต ๋ฉ”์‹œ์ง€์˜ ๋ชจ์–‘์ด ๋‹ค๋ฆ„.
โ€ข HTTP/1.1 ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ์Œ.

HTTP Header

โ€ข HTTP ๋ฉ”์‹œ์ง€์˜ ํ—ค๋”์—๋Š” ์ฝ˜ํ…์ธ  ๊ด€๋ จ ์ •๋ณด, ์ธ์ฆ ๊ด€๋ จ ์ •๋ณด, ์ฟ ํ‚ค ์ •๋ณด, ์บ์‹œ ๊ด€๋ จ ์ •๋ณด ๋“ฑ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ„ ํ†ต์‹ ์‹œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
โ€ข ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์‹œ, ์„œ๋ฒ„ ์‘๋‹ต์‹œ ๋ชจ๋‘ ํ—ค๋”์— ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

HTTP Status

โ€ข HTTP ์š”์ฒญ ์‹œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค.
โ€ข 200, 400, 500 ๋“ฑ ์ˆซ์ž ์ฝ”๋“œ์™€, OK, NOT FOUND ๋“ฑ์˜ ํ…์ŠคํŠธ๋กœ ์ด๋ฃจ์–ด์ง.
โ€ข ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๊ฐ ๊ฒฐ๊ณผ์— ํ•ด๋‹นํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ.

์š”์ฒญ ๋ฉ”์„œ๋“œ

โ€ข HTTP์—์„œ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
โ€ข ์š”์ฒญ์‹œ์š”์ฒญ๋ฉ”์„œ๋“œ๋กœํŠน์ •์š”์ฒญ์—๋Œ€ํ•œ๋™์ž‘์„์ •์˜ํ•œ๋‹ค.
โ€ข GET, POST, PUT, PATCH, DELETE, OPTIONS, CONNECT, TRACE ๋“ฑ์ด ๊ทœ์ •๋จ.

REST API(Representational State Transfer API)

โ€ข API(Application Programming Interface)๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
โ€ข REST API๋Š” HTTP์˜ ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ์‘ํ•˜๋Š” ์„œ๋ฒ„ API์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ํ†ต์‹ ์˜ ๊ตฌ์กฐ๊ฐ€ ์ง€์ผœ์•ผ ํ•  ์ข‹์€ ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค.
โ€ข ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์œผ๋กœ๋Š” ์š”์ฒญ ๋ฉ”์„œ๋“œ์˜ ์˜๋ฏธ, URI ์„ค๊ณ„, ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ๋™์ž‘ ๋“ฑ์„ ์ •์˜ํ•œ๋‹ค.

โ€ข GET - ๋ฆฌ์†Œ์Šค ์ •๋ณด๋ฅผ ์–ป์Œ.
โ€ข POST - ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ.
โ€ข PUT - ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ.
โ€ข DELETE - ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐ.

6. Fetch API

โ€ข ๊ธฐ์กด XMLHTTPRequest๋ฅผ ๋Œ€์ฒดํ•˜๋Š” HTTP ์š”์ฒญ API.
โ€ข ES6์— ์ถ”๊ฐ€๋œ Promise๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ์ •์˜๋จ.
โ€ข ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์„ฑ๊ณต ์‹œ, Promise๋Š” Response ๊ฐ์ฒด๋ฅผ resolve ํ•œ๋‹ค.
โ€ข ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹คํŒจ ์‹œ, Promise๋Š” ์—๋Ÿฌ๋ฅผ reject ํ•œ๋‹ค.

let result = fetch(serverURL)

result
	.then(response => {
		if (response.ok) { 
          // ์š”์ฒญ์„ฑ๊ณต.
		} 
	})
	.catch(error => { 
  		// ์š”์ฒญ์‹คํŒจ.
	})

Response

โ€ข Response ๊ฐ์ฒด๋Š” ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.
โ€ข response.ok๋Š” HTTP Status code๊ฐ€ 200-299 ์‚ฌ์ด๋ฉด true, ๊ทธ ์™ธ false์ด๋‹ค.
โ€ข response.status๋Š” HTTP status code๋ฅผ ๋‹ด๋Š”๋‹ค.
โ€ข response.url์€ ์š”์ฒญํ•œ URL ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค.

fetch(serverURL)
  .then(response => {
	 response.ok 
     response.status 
  	 response.statusText 
  	 response.url 
  	 response.bodyUsed
})

โ€ข response.headers๋กœ Response ๊ฐ์ฒด์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

fetch(serverURL)
  .then(resp => {
	 for (let [k, v] of resp.headers) {
      console.log(k, v)
     }
  })

Body ๋ฉ”์„œ๋“œ

โ€ข response.json() ๋ฉ”์„œ๋“œ๋Š” ์–ป์–ด์˜จ body ์ •๋ณด๋ฅผ json์œผ๋กœ ๋งŒ๋“œ๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ€ข Promise๊ฐ€ resolve ๋˜๋ฉด ์–ป์–ด์˜จ body ์ •๋ณด๋ฅผ ์ฝ๋Š”๋‹ค.
โ€ข response.text(), response.blob(), response.formData() ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋กœ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋ฐ”๋””๋ฅผ ์ฝ๋Š”๋‹ค.

fetch(serverURL)
  .then(response => {
	return response.json() 
  })
  .then(json => {
    console.log('body : ',json) 
  })

POST ์š”์ฒญ

โ€ข fetch(url, options) ๋กœ, fetch ๋ฉ”์„œ๋“œ ์˜ต์…˜์„ ๋„ฃ๋Š”๋‹ค.
โ€ข method ํ•„๋“œ๋กœ ์—ฌ๋Ÿฌ ์š”์ฒญ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
โ€ข headers, body ํ•„๋“œ๋ฅผ ํ™œ์šฉํ•ด ์„œ๋ฒ„์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋ณด๋‚ธ๋‹ค.

fetch(serverURL, { 
  method: 'post', 
  headers: {
    'Content-Type':
	'application/json;charset=utf-8',
    Authentication: 'mysecret'
  },
  body: JSON.stringify(formData)
})
  .then(response => {
    return response.json()
  })
  .then(json => {
	console.log('POST์š”์ฒญ๊ฒฐ๊ณผ:', json) 
  })
profile
๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€