43์ฅ Ajax
43.1 Ajax๋?
Ajax(Asynchronous JavaScript and Xml)
์ด๋
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ์๋ฒ๊ฐ ์๋ตํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ฌ ์น ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ๊ฐฑ์ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ด๋ค.
Ajax๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ WEB API์ธ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. XMLHttpRequest๋ HTTP ๋น๋๊ธฐ ํต์ ์ ์ํ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ์ ๊ณตํ๋ค.
๋ณ๊ฒฝ์ด ํ์ํ ๋ถ๋ถ๋ง ํ์ ์ ์ผ๋ก ๋ ๋๋ง ํ๋ ๋ฐฉ์์ด ๊ฐ๋ฅํด์ก๋ค.


์ ํต์ ๋ฐฉ์๊ณผ ๋น๊ตํ์ ๋์ 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 ์์ฒญ์ ์ ์กํ๋ ๊ฒฝ์ฐ ๋ค์ ์์๋ฅผ ๋ฐ๋ฅธ๋ค.
XMLHttpRequestp.prototype.setRequestHeader ๋ฉ์๋๋ก ํน์ HTTP ์์ฒญ์ ํค๋ ๊ฐ์ ์ค์ ํ๋ค.
ํ์์ ๋ฐ๋ผ์ XMLHttpRequest.prototype.setRequestHeader ๋ฉ์๋๋ก ํน์ HTTP ์์ฒญ์ ํค๋ ๊ฐ์ ์ค์ ํ๋ค
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๋ฅผ ๊ตฌํํ๋ค.
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