๐ XMLHttpRequest ์ผ๋ก AJAX ์์ฒญํ๊ธฐ
AJAX (Asynchronous Javascript And XML)
Ajax๋ ์น ํ์ด์ง ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ฉํ์ง ์๊ณ ๋, ์น ํ์ด์ง์ ์ผ๋ถ๋ถ๋ง์ ๊ฐฑ์ ํ ์ ์๊ฒ ํด์ค๋ค. Ajax๋ฅผ ์ด์ฉํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ญ์์ ์๋ฒ์ ํต์ ํ์ฌ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์น ํ์ด์ง์ ์ผ๋ถ๋ถ์๋ง ํ์ํ ์ ์๋ค.
ajax๋ฅผ ํตํ ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ๊ฐ์ ํต์ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฌ์ฉ์์ ์ํ ์์ฒญ ์ด๋ฒคํธ๊ฐ ๋ฐ์
- ์์ฒญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํธ์ถ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ฒญ์ ์ฒ๋ฆฌ
- ์๋ฒ๋ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ HTML, XML ๋๋ JSON ํํ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์์ฑ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ
- ์ด๋ ์ ๋ฌ๋๋ ์๋ต์ ์๋ก์ด ํ์ด์ง๋ฅผ ์ ๋ถ ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ ํ์ํ ๋ฐ์ดํฐ๋ง์ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์น ํ์ด์ง์ ์ผ๋ถ๋ถ๋ง์ ๊ฐฑ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถ. ๊ฒฐ๊ณผ์ ์ผ๋ก ์น ํ์ด์ง์ ์ผ๋ถ๋ถ๋ง์ด ๋ค์ ๋ก๋ฉ๋์ด ํ์๋๋ค.
XMLHttpRequest ๊ฐ์ฒด
XMLHttpRequest ๊ฐ์ฒด๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ๋ ์ฌ์ฉ๋๋ค. ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ํด์ ์๋ฒ์ ํต์ ํ ์ ์๋ ๊ฒ์ ๋ฐ๋ก ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
// 1. XMLHttpRequest๊ฐ์ฒด ์์ฑ
var httpRequest = new XMLHttpRequest();
// 2. onreadystatechange ๋ฑ๋ก
httpRequest.onreadystatechange = function() {
// XMLXttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ์ ์๋ฒ ์์ ๋ฌธ์ ์กด์ฌ ์ ๋ฌด๋ฅผ ํ์ธ
if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
console.log(httpRequest.responseText); // ์๋ฒ์ ์์ฒญํ์ฌ ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํ
}
};
// 3. GET ๋ฐฉ์์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๋ฌํจ
httpRequest.open("GET", "์๋ฒURL", true);
httpRequest.send();
XMLHttpRequest ์์ฒญ ๋ณด๋ด๊ธฐ
XMLHttpRequest ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. XMLHttpRequest ๊ฐ์ฒด ์์ฑ
var httpRequest = new XMLHttpRequest();
2. onreadystatechange ๋ฑ๋ก
onreadystatechange๋ก ์๋ฒ๋ก ๋ถํฐ ์๋ต์ด ์ค๊ฒ ๋์ด XMLHttpRequest ๊ฐ์ฒด์ ๊ฐ์ด ๋ณํ๊ฒ ๋๋ฉด ์ด๋ฅผ ๊ฐ์งํด ์๋์ผ๋ก ํธ์ถ๋๋ ํจ์๋ฅผ ์ค์ ํ๋ค. ํจ์๋ฅผ ๋ฑ๋กํ๊ฒ ๋๋ฉด ์๋ฒ์ ์์ฒญํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๊ณ , ์๋ฒ๋ก๋ถํฐ ์๋ต์ด ๋์ฐฉํ๋ ์๊ฐ์ ํน์ ํ ์ ์๊ฒ ๋๋ค.
// 2. onreadystatechange ๋ฑ๋ก
httpRequest.onreadystatechange = function() {
};
3. ์๋ฒ๋ก ๋ณด๋ผ Ajax ์์ฒญ์ ํ์์ ์ค์
httpRequest.open(์ ๋ฌ๋ฐฉ์, URL์ฃผ์, ๋๊ธฐ์ฌ๋ถ) ๋ฉ์๋๋ฅผ ๋ฑ๋กํ๋ค.
- ์ ๋ฌ ๋ฐฉ์์ ์์ฒญ์ ์ ๋ฌํ ๋ฐฉ์์ผ๋ก GET ๋ฐฉ์๊ณผ POST ๋ฐฉ์ ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋ค.
- URL ์ฃผ์๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์๋ฒ์ ํ์ผ ์ฃผ์๋ฅผ ์ ๋ฌํ๋ค.
- ๋๊ธฐ ์ฌ๋ถ๋ ์์ฒญ์ ๋๊ธฐ์์ผ๋ก ์ ๋ฌํ ์ง ๋น๋๊ธฐ์์ผ๋ก ์ ๋ฌํ ์ง๋ฅผ ์ ๋ฌํ๋ค. (true : ๋น๋๊ธฐ / false : ๋๊ธฐ)
httpRequest.open("GET", "์๋ฒURL", true);
4. ์์ฑ๋ Ajax ์์ฒญ์ ์๋ฒ๋ก ์ ๋ฌ
httpRequest.send() ๋ฉ์๋๋ฅผ ํตํด ์๋ฒ๋ก ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค. ์ด๋ send() ๋ฉ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๋ ์์ฐ๋์ ๋ฐ๋ผ GET / POST ๋ฐฉ์์ผ๋ก ๋ค๋ฅด๊ฒ ๋ณด๋ด๊ฒ ๋๋ค.
send()- GET ๋ฐฉ์send(๋ฌธ์์ด)- POST ๋ฐฉ์
httpRequest.send();
POST ๋ฐฉ์ ์๋ฒ ์์ฒญ
Ajax์์๋ ์๋ฒ์ POST ๋ฐฉ์์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ ํ๋ค. ์ด๋ ์๋ฒ๋ก ์ ์กํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ HTTP ํค๋์ ํฌํจ๋์ด ์ ์ก๋๋ค. ๋ฐ๋ผ์ setRequestHeader() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋จผ์ ํค๋๋ฅผ ์์ฑํ ํ์, send() ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฉด ๋๋ค.
var httpRequest = new XMLHttpRequest(); // ๊ฐ์ฒด ์์ฑ
httpRequest.onreadystatechange = function() {
if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
console.log(httpRequest.responseText);
}
};
// POST ๋ฐฉ์์ ์์ฒญ์ ๋ฐ์ดํฐ๋ฅผ Http ํค๋์ ํฌํจ์์ผ ์ ์กํจ.
httpRequest.open("POST", "/examples/media/request_ajax.php", true);
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // ๋ณด๋ผ ๋ฐ์ดํฐ ํค๋๋ฅผ ์ง์
httpRequest.send("city=Seoul&zipcode=06141"); // ๋ณด๋ผ ๋ฐ์ดํฐ ์ง์
XMLHttpRequest ์๋ต ๋ฐ๊ธฐ
readyState ํ๋กํผํฐ
Ajax์์ ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉํ๋ XMLHttpRequest ๊ฐ์ฒด์ readyState ํ๋กํผํฐ๋ XMLHttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ธ๋ค. ์ด ํ๋กํผํฐ์ ๊ฐ์ ๊ฐ์ฒด์ ํ์ฌ ์ํ์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ ์ฃผ๊ธฐ๋ก ์์๋๋ก ๋ณํํ๋ค.
- UNSENT (์ซ์ 0) : XMLHttpRequest ๊ฐ์ฒด๊ฐ ์์ฑ๋จ.
- OPENED (์ซ์ 1) : open() ๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋จ.
- HEADERS_RECEIVED (์ซ์ 2) : ๋ชจ๋ ์์ฒญ์ ๋ํ ์๋ต์ด ๋์ฐฉํจ.
- LOADING (์ซ์ 3) : ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ ์ค์.
- DONE (์ซ์ 4) : ์์ฒญํ ๋ฐ์ดํฐ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ด ์๋ตํ ์ค๋น๊ฐ ์๋ฃ๋จ.
var httpRequest = new XMLHttpRequest();
var currentState = "";
httpRequest.onreadystatechange = function () {
switch (httpRequest.readyState) {
case XMLHttpRequest.UNSET:
currentState += "XMLHttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ UNSET ์
๋๋ค.<br>";
break;
case XMLHttpRequest.OPENED:
currentState += "XMLHttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ OPENED ์
๋๋ค.<br>";
break;
case XMLHttpRequest.HEADERS_RECEIVED:
currentState += "XMLHttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ HEADERS_RECEIVED ์
๋๋ค.<br>";
break;
case XMLHttpRequest.LOADING:
currentState += "XMLHttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ LOADING ์
๋๋ค.<br>";
break;
case XMLHttpRequest.DONE:
currentState += "XMLHttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ๋ DONE ์
๋๋ค.<br>";
break;
}
console.log(currentState);
if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200) {
console.log(httpRequest.responseText);
}
};
httpRequest.open("GET", "/examples/media/ajax_intro_data.txt", true);
httpRequest.send();
status ํ๋กํผํฐ
status ํ๋กํผํฐ๋ ์๋ฒ์ ๋ฌธ์ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
- 200 : ์๋ฒ์ ๋ฌธ์๊ฐ ์กด์ฌํจ.
- 404 : ์๋ฒ์ ๋ฌธ์๊ฐ ์กด์ฌํ์ง ์์.
์๋ต ๋ฐ์ดํฐ ํ๋กํผํฐ
์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ์ ๋ฐ์ดํฐ๋ ์๋ ํ๋กํผํฐ์ ๋ค์ด ์๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ์์ ์ ์ ํ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
- responseText ํ๋กํผํฐ : ์๋ฒ์ ์์ฒญํ์ฌ ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํ
- responseXML ํ๋กํผํฐ : ์๋ฒ์ ์์ฒญํ์ฌ ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ XML DOM ๊ฐ์ฒด๋ก ๋ฐํ
httpRequest.onreadystatechange = function() {
// XMLXttpRequest ๊ฐ์ฒด์ ํ์ฌ ์ํ์ ์๋ฒ ์์ ๋ฌธ์ ์กด์ฌ ์ ๋ฌด๋ฅผ ํ์ธ
if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
console.log(httpRequest.responseText); // ์๋ฒ์ ์์ฒญํ์ฌ ์๋ต์ผ๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํ
}
};
# ์ฐธ๊ณ ์๋ฃ
http://tcpschool.com/ajax/ajax_intro_works