43์žฅ Ajax

43.1 Ajax๋ž€?

Ajax(Asynchronous JavaScript and Xml)์ด๋ž€

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

  • Ajax๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” WEB API์ธ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. XMLHttpRequest๋Š” HTTP ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํ•œ์ •์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

Traditional
Ajax

์ „ํ†ต์  ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ์˜ Ajax ์žฅ์ 

  • ๋ณ€๊ฒฝํ•  ๋ถ€๋ถ„์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „์†ก๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ถ€๋ถ„์€ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ™”๋ฉด์ด ์ˆœ๊ฐ„์ ์œผ๋กœ ๊นœ๋นก์ด๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ด ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ๋ณด๋‚ธ ์ดํ›„ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

43.2 JSON

JSON(JavaScript Object Notation)์€ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ HTTP ํ†ต์‹ ์„ ์œ„ํ•œ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ํฌ๋งท์ด๋‹ค. JS์— ์ข…์†๋˜์ง€ ์•Š๋Š” ์–ธ์–ด ๋…๋ฆฝํ˜• ๋ฐ์ดํ„ฐ ํฌ๋งท์ด๊ธฐ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

43.2.1 JSON ํ‘œ๊ธฐ ๋ฐฉ์‹

JSON์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ˆœ์ˆ˜ ํ…์ŠคํŠธ๋‹ค.

{
  "name": "Lee",
  "age": 24,
  "alive": true,
  "hobby": ["traveling", "tennis"]
}

JSON์˜ ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค. ๊ฐ’์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๊ณผ ๊ฐ™์€ ํ‘œ๊ธฐ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์€ ๋ฐ˜๋“œ์‹œ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผํ•œ๋‹ค. ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

43.2.2 JSON.stringify

JSON.stringify ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ๊ฐ์ฒด๋ฅผ ์ „์†กํ•˜๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ดํ™” ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์ง๋ ฌํ™”(serializing)์ด๋ผ ํ•œ๋‹ค.

// value : JSON์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•  ๊ฐ’, replacer : ๋ฌธ์ž์—ดํ™” ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜,
// ํ˜น์€ JSON ๋ฌธ์ž์—ด์— ํฌํ•จ๋  ๊ฐ’ ๊ฐ์ฒด์˜ ์†์„ฑ๋“ค์„ ์„œ๋‚ตํ•˜๊ธฐ ์œ„ํ•œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ ์“ฐ์ด๋Š” String, Number ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด
// ์ด ๊ฐ’์ด null ์ด๊ฑฐ๋‚˜ ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด, ๊ฐ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ๋“ค์ด JSON ๋ฌธ์ž์—ด ๊ฒฐ๊ณผ์— ํฌํ•จ๋œ๋‹ค.
// space : ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๊ณต๋ฐฑ
JSON.stringify(value[, replacer[, space]])

43.2.3 JSON.parse

JSON.parse ๋ฉ”์„œ๋“œ๋Š” JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

  • ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋œ JSON๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด

  • ์ด ๋ฌธ์ž์—ด์„ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ฐ์ฒดํ™”(์—ญ์ง๋ ฌํ™”) ํ•ด์•ผ๋œ๋‹ค.

  • JSON์— ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, JSON.parse๋Š” ๋ฌธ์ž์—ด โ†’ ๋ฐฐ์—ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

const obj = {
    name:"Lee",
    age: 24,
    alive: true,
    hobby:["traveling", "tennis"]
}

const json = JSON.stringify(obj); // ๊ฐ์ฒด -> JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด
const parsed = JSON.parse(json); // JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด -> ๊ฐ์ฒด

console.log(typeof parsed, parsed); //object {name:"Lee", age: 24, alive: true, hobby:["traveling", "tennis"]}

๐Ÿ’ก ๋ฐฐ์—ด์ด JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ JSON.parse๋Š” ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ์š”์†Œ๊นŒ์ง€ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

const todos = [
	{id : 1, content : 'HTML', completed: false},
	{id : 2, content : 'CSS', completed: true},
	{id : 3, content : 'JS', completed: false},
]

const json = JSON.stringify(todos); // ๋ฐฐ์—ด -> JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
const parsed = JSON.stringify(json); // JSON ํฌ๋งท์˜ ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜, ๋ฐฐ์—ด์˜ ์š”์†Œ๊นŒ์ง€ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

43.3 XMLHttpRequest

๋ธŒ๋ผ์šฐ์ €๋Š” ์ฃผ์†Œ์ฐฝ์ด๋‚˜ HTML์˜ form ํƒœ๊ทธ ๋˜๋Š” a ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด HTTP ์š”์ฒญ ์ „์†ก ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ ์ œ๊ณตํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ์ „์†กํ•˜๋ ค๋ฉด XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

43.3.1 XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ

  • XMLHttpRequest ๊ฐ์ฒด๋Š” XMLHttpRequest ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

  • ์ด ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” Web API์ด๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋งŒ ์ •์ƒ ์‹คํ–‰๋œ๋‹ค.

const xhr = new XMLHttpRequest();

43.3.2 XMLHttpRequest ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ

  • XMLHttpRequest๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

XMLHttpRequest ๊ฐ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ

ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํผํ‹ฐ
์„ค๋ช…

readyState

HTTP ์š”์ฒญ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜์‚ฌํƒœ๋Š” ์ •์ˆ˜. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •์  ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–๋Š”๋‹ค. (๋งจ ๋ฐ‘์— ๋‚˜์˜ด)

status

HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ EX) 200

statusText

HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด EX) โ€œOKโ€

responseType

HTTP ์‘๋‹ต ํƒ€์ž… EX) document, json

response

HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋ชธ์ฒด, responseType์— ๋”ฐ๋ผ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค.

XMLHttpRequest ๊ฐ์ฒด์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ
์„ค๋ช…

onreadystatechange

readyStateํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋œ ๊ฒฝ์šฐ

onerror

HTTP ์š”์ฒญ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ

onload

HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•œ ๊ฒฝ์šฐ

XMLHttpRequest ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ
์„ค๋ช…

open

HTTP ์š”์ฒญ ์ดˆ๊ธฐํ™”

send

HTTP ์š”์ฒญ ์ „์†ก

abort

์ด๋ฏธ ์ „์†ก๋œ ์š”์ฒญ ์ค‘๋‹จ

setRequestHeader

ํŠน์ • HTTP ์š”์ฒญ ํ—ค๋”์˜ ๊ฐ’์„ ์„ค์ •

XMLHttpRequest ๊ฐ์ฒด์˜ ์ •์  ํ”„๋กœํผํ‹ฐ

์ •์  ํ”„๋กœํผํ‹ฐ
๊ฐ’
์„ค๋ช…

UNSENT

0

open ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ด์ „

OPEND

1

open ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ดํ›„

HEADERS_RECEIVED

2

send ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ดํ›„

LOADING

3

์„œ๋ฒ„ ์‘๋‹ต ์ค‘

DONE

4

์„œ๋ฒ„ ์‘๋‹ต ์™„๋ฃŒ

43.3.3 HTTP ์š”์ฒญ ์ „์†ก

HTTP ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

  1. XMLHttpRequestp.prototype.setRequestHeader ๋ฉ”์„œ๋“œ๋กœ ํŠน์ • HTTP ์š”์ฒญ์˜ ํ—ค๋” ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

  2. ํ•„์š”์— ๋”ฐ๋ผ์„œ XMLHttpRequest.prototype.setRequestHeader ๋ฉ”์„œ๋“œ๋กœ ํŠน์ • HTTP ์š”์ฒญ์˜ ํ—ค๋” ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค

  3. XMLHttpRequest.prototype.send ๋ฉ”์„œ๋“œ๋กœ HTTP ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.

const xhr = new XMLHttpRequest(); // ๊ฐ์ฒด ์ƒ์„ฑ
xhr.open("GET", "/user"); // HTTP ์š”์ฒญ ์ดˆ๊ธฐํ™”
xhr.setRequestHeader("content-type", "application/json"); // HTTP ์š”์ฒญํ—ค๋” ์„ค์ •, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋ฐ์ดํ„ฐ์˜ MIME ํƒ€์ž… ์ง€์ • : json
xhr.send(); // HTTP ์š”์ฒญ ์ „์†ก
  • XMLHttpRequest.prototype.open open ๋ฉ”์„œ๋“œ๋Š” ์„œ๋ฒ„์— ์ „์†กํ•  HTTP ์š”์ฒญ์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. open ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

    xhr.open(method, url[, async])
    ๋งค๊ฐœ๋ณ€์ˆ˜
    ์„ค๋ช…

    method

    HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ (โ€GETโ€, โ€œPOSTโ€, โ€œPUTโ€, โ€œDELETEโ€๋“ฑ )

    url

    HTTP ์š”์ฒญ์„ ์ „์†กํ•  URL

    async

    ๋น„๋™๊ธฐ ์š”์ฒญ ์—ฌ๋ถ€, ์˜ต์…˜์œผ๋กœ ๊ธฐ๋ณธ ๊ฐ’์€ true์ด๋ฉฐ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • ์ฃผ๋กœ 5๊ฐ€์ง€ ์š”์ฒญ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ CRUD๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ
์ข…๋ฅ˜
๋ชฉ์ 
ํŽ˜์ด๋กœ๋“œ (์ „์†ก ๋  ๋ฐ์ดํ„ฐ ์œ ๋ฌด)

GET

index/retrieve

๋ชจ๋“ /ํŠน์ • ๋ฆฌ์†Œ์Šค ์ทจ๋“

X

POST

create

๋ฆฌ์†Œ์Šค ์ƒ์„ฑ

O

PUT

replace

๋ฆฌ์†Œ์Šค ์ „์ฒด ๊ต์ฒด

O

PATCH

modify

๋ฆฌ์†Œ์Šค ์ผ๋ถ€ ์ˆ˜์ •

O

DELETE

delete

๋ชจ๋“ /ํŠน์ • ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

X

  • XMLHttpRequest.prototye.send

    • send ๋ฉ”์„œ๋“œ๋Š” open ๋ฉ”์„œ๋“œ๋กœ ์ดˆ๊ธฐํ™”๋œ HTTP ์š”์ฒญ์„ ์„œ๋ฒ„์— ์ „์†กํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ๋Š” GET, POST ์š”์ฒญ ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ์ „์†ก ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

    • GET ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ URL์˜ ์ผ๋ถ€์ธ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด๋กœ ์„œ๋ฒ„์— ์ „์†กํ•œ๋‹ค.

    • POST ์š”์ฒญ ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ ๋ชธ์ฒด์— ๋‹ด์•„ ์ „์†กํ•œ๋‹ค.

    • send ๋ฉ”์„œ๋“œ์—๋Š” ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ JSON.stringfy ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ง๋ ฌํ™”ํ•œ ๋‹ค์Œ ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค.

    xhr.send(JSON.stringify({ id: 1, content: "HTML", completed: false }));
  • XMLHttpRequest.prototype.setRequestHeader

    • setRequestHeader ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • HTTP ์š”์ฒญ์˜ ํ—ค๋” ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

    • ๋ฐ˜๋“œ์‹œ open ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์— ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

    • Content-type์€ ์š”์ฒญ ๋ชธ์ฒด์— ๋‹ด์•„ ์ „์†กํ•  ๋ฐ์ดํ„ฐ์˜ MIME ํƒ€์ž…์˜ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

      MIME ํƒ€์ž…
      ์„œ๋ธŒํƒ€์ž…

      text

      text/plain, text/html, text/css, text/javascript

      application

      application/json, application/x-www-form-urlencode

      multipart

      multipart/form-data

43.3.4 HTTP ์‘๋‹ต ์ฒ˜๋ฆฌ

  • ์„œ๋ฒ„๊ฐ€ ์ „์†กํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด XMLHttpRequest ๊ฐ์ฒด๊ฐ€ ๋ฐœ์ƒ ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ”„๋กœํผํ‹ฐ ์ค‘, HTTP ์š”์ฒญ์ด ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” readyState ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” readystatechange ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    const xhr = new XMLHttpRequest();
    
    // HTTP ์š”์ฒญ ์ดˆ๊ธฐํ™”
    // Fake REST API ์ œ๊ณต ์„œ๋น„์Šค์ด๋‹ค
    xhr.open('GET', "https://jsonplaceholder.typicode.com/todos/1');
    
    // HTTP ์š”์ฒญ ์ „์†ก
    xhr.send();
    
    // ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” readyState ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ๋ฐœ์ƒ
    // XMLHttpRequest.DONE == 4
    xhr.onreadystatechange = () => {
    	if(xhr.readyState !== XMLHttpRequest.DONE) return;
    	if(xhr.status === 200) {
    		console.log(JSON.parse(xhr.response));
    	} else{
    		console.error('Error', xhr.status, xhr.statusText);
    	}
    }

Last updated