ํฐ์คํ ๋ฆฌ ๋ทฐ
[JavaScript] Ajax
๊ฐ๋ฐ๊ฐ๊ตด๐ธ 2022. 8. 15. 22:59Ajax๋?
Ajax(Asynchronous JavaScript and XML)๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ์๋ฒ๊ฐ ์๋ตํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ฌ ์นํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ๊ฐฑ์ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋งํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ธ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์
- XMLHttpRequest๋ HTTP ๋น๋๊ธฐ ํต์ ์ ์ํ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ์ ๊ณต
์ด์ ์ ์นํ์ด์ง๋ ์์ ํ HTML์ ์๋ฒ๋ก๋ถํฐ ์ ์ก๋ฐ์ ์นํ์ด์ง ์ ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ๋ ๋๋ง ํ๋ ๋ฐฉ์์ผ๋ก, ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ๋ถ๋ถ๊น์ง ๋ค์ ๋ ๋๋ง๋๋ ๋จ์ ์ด ์์์ต๋๋ค. ํ์ง๋ง Ajax์ ๋ฑ์ฅ์ ์ด์ ์ ์ ํต์ ์ธ ํจ๋ฌ๋ค์์ ํ๊ธฐ์ ์ผ๋ก ์ ํํ์ต๋๋ค.
- ์๋ฒ๋ก๋ถํฐ ์นํ์ด์ง์ ๋ณ๊ฒฝ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ์ก๋ฐ์ ๋ถํ์ํ ๋ฐ์ดํฐ ํต์ ๋ฐ์ X
- ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ๋ถ๋ถ๋ง ํ์ ์ ์ผ๋ก ๋ ๋๋งํด ํ๋ฉด์ด ์๊ฐ์ ์ผ๋ก ๊น๋ฐ์ด๋ ํ์์ด ๋ฐ์ X
- ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ํต์ ์ด ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํด ์๋ฒ์์ ์์ฒญ์ ๋ณด๋ธ ์ดํ ๋ธ๋กํน์ด ๋ฐ์ X
- ๋ธ๋ผ์ฐ์ ์์๋ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ ์ฌํ ๋น ๋ฅธ ํผํฌ๋จผ์ค์ ๋ถ๋๋ฌ์ด ํ๋ฉด ์ ํ์ด ๊ฐ๋ฅ
JSON
JSON(JavaScript Object Notation)์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ HTTP ํต์ ์ ์ํ ํ ์คํธ ๋ฐ์ดํฐ ํฌ๋งท์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์ ์ข ์๋์ง ์๋ ์ธ์ด ๋ ๋ฆฝํ ๋ฐ์ดํฐ ํฌ๋งท์ ๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
JSON ํ๊ธฐ ๋ฐฉ์
JSON์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ์ ์ฌํ๊ฒ ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์์ํ ํ ์คํธ์ ๋๋ค.
{
"name": "Lee",
"age": 20,
"alive": true,
"hobby": ["traveling", "tennis"]
}
- JSON์ ํค : ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํจ
- JSON์ ๊ฐ : ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ๊ฐ์ ํ๊ธฐ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์ง๋ง ๋ฌธ์์ด์ ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํจ
JSON.stringify
์ง๋ ฌํ(serializing)๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๊ฐ์ฒด๋ฅผ ์ ์กํ๊ธฐ ์ํด ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ดํํ๋ ๊ฒ์ ๋๋ค. ์ด๋, JSON.stringify
๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ๋ํ, JSON.stringify ๋ฉ์๋๋ ๊ฐ์ฒด๋ฟ๋ง ์๋๋ผ ๋ฐฐ์ด๋ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค.
// ๊ฐ์ฒด ๋ณํ
const obj = {
name: 'Lee',
age: 20,
alive: true,
hobby: ['traveling', 'tennis']
};
// ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
const json = JSON.stringify(obj);
console.log(typeof json, json);
// string {"name":"Lee","age":20,"alive":true,"hobby":["traveling","tennis"]}
// ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํ๋ฉด์ ๋ค์ฌ์ฐ๊ธฐ ํ๋ค.
const prettyJson = JSON.stringify(obj, null, 2);
console.log(typeof prettyJson, prettyJson);
/*
string {
"name": "Lee",
"age": 20,
"alive": true,
"hobby": [
"traveling",
"tennis"
]
}
*/
// replacer ํจ์. ๊ฐ์ ํ์
์ด Number์ด๋ฉด ํํฐ๋ง๋์ด ๋ฐํ๋์ง ์๋๋ค.
function filter(key, value) {
// undefined: ๋ฐํํ์ง ์์
return typeof value === 'number' ? undefined : value;
}
// JSON.stringify ๋ฉ์๋์ ๋ ๋ฒ์งธ ์ธ์๋ก replacer ํจ์๋ฅผ ์ ๋ฌํ๋ค.
const strFilteredObject = JSON.stringify(obj, filter, 2);
console.log(typeof strFilteredObject, strFilteredObject);
/*
string {
"name": "Lee",
"alive": true,
"hobby": [
"traveling",
"tennis"
]
}
*/
// ๋ฐฐ์ด ๋ณํ
const todos = [
{ id: 1, content: 'HTML', completed: false },
{ id: 2, content: 'CSS', completed: true },
{ id: 3, content: 'Javascript', completed: false }
];
// ๋ฐฐ์ด์ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
const json = JSON.stringify(todos, null, 2);
console.log(typeof json, json);
/*
string [
{
"id": 1,
"content": "HTML",
"completed": false
},
{
"id": 2,
"content": "CSS",
"completed": true
},
{
"id": 3,
"content": "Javascript",
"completed": false
}
]
*/
JSON.parse
JSON.parse ๋ฉ์๋๋ JSON ํฌ๋งท์ ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค. ์๋ฒ๋ก๋ถํฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋ JSON ๋ฐ์ดํฐ๋ฅผ
๊ฐ์ฒด๋ก์ ์ฌ์ฉํ๋ ค๋ฉด JSON ํฌ๋งท์ ๋ฌธ์์ด์ ๊ฐ์ฒดํํด์ผ ํ๋๋ฐ ์ด๋ฅผ ์ญ์ง๋ ฌํ(deserializing)๋ผ๊ณ ํฉ๋๋ค.
const obj = {
name: 'Lee',
age: 20,
alive: true,
hobby: ['traveling', 'tennis']
};
// ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
const json = JSON.stringify(obj);
// JSON ํฌ๋งท์ ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
const parsed = JSON.parse(json);
console.log(typeof parsed, parsed);
// object {name: "Lee", age: 20, 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: 'Javascript', completed: false }
];
// ๋ฐฐ์ด์ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
const json = JSON.stringify(todos);
// JSON ํฌ๋งท์ ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ณํํ๋ค. ๋ฐฐ์ด์ ์์๊น์ง ๊ฐ์ฒด๋ก ๋ณํ๋๋ค.
const parsed = JSON.parse(json);
console.log(typeof parsed, parsed);
/*
object [
{ id: 1, content: 'HTML', completed: false },
{ id: 2, content: 'CSS', completed: true },
{ id: 3, content: 'Javascript', completed: false }
]
*/
XMLHttpRequest
๋ธ๋ผ์ฐ์ ๋ ์ฃผ์์ฐฝ์ด๋ HTML์ form ํ๊ทธ ๋๋ a ํ๊ทธ๋ฅผ ํตํด HTTP ์์ฒญ ์ ์ก ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ์ ๊ณตํ๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ์ ์ ์กํ๋ ค๋ฉด XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Web API์ธ XMLHttpRequest ๊ฐ์ฒด๋ HTTP ์์ฒญ ์ ์ก๊ณผ HTTP ์๋ต ์์ ์ ์ํ ๋ค์ํ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
XMLHttpRequest ๊ฐ์ฒด ์์ฑ
XMLHttpRequest ๊ฐ์ฒด๋ XMLHttpRequest ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ฑํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ด๋ฏ๋ก ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ์ ์์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
const xhr = new XMLHttpRequest();
XMLHttpRequest ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๋ฉ์๋
XMLHttpRequest ๊ฐ์ฒด์ ๋ค์ํ ํ๋กํผํฐ์ ๋ฉ์๋ ์ค ๋ํ์ ์ธ ํ๋กํผํฐ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋กํ ํ์ ํ๋กํผํฐ
ํ๋กํ ํ์ ํ๋กํผํฐ | ์ค๋ช |
readyState | HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ ์ ์ - UNSENT : 0 - OPENED : 1 - HEADERS_RECEIVED : 2 - LOADING : 3 - DONE : 4 |
status | HTTP ์์ฒญ์ ๋ํ ์๋ต ์ํ(*HTTP ์ํ ์ฝ๋)๋ฅผ ๋ํ๋ด๋ ์ ์ (ex. 200) |
statusText | HTTP ์์ฒญ์ ๋ํ ์๋ต ๋ฉ์์ง๋ฅผ ํ๋๋ด๋ ๋ฌธ์์ด (ex. "OK") |
responseType | HTTP ์๋ต ํ์ (ex. document, json, text, blob, arraybuffer) |
response | HTTP ์์ฒญ์ ๋ํ ์๋ต ๋ชธ์ฒด. responseType์ ๋ฐ๋ผ ํ์ ์ด ๋ค๋ฆ |
responseText | ์๋ฒ๊ฐ ์ ์กํ HTTP ์์ฒญ์ ๋ํ ์๋ต ๋ฌธ์์ด |
*HTTP ์ํ ์ฝ๋ : https://j-su2.tistory.com/17?category=1016208
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ | ์ค๋ช |
onreadystatechange | readyState ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ |
onloadstart | HTTP ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ๊ธฐ ์์ํ ๊ฒฝ์ฐ |
onprogress | HTTP ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ๋ ๋์ค ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ์ |
onabort | abort ๋ฉ์๋์ ์ํด HTTP ์์ฒญ์ด ์ค๋จ๋ ๊ฒฝ์ฐ |
onerror | HTTP ์์ฒญ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ |
onload | HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ ๊ฒฝ์ฐ |
ontimeout | HTTP ์์ฒญ ์๊ฐ์ด ์ด๊ณผํ ๊ฒฝ์ฐ |
onloadend | HTTP ์์ฒญ์ด ์๋ฃํ ๊ฒฝ์ฐ. HTTP ์์ฒญ์ด ์ฑ๊ณต/์คํจํ๋ฉด ๋ฐ์ |
๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
open | HTTP ์์ฒญ ์ด๊ธฐํ |
send | HTTP ์์ฒญ ์ ์ก |
abort | ์ด๋ฏธ ์ ์ก๋ HTTP ์์ฒญ ์ค๋จ |
setRequestHeader | ํน์ HTTP ์์ฒญ ํค๋์ ๊ฐ์ ์ค์ |
getResponseHeader | ํน์ HTTP ์์ฒญ ํค๋์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํ |
์ ์ ํ๋กํผํฐ
์ ์ ํ๋กํผํฐ | ๊ฐ | ์ค๋ช |
UNSENT | 0 | open ๋ฉ์๋ ํธ์ถ ์ด์ |
OPENED | 1 | open ๋ฉ์๋ ํธ์ถ ์ดํ |
HEADERS_RECEIVED | 2 | send ๋ฉ์๋ ํธ์ถ ์ดํ |
LOADING | 3 | ์๋ฒ ์๋ต ์ค(์๋ต ๋ฐ์ดํฐ ๋ฏธ์์ฑ ์ํ) |
DONE | 4 | ์๋ฒ ์๋ต ์๋ฃ |
HTTP ์์ฒญ ์ ์ก
HTTP ์์ฒญ์ ์ ์กํ๋ ๊ฒฝ์ฐ๋ ๋ค์ ์์๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- XMLHttpRequest.prototype.open ๋ฉ์๋๋ก HTTP ์์ฒญ์ ์ด๊ธฐํ
- ํ์์ ๋ฐ๋ผ XMLHttpRequest.prototype.setRequstHeader ๋ฉ์๋๋ก ํน์ HTTP ์์ฒญ์ ํค๋ ๊ฐ์ ์ค์
- XMLHttpRequest.prototype.send ๋ฉ์๋๋ก HTTP ์์ฒญ์ ์ ์ก
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
const xhr = new XMLHttpRequest();
// HTTP ์์ฒญ ์ด๊ธฐํ
xhr.open('GET', '/users');
// HTTP ์์ฒญ ํค๋ ์ค์
// ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์ ์กํ ๋ฐ์ดํฐ์ MIME ํ์
์ง์ : json
xhr.setRequestHeader('content-type', 'application/json');
// HTTP ์์ฒญ ์ ์ก
xhr.send();
XMLHttpRequest.prototype.open
open ๋ฉ์๋๋ ์๋ฒ์ ์ ์กํ HTTP ์์ฒญ์ ์ด๊ธฐํํฉ๋๋ค.
xhr.open(method, url[, async]);
๋งค๊ฐ๋ณ์ | ์ค๋ช |
method | HTTP ์์ฒญ ๋ฉ์๋("GET", "POST", "PUT", "DELETE" ๋ฑ) |
url | HTTP ์์ฒญ์ ์ ์กํ URL |
async | ๋น๋๊ธฐ ์์ฒญ ์ฌ๋ถ. ์ต์ ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ true์ด๋ฉฐ, ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ |
HTTP ์์ฒญ ๋ฉ์๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์์ ์์ฒญ์ ์ข ๋ฅ์ ๋ชฉ์ (๋ฆฌ์์ค์ ๋ํ ํ์)์ ์๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋์ ๊ฐ์ด ์ฃผ๋ก 5๊ฐ์ง ์์ฒญ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ CRUD๋ฅผ ๊ตฌํํฉ๋๋ค.
HTTP ์์ฒญ ๋ฉ์๋ | ์ข ๋ฅ | ๋ชฉ์ | ํ์ด๋ก๋ |
GET | index/retrieve | ๋ชจ๋ /ํน์ ๋ฆฌ์๋ ์ทจ๋ | X |
POST | create | ๋ฆฌ์์ค ์์ฑ | O |
PUT | replace | ๋ฆฌ์์ค์ ์ ์ฒด ๊ต์ฒด | O |
PATCH | modify | ๋ฆฌ์์ค์ ์ผ๋ถ ์์ | O |
DELETE | delete | ๋ชจ๋ /ํน์ ๋ฆฌ์์ค ์ญ์ | X |
XMLHttpRequest.prototype.send
send ๋ฉ์๋๋ open ๋ฉ์๋๋ก ์ด๊ธฐํ๋ HTTP ์์ฒญ์ ์๋ฒ์ ์ ์กํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ๋ก ์ ์กํ๋ ๋ฐ์ดํฐ๋ GET, POST ์์ฒญ ๋ฉ์๋์ ๋ฐ๋ผ ์ ์ก ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
GET ์์ฒญ ๋ฉ์๋
- ๋ฐ์ดํฐ๋ฅผ URL์ ์ผ๋ถ๋ถ์ธ ์ฟผ๋ฆฌ ๋ฌธ์์ด(query string)๋ก ์๋ฒ์ ์ ์ก
- ๋ฐ์ดํฐ(ํ์ด๋ก๋, payload)๋ก ์ ๋ฌํ ์ธ์๋ ๋ฌด์๋๊ณ ์์ฒญ ๋ชธ์ฒด(request body)๋ null๋ก ์ค์
POST ์์ฒญ ๋ฉ์๋
- ๋ฐ์ดํฐ(ํ์ด๋ก๋, payload)๋ฅผ ์์ฒญ ๋ชธ์ฒด(request body)์ ๋ด์ ์ ์ก
- request body์ ๋ด์ ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํ ์ ์์
- ํ์ด๋ก๋๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๋ฐ๋์ JSON.stringigy ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ฌํํ ๋ค์ ์ ๋ฌํด์ผ ํจ
xhr.send(JSON.stringify({ id: 1, content: 'HTML', completed: false }));
XMLHttpRequest.prototype.setRequstHeader
ํน์ HTTP ์์ฒญ์ ํค๋ ๊ฐ์ ์ค์ ํ๋ setRequstHeader ๋ฉ์๋๋ ๋ฐ๋์ open ๋ฉ์๋๋ฅผ ํธ์ถํ ์ดํ์ ํธ์ถํด์ผํฉ๋๋ค.
setRequstHeader ๋ฉ์๋๋ก ์ฃผ๋ก HTTP ์์ฒญ ํค๋์ธ Content-type๊ณผ Accept๋ฅผ ์ค์ ํฉ๋๋ค.
Content-type์ ์์ฒญ ๋ชธ์ฒด์ ๋ด์ ์ ์กํ ๋ฐ์ดํฐ์ MIME ํ์ ์ ์ ๋ณด๋ฅผ ํํํฉ๋๋ค.
MIME ํ์ | ์๋ธ ํ์ |
text | text/plain, text/html, text/css, text/javascipt |
application | application/json, application/x-www-form-urlencode |
multipart | multipart/formed-data |
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
const xhr = new XMLHttpRequest();
// HTTP ์์ฒญ ์ด๊ธฐํ
xhr.open('POST', '/users');
// HTTP ์์ฒญ ํค๋ ์ค์
// ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์ ์กํ ๋ฐ์ดํฐ์ MIME ํ์
์ง์ : json
xhr.setRequestHeader('content-type', 'application/json');
// HTTP ์์ฒญ ์ ์ก
xhr.send(JSON.stringify({ id: 1, content: 'HTML', completed: false }));
HTTP ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญํ ๋ ์๋ฒ๊ฐ ์๋ตํ ๋ฐ์ดํฐ์ MIME ํ์ ์ Accept๋ก ์ง์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ Accept ํค๋๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด send ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ Accept ํค๋๊ฐ */*์ผ๋ก ์ ์ก๋ฉ๋๋ค.
// ์๋ฒ๊ฐ ์๋ตํ ๋ฐ์ดํฐ์ MIME ํ์
์ง์ : json
xhr.setRequestHeader('accept', 'application/json');
HTTP ์๋ต ์ฒ๋ฆฌ
์๋ฒ๊ฐ ์ ์กํ ์๋ต์ ์ฒ๋ฆฌํ๋ ค๋ฉด XMLHttpRequest ๊ฐ์ฒด๊ฐ ๋ฐ์์ํค๋ ์ด๋ฒคํธ๋ฅผ ์บ์นํด์ผ ํฉ๋๋ค.
XMLHttpRequest ๊ฐ์ฒด์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ ์ค์์ HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ readyState ํ๋กํผํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ readystatechange ์ด๋ฒคํธ๋ฅผ ์บ์นํ์ฌ ๋ค์๊ณผ ๊ฐ์ด HTTP ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค.
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
const xhr = new XMLHttpRequest();
// HTTP ์์ฒญ ์ด๊ธฐํ
// https://jsonplaceholder.typicode.com์ Fake REST API๋ฅผ ์ ๊ณตํ๋ ์๋น์ค๋ค.
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1');
// HTTP ์์ฒญ ์ ์ก
xhr.send();
// readystatechange ์ด๋ฒคํธ๋ HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ readyState ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐ์
xhr.onreadystatechange = () => {
// readyState ํ๋กํผํฐ๋ HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
// readyState ํ๋กํผํฐ ๊ฐ์ด 4(XMLHttpRequest.DONE)๊ฐ ์๋๋ฉด ์๋ฒ ์๋ต์ด ์๋ฃ๋์ง ์ํ๋ค.
// ๋ง์ฝ ์๋ฒ ์๋ต์ด ์์ง ์๋ฃ๋์ง ์์๋ค๋ฉด ์๋ฌด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๋๋ค.
if (xhr.readyState !== XMLHttpRequest.DONE) return;
// status ํ๋กํผํฐ๋ ์๋ต ์ํ ์ฝ๋๋ฅผ ๋ํ๋ธ๋ค.
// status ํ๋กํผํฐ ๊ฐ์ด 200์ด๋ฉด ์ ์์ ์ผ๋ก ์๋ต๋ ์ํ์ด๊ณ
// status ํ๋กํผํฐ ๊ฐ์ด 200์ด ์๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ํ๋ค.
// ์ ์์ ์ผ๋ก ์๋ต๋ ์ํ๋ผ๋ฉด response ํ๋กํผํฐ์ ์๋ฒ์ ์๋ต ๊ฒฐ๊ณผ๊ฐ ๋ด๊ฒจ ์๋ค.
if (xhr.status === 200) {
console.log(JSON.parse(xhr.response));
// {userId: 1, id: 1, title: "delectus aut autem", completed: false}
} else {
console.error('Error', xhr.status, xhr.statusText);
}
};
- ์ธ์ ์๋ต์ด ํด๋ผ์ด์ธํธ์ ๋๋ฌํ ์ง๋ ์ ์ ์๊ธฐ ๋๋ฌธ์ HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ readyState ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค DONE์ธ์ง ํ์ธํ์ฌ ์๋ฒ์ ์๋ต์ด ์๋ฃ๋์๋์ง ํ์ธ
- ์๋ฒ์ ์๋ต์ด ์๋ฃ๋๋ฉด HTTP ์ํ ์ฝ๋๊ฐ 200์ธ์ง ํ์ธํ์ฌ ์ ์ ์ฒ๋ฆฌ์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌ๋ถ
- ์๋ต์ด ์ ์์ ์ผ๋ก ๋์ฐฉํ๋ค๋ฉด ์์ฒญ์ ๋ํ ์๋ต ๋ชธ์ฒด๋ฅผ ๋ํ๋ด๋ xhr.responce์์ ์๋ฒ๊ฐ ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์ทจ๋
- ๋ง์ฝ xhr.status๊ฐ 200์ด ์๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ํ์ด๋ฏ๋ก ํ์ํ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํจ
์ด๋ฌํ readystatechange ์ด๋ฒคํธ ๋์ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ load ์ด๋ฒคํธ๋ฅผ ์บ์นํด๋ ๋ฉ๋๋ค.
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
const xhr = new XMLHttpRequest();
// HTTP ์์ฒญ ์ด๊ธฐํ
// https://jsonplaceholder.typicode.com์ Fake REST API๋ฅผ ์ ๊ณตํ๋ ์๋น์ค๋ค.
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1');
// HTTP ์์ฒญ ์ ์ก
xhr.send();
// load ์ด๋ฒคํธ๋ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.
xhr.onload = () => {
// status ํ๋กํผํฐ๋ ์๋ต ์ํ ์ฝ๋๋ฅผ ๋ํ๋ธ๋ค.
// status ํ๋กํผํฐ ๊ฐ์ด 200์ด๋ฉด ์ ์์ ์ผ๋ก ์๋ต๋ ์ํ์ด๊ณ
// status ํ๋กํผํฐ ๊ฐ์ด 200์ด ์๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ์ํ๋ค.
// ์ ์์ ์ผ๋ก ์๋ต๋ ์ํ๋ผ๋ฉด response ํ๋กํผํฐ์ ์๋ฒ์ ์๋ต ๊ฒฐ๊ณผ๊ฐ ๋ด๊ฒจ ์๋ค.
if (xhr.status === 200) {
console.log(JSON.parse(xhr.response));
// {userId: 1, id: 1, title: "delectus aut autem", completed: false}
} else {
console.error('Error', xhr.status, xhr.statusText);
}
};
[์ถ์ฒ] ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'JavaScript > ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Dive' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ํ๋ก๋ฏธ์ค(Promise) (0) | 2022.08.17 |
---|---|
[JavaScript] REST API (0) | 2022.08.16 |
[JavaScript] ํ์ด๋จธ (0) | 2022.08.13 |
[JavaScript] ์ด๋ฒคํธ (0) | 2022.08.13 |
[JavaScript] DOM (0) | 2022.08.12 |
- Total
- Today
- Yesterday
- ํ๋กํผํฐ
- ์ด์์ฒด์
- TDD
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
- 2019 ์นด์นด์ค ๊ฐ๋ฐ์ ๊ฒจ์ธ ์ธํด
- ํ๋กํ ์ฝ
- ๋์์ธ ํจํด
- ์ฝ๋ฉํ ์คํธ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- map
- ๋ฐฑ์ค javascript
- ์๋ฐ
- ๋ ์์ปฌ ํ๊ฒฝ
- ์นด์นด์ค ์ธํด
- ๋ฐฑ์ค
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ ์ญ ๋ณ์
- ๋คํธ์ํฌ
- Baekjoon
- ๋ฐฑ์ค node.js
- fp
- git
- ํฌํฌ์ธํฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ deep dive
- JavaScript
- ์ด๋ถํ์
- http
- ์๊ณ ๋ฆฌ์ฆ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |