Ajax
Ajax๋?
- Ajax๋
Asynchronous JavaScript And Xml
- ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ์๋ฒ๊ฐ ์๋ตํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ฌ ์นํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ๊ฐฑ์ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
- ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ธ
XMLHttpRequest
๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ - ์ด์ ์ ์นํ์ด์ง๋
HTML
์ ์๋ฒ๋ก๋ถํฐ ์ ์ก ๋ฐ์ ์นํ์ด์ง ์ ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ๋ ๋๋ง ํ๋ ๋ฐฉ์์ผ๋ก ๋์ ํจ
์ ํต์ ์ธ ๋ฐฉ์์ ๋จ์
- ์ด์ ์นํ์ด์ง์ ์ฐจ์ด๊ฐ ์์ด ๋ณ๊ฒฝํ ํ์ ์๋ ๋ถ๋ถ๊น์ง ํฌํจํ ์์ ํ HTML์ ์๋ฒ๋ก ๋ถํฐ ๋งค๋ฒ ๋ค์ ์ ์ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฐ์ดํฐ ํต์ ์ด ๋ฐ์
- ํ๋ฉด ์ ํ์ด ์ผ์ด๋๋ฉด์ ์๊ฐ์ ์ผ๋ก ๊น๋นก์ด๋ ํ์ ๋ฐ์
- ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ํต์ ์ด ๋๊ธฐ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ก ๋ถํฐ ์๋ต์ด ์์ ๋๊น์ง ๋ค์ ์ฒ๋ฆฌ๋ ๋ธ๋กํน ๋๋ค.
- ์ฆ, Ajax๋ฅผ ์ฌ์ฉํด ์๋ฒ๋ก ๋ถํฐ ์นํ์ด์ง์ ๋ณ๊ฒฝ์ ํ์ํ ๋ฐ์ดํฐ๋ง ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ ์ก ๋ฐ์ ํ์ํ ๋ถ๋ถ๋ง ํ์ ์ ์ผ๋ก ๋ ๋๋ง ํ๋ ๋ฐฉ์์ ์ฌ์ฉ
Ajax ๋ฐฉ์์ ์ฅ์
- ๋ณ๊ฒฝํ ๋ถ๋ถ์ ๊ฐฑ์ ํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ฒ๋ก ๋ถํฐ ์ ์ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฐ์ดํฐ ํต์ ์ด ๋ฐ์ํ์ง ์๋๋ค.
- ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ ๋ถ๋ถ์ ๋ค์ ๋ ๋๋ง ํ์ง ์๋๋ค. (ํ๋ฉด์ด ๊น๋นก์ด๋ ํ์ ๋ฐ์ํ์ง ์์)
- ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ํต์ ์ด ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ธ ํ ๋ธ๋กํน ๋ฐ์ํ์ง ์์
JSON
- JSON(
JavaScript Object Notation
)์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ HTTP ํต์ ์ ์ํ ํ ์คํธ ๋ฐ์ดํฐ ํฌ๋งท
JSON ํ๊ธฐ ๋ฐฉ์
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ์ ์ฌํ๊ฒ ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ์์ํ ํ ์คํธ์ด๋ค.
{
"name": "Lee",
"age": 20,
"alive": true,
"hobby": ["traveling", "tennis"]
}
- JSON์ ํค๋ ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํ๋ค.
- ๊ฐ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ๊ฐ์ ํ๊ธฐ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ฐ.
- ๋จ, ๋ฌธ์์ด์ ๋ฐ๋์ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํ๋ค.
JSON.stringify
JSON.stringify
๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํ- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๊ฐ์ฒด๋ฅผ ์ ์กํ๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ดํ ํด์ผํ๋๋ฐ ์ด๋ฅผ ์ง๋ ฌํ(
serializing
)๋ผ๊ณ ํ๋ค. JSON.stringify
๋ฉ์๋๋ ๊ฐ์ฒด๋ฟ๋ง ์๋๋ผ ๋ฐฐ์ด๋ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํ
JSON.parse
JSON.parse
๋ฉ์๋๋ JSON ํฌ๋งท์ ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ณํ- ์๋ฒ๋ก ๋ถํฐ ๋ฐ์์จ JSON ๋ฐ์ดํฐ๋ ๋ฌธ์์ด
- ์ด ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ์ฒดํ ํ๋ ๊ฒ์ ์ญ์ง๋ ฌํ(
deserializing
) ์ด๋ผ๊ณ ํ๋ค. - ๋ฐฐ์ด ๋ณํ๋ JSON ํฌ๋งท์ ๊ฒฝ์ฐ, ๋ฐฐ์ด ๊ฐ์ฒด๋ก ๋ณํํ๋ฉฐ, ๋ฐฐ์ด์ ์์๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ์์ ๊ฐ์ง ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
XMLHttpRequest
- ๋ธ๋ผ์ฐ์ ๋ ์ฃผ์์ฐฝ์ด๋
form
ํ๊ทธ ๋๋a
ํ๊ทธ๋ฅผ ํตํด HTTP์์ฒญ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. - ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ์ ์ ์กํ๋ ค๋ฉด
XMLHttpRequest
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. XMLHttpRequest
๊ฐ์ฒด๋ ์์ฑ์ ํจ์๋ฅผ ํตํด ์์ฑํ๊ณ , ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ด๋ฏ๋ก ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ๋์ ํฉ๋๋ค.
const xhr = new XMLHttpRequest();
XMLHttpRequest ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๋ฉ์๋
XMLHttpRequest
๋ ๋ค์ํ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.์ค์ ํ๋กํผํฐ์ ๋ฉ์๋๋ง ์ ๋ฆฌ
ํ๋กํ ํ์ ํ๋กํผํฐ
- readyState : HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ ์ ์
- status : HTTP ์์ฒญ์ ๋ํ ์๋ต ์ํ๋ฅผ ๋ํ๋ด๋ ์ ์
- statusText : HTTP ์์ฒญ์ ๋ํ ์๋ต ๋ฉ์์ง๋ฅผ ๋ํ๋ด๋ ๋ฌธ์์ด
- responseType : HTTP ์๋ต ํ์
(
document
,json
,blob
,arraybuffer
...) - response : HTTP ์์ฒญ์ ๋ํ ์๋ต ๋ชธ์ฒด
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ
- onreadystatechange : readyState ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
- onerror : HTTP ์์ฒญ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ
- onload : HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ
๋ฉ์๋
- open : HTTP ์์ฒญ ์ด๊ธฐํ
- send : HTTP ์์ฒญ ์ ์ก
- abort : ์ด๋ฏธ ์ ์ก๋ HTTP ์์ฒญ ์ค๋จ
- setRequestHeader : ํน์ HTTP ์์ฒญ ํค๋์ ๊ฐ์ ์ค์
HTTP ์์ฒญ ์ ์ก
- ๋ค์ ์์๋ฅผ ๋ฐ๋ฆ
XMLHttpRequest.prototype.open
๋ฉ์๋๋กHTTP
์์ฒญ์ ์ด๊ธฐํ- ํ์์ ๋ฐ๋ผ
XMLHttpRequest.prototype.setRequestHeader
๋ฉ์๋๋ก ํน์ HTTP
์์ฒญ์ ํค๋ ๊ฐ์ ์ค์ XMLHttpRequest.prototype.send
๋ฉ์๋๋กHTTP
์์ฒญ ์ ์ก
const xhr = new XMLHttpRequest();
xhr.open('GET', '/user');
xhr.setRequestHeader('content-type', 'application/json');
xhr.send();
open ๋ฉ์๋
- open ๋ฉ์๋๋ ์๋ฒ์ ์ ์กํ HTTP์์ฒญ์ ์ด๊ธฐํ ํฉ๋๋ค.
xhr.open(method, url[, async])
- method : HTTP ์์ฒญ ๋ฉ์๋(
GET
,POST
,PUT
,DELETE
... ) - url : ์์ฒญ์ ์ ์กํ URL
- async : ๋น๋๊ธฐ ์์ฒญ ์ฌ๋ถ, ์ต์ ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ true
send ๋ฉ์๋
open์ผ๋ก ์ด๊ธฐํ๋ ์์ฒญ์ ์๋ฒ์ ์ ์ก
GET ์์ฒญ ๋ฉ์๋์ ๊ฒฝ์ฐ URL์ ์ผ๋ถ๋ถ์ธ ์ฟผ๋ฆฌ ๋ฌธ์์ด(
query string
)์ผ๋ก ์๋ฒ์ ์ ์ก
POST ์์ฒญ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ๋ชธ์ฒด(request body
)์ ๋ด์ ์ ์กsend ๋ฉ์๋๋ ์์ฒญ ๋ชธ์ฒด์ ๋ด์ ์ ์กํ ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํ ์ ์๋ค.
์ด๋ ,
JSON.stringify
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ง๋ ฌํ ํ ๋ค์ ์ ์ก
setRequestHeader
- HTTP ์์ฒญ์ ํค๋ ๊ฐ์ ์ค์
์๋ต ์ฒ๋ฆฌ
- ์๋ฒ์์ ๋ฐ์์จ ์๋ต์ ์ฒ๋ฆฌํ๋ ค๋ฉด
XMLHttpRequest
๊ฐ์ฒด๊ฐ ๋ฐ์ ์ํค๋ ์ด๋ฒคํธ๋ฅผ ์บ์น ํด์ผํ๋ค. - ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด
readyState
๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ด๋ฒคํธ๋ฅผ ์บ์น ํ ์ ์๋ค.
const xhr = new XMLHttpRequest();
// HTTP ์์ฒญ ์ด๊ธฐํ
// https://jsonplaceholder.typicode.com์ Fake REST API๋ฅผ ์ ๊ณตํ๋ ์๋น์ค๋ค.
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1');
xhr.send();
// HTTP ์์ฒญ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ readyState ํ๋กํผํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ด๋ฒคํธ ๋ฐ์
xhr.onreadystatechange = () => {
// ๋ง์ฝ ์๋ฒ ์๋ต์ด ์์ง ์๋ฃ๋์ง ์์๋ค๋ฉด ์๋ฌด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๋๋ค.
if (xhr.readyState !== XMLHttpRequest.DONE) return;
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);
}
};
readystatechange
๋์load
์ด๋ฒคํธ๋ฅผ ์บ์น ํด๋ ๋๋ค.load
์ด๋ฒคํธ๋ ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ ๋ฐ์
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1');
xhr.send();
// load ์ด๋ฒคํธ๋ HTTP ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.
xhr.onload = () => {
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);
}
};
'javascript > ๐ study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[10์ฃผ์ฐจ ์คํฐ๋]45์ฅ-ํ๋ก๋ฏธ์ค (0) | 2022.04.02 |
---|---|
[10์ฃผ์ฐจ ์คํฐ๋]44์ฅ-REST API (0) | 2022.04.02 |
[์คํฐ๋ 10์ฃผ์ฐจ]42์ฅ- ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.04.02 |
[9์ฃผ์ฐจ ์คํฐ๋]41์ฅ-ํ์ด๋จธ (0) | 2022.03.27 |
[9์ฃผ์ฐจ ์คํฐ๋]40์ฅ-์ด๋ฒคํธ (0) | 2022.03.27 |
๋๊ธ