๐Ÿ“ ์‚ฌ์ „๊ณต๋ถ€!

HTTP๋ž€ Hypertext Transfer Protocol์˜ ์•ฝ์ž๋กœ Client์™€ Server๊ฐ„์˜ ํ†ต์‹ ์˜ ์•ฝ์†์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ(request)ํ•˜๊ณ  ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ทธ์— ๋งž๋Š” ์‘๋‹ต(response)์„ ๋ณด๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ Hypertext๋ž€ ์›น์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•˜์ดํผ๋งํฌ(Hyperlink)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋“ค(๋ฌธ์„œ, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ํฌํ•จํ•ด์„œ ๋งํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ HTTP๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” AJAX๊ฐ€ ์žˆ๋‹ค. Asynchronous JavaAScript and XML์˜ ์•ฝ์ž๋กœ ์›นํŽ˜์ด์ง€์—์„œ ๋™์ ์œผ๋กœ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ค๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” XMLHttpRequest๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ๋‹ค. ์ด ์˜ค๋ธŒ์ ํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € API์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ค‘์˜ ํ•˜๋‚˜๋กœ ์ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ตœ๊ทผ ๋ธŒ๋ผ์šฐ์ € API์— ์ถ”๊ฐ€๋œ fetch() API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ญ์‹œ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌด์กฐ๊ฑด ์‹ ์ƒ์ด๋ผ๊ณ  ํ•ด์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์‚ฌ์‹ค! ์ด API๋Š” ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ์—์„œ ์ง€์›์ด ๋˜์ง€ ์•Š์œผ๋‹ˆ ์œ ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

XML

XML์€ HTML๊ณผ ๊ฐ™์€ ๋งˆํฌ์—… ์–ธ์–ด ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค. ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ HTML๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜์ด๋‹ค. ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ์—๋Š” XML๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ํŒŒ์ผ ํฌ๋งท์„ ํ†ตํ•ด ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์š”์ฆ˜์€ JSON์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.

XHR์˜ ํƒ„์ƒ

AJAX์™€ XHR(XMLHttpRequset)์ด ํ™œ๋ฐœํžˆ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์„ ๋‹น์‹œ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์‚ฌ์— ์žˆ๋Š” ์•„์›ƒ๋ฃฉ ๊ฐœ๋ฐœํŒ€์ด ํ™œ๋ฐœํžˆ ์ฐธ์—ฌํ•˜์˜€๋Š”๋ฐ ์ด ๊ฐœ๋ฐœํŒ€์€ ํ†ต์‹ ์ˆ˜๋‹จ์œผ๋กœ XML์„ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ „์†ก๋ฐฉ๋ฒ•(HttpRequest)์˜ ์•ž์— ์•ž์— XML์„ ๋œปํ•˜๋Š” X๋ฅผ ๋„ฃ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ์—๋Š” XML ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์— XML์„ ๋ถ™์ธ ๊ฒƒ์€ ์ž˜๋ชป๋œ ๋ช…๋ช…๋ฒ•์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค ๋“ฑ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋Š” API๋ฅผ ๋งŒ๋“ค ๋•Œ์—๋Š” API์˜ ์ด๋ฆ„์„ ๋ช…๋ฃŒํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์  ์žŠ์ง€๋ง์ž!

JSON

๋ธŒ๋ผ์šฐ์ €์—์„œ ํ†ต์‹ ์„ ํ• ๋•Œ๋Š” fetch()๋‚˜ XHR์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ์„ ํ•˜๋Š”๋ฐ XML์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ํƒœ๊ทธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋“ค์–ด๊ฐ€์„œ ์‚ฌ์ด์ฆˆ๋„ ์ปค์ง€๊ณ  ์ฝ๊ธฐ ๋ถˆํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฆ˜์€ JSON์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. JSON์€ JavaScript Object Notaiton์˜ ์•ฝ์ž๋กœ 1999๋…„ ๋ฐœํ‘œ๋œ ECMAScript3์˜ ์˜ค๋ธŒ์ ํŠธ์— ์˜๊ฐ์„ ๋ฐ›์•„์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐํฌ๋งท์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์˜ค๋ธŒ์ ํŠธ๋Š” ํ‚ค(Key)์™€ ๊ฐ’(Value)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ ๋ธŒ๋ผ์šฐ์ € ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋ฐ”์ผ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ๋˜๋Š” ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŒŒ์ด๋ฆฟ์Šคํ…œ์— ์ €์žฅํ• ๋•Œ์—๋„ JSONํƒ€์ž…์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

ํ•œ๋งˆ๋””๋กœJSON์€

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ํฌ๋งท
  • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐ€๋ฒผ์›€
  • ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ํŽธํ•จ
  • ํ‚ค์™€ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ํŒŒ์ผ ํฌ๋งท
  • ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์™€ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์ง๋ ฌํ™”(serialization)์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๋‚˜ ํ”Œ๋žซํผ์—์ƒ๊ด€ ์—†์ด ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค !important

JSON ๊ณต๋ถ€ ํฌ์ธํŠธ

  1. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ „์†กํ•˜๋Š”๊ฐ€?
  2. ์ง๋ ฌํ™”๋œ JSON์„ ์–ด๋–ป๊ฒŒ deserializeํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š”๊ฐ€?

JSON์˜ค๋ธŒ์ ํŠธ ์•ˆ์—๋Š” ๋‘๊ฐœ์˜ API๊ฐ€ ์žˆ๋‹ค. parse stringify ๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฐ API๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด ์žˆ๋‹ค.

Object to JSON

// JSON์˜ค๋ธŒ์ ํŠธ์— ์žˆ๋Š” stringify์™€ parse๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.
let json = JSON.stringify(true)
console.log(json) // true

json = JSON.stringify(['apple', 'banana']);
console.log(json) // ["apple", "banana"] -> ์‹ฑ๊ธ€์—์„œ ๋”๋ธ” ์ฟผํ…Œ์ด์…˜์œผ๋กœ ๋ฐ”๋€ ๊ฑฐ์— ์ฃผ๋ชฉ!

const rabbit = {
  name: 'tori',
  color: 'white',
  birthDate: new Date(),
  jump: () => { console.log(`${name} can jump!`) }
}

json = JSON.stringify(rabbit)
console.log(json) 
// {"name":"tori","color":"white","birthDate":"2020-10-30T08:59:05.130Z"}
// jump๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!
// JS์—๋งŒ ์žˆ๋Š” Symbol๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค๋„ JSON์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

// reviver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
json = JSON.stringify(rabbit, ['name']) // {"name":"tori"}
json = JSON.stringify(rabbit, ['name', 'color']) // {"name":"tori", "color":"white"}
json = JSON.stringify(rabbit, (key, value) => {
  console.log(`key: ${key}, value: ${value}`)
}) // ์ œ์ผ ์ฒ˜์Œ ์ „๋‹ฌ๋˜๋Š”๊ฑด ์˜ค๋ธŒ์ ํŠธ ๊ทธ ์ž์ฒด! ๊ทธ ํ›„ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฐ’๋“ค์„ ํ•˜๋‚˜์”ฉ ์ฝ๋Š”๋‹ค.

JSON to Object

json = JSON.stringify(rabbit);
const obj = JSON.parse(json);
console.log(obj) // {"name":"tori","color":"white","birthDate":"2020-10-30T08:59:05.130Z"}

// ํ•จ์ˆ˜๋Š” serialize๋  ๋•Œ JSON์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ obj์—๋Š” ์›๋ž˜ rabbit์— ์žˆ๋˜ jump()๊ฐ€ ์—†๋‹ค.
rabbit.jump() // can jump!
obj.jump() // Uncaught TypeError

// ์›๋ž˜ rabbit์— ์žˆ๋Š” birthDate๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‚˜ JSON์œผ๋กœ ๋“ค์–ด๊ฐ„ ๊ฐ’์€ ์ŠคํŠธ๋ง์ด๋ฏ€๋กœ 
// Date์— ๊ด€๋ จ๋œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.
console.log(rabbit.birthDate.getDate()) // 2020-10-30T08:59:05.130Z
console.log(obj.birthDate.getDate()) // Error!

// ์ด๋Š” reviver์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ obj์•ˆ์— Date ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค
const obj = JSON.parse(json, key, value) => {
  return key === 'bitrhDate'? new Date(value): value;
})

ํ•™์Šต์— ์œ ์šฉํ•œ ์‚ฌ์ดํŠธ

JSON DIFF : ๋‘๊ฐœ์˜ JSON์„ ๋น„๊ตํ•˜์—ฌ ๋‹ค๋ฅธ์ ์„ ์ฐพ์•„์ฃผ๋Š” ์‚ฌ์ดํŠธ. ๋””๋ฒ„๊น…ํ• ๋•Œ ์œ ์šฉํ•˜๋‹ค.

JSON Beautifier : JSON ํฌ๋งท์„ ๋ณต์‚ฌํ•˜๋ฉด์„œ ํฌ๋งท์ด ๋ง๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ ๊ณ ์ณ์ค€๋‹ค.

JSON Parser : JSON ํŒŒ์ผ์˜ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์„œ ๋ณด์—ฌ์ค€๋‹ค.

JSON Validator : ํ•ด๋‹น JSON ์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์ค€๋‹ค!