๋ธ๋ผ์ฐ์ ์์ ํผ์ ์ฑ์ฐ๊ณ ์ด๋ฅผ ์น ์๋ฒ๋ก ์ ์ถ(submit)ํ๋ฉด ์น ์๋ฒ๋ ์์ฒญ๋ ๋ด์ฉ์ ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ์๋ก์ด ์นํ์ด์ง๋ฅผ ์์ฑํ๊ณ ์๋ต์ผ๋ก ๋๋๋ ค์ค๋ค.
์ ์ฒด ํ์ด์ง๋ฅผ reload
ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถํ๊ฐ ์ปค์ง๊ณ , ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฐ๋ค.์์ฒญ์ ๋ณด๋ธ ํ ์๋ต๊ณผ๋ ์๊ด์์ด ๋์ํ๋ ๋ฐฉ์์ด๋ค.
๋น ๋ฅด๊ฒ ๋์ํ๋ ๋์ ์ธ ์น ํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฐ๋ฐ ๊ธฐ๋ฒ์ ํ๋
ํ์ด์ง ์ ์ฒด๋ฅผ reloadํ์ง ์๊ณ ์ ์ํ๋๋ ๋น๋๊ธฐ์ฑ
์ฆ, ์ฌ์ฉ์์ event๊ฐ ์์ผ๋ฉด ์ ์ฒด ํ์ด์ง๊ฐ ์๋ ์ผ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ
์๋ฒ์์ ํต์ ์ ์ํด XMLHttpRequest ๊ฐ์ฒด ์ฌ์ฉ
JSON, XML, HTML ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ํ ์คํธ ํ์ ๋ฑ์ ํฌํจํ ๋ค์ํ ํฌ๋งท์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค
AJAX๋ฅผ ์ด์ฉํ ์น ์์ฉ ํ๋ก๊ทธ๋จ์
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํตํด ์น ์๋ฒ์ ํต์
์ ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์,์ฌ์ฉ์์ ๋์์๋ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ง์ํด์ ์๋ฒ์ ํต์ ์ด ๊ฐ๋ฅ
ํ๋ค.
๊ณ์ํด์ ์๋ฒ์ ํต์ ํ ์ ์๋๋ก
๋์์ฃผ๋ ์ญํ <html>
<head> </head>
<body>
<button id="ajaxButton" type="button">XHR Test</button>
<h3 id="testText"></h3>
<script>
(function () {
let httpRequest;
document
.getElementById("ajaxButton")
.addEventListener("click", makeRequest);
function makeRequest() {
// XMLHttpRequest ๊ฐ์ฒด ์์ฑ
// readyState : 0
httpRequest = new XMLHttpRequest();
if (!httpRequest) {
alert("XMLHttp ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ด์");
return false;
}
// onreadystatechange ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์ ์ ์ธ
httpRequest.onreadystatechange = alertContents;
// open ํจ์๋ฅผ ํตํด ์์ฒญํ method, url ๋ฑ์ ๋ค์ํ ์ค์
// readyState : 1
httpRequest.open("GET", "test.html");
// send ํจ์๋ฅผ ํตํด ์ ์กํ ๋ฐ์ดํฐ์ ํจ๊ป ์์ฒญ (POST)
// readyState : 2 -> 3 -> 4
httpRequest.send();
}
function alertContents() {
// XHR ๊ฐ์ฒด์ ์ํ ํ์ธ
if (httpRequest.readyState === httpRequest.DONE) {
// ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์๋ต์ธ์ง ๊ฒ์ฌ
if (httpRequest.status === 200) {
document.getElementById("testText").innerHTML =
httpRequest.responseText;
} else {
alert(`${httpRequest.status}์๋ฌ request์ ๋ฌธ์ ๊ฐ ์์ด์`);
}
}
}
})();
</script>
</body>
</html>
๊ฐ์ฒด์ ์ํ ๋ฐํ
open(~)
๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ ์ํreadyState์ ๊ดํ ์ ๋ณด
์์ฒญ์ด ์๋ฃ๋ ํ, http ์ํ ์ฝ๋๋ฅผ ๋ฐํ
HTTP ์ํ ์ฝ๋
XHR์ addEventListener์ ๋น์ทํ๊ฒ
Event ๊ธฐ๋ฐ์ผ๋ก ๋์
ํ๋ค.
์๋ต์ ๋ฐ์ ๋State(์ํ๊ฐ)
์ ๋ฐ๊พธ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํค๊ณ ,
์ด๋ฅผonreadystatechange
๋ฅผ ํตํด ๊ฐ์งํ๋ค.
ES6์์ XHR๋ณด๋ค ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์กฐ์์ด ๊ฐ๋ฅํ Fetch API๊ฐ ๋ฑ์ฅํ๋ค.
XMLHttpRequest์ ๋์ฒดํ๋ฉฐ ๋น๋๊ธฐ http ์์ฒญ์ ์ข ๋ ์ฐ๊ธฐ ํธํ๊ฒ ํด์ฃผ๋ API
fetch() ํจ์๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก URL
, ๋๋ฒ์งธ ์ธ์๋ก ์ต์
๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ค.
๋ํดํธ๋ก GET ๋ฐฉ์์ผ๋ก ๋์, ์ต์ ์ธ์ ๋ถํ์
POST ๋ฐฉ์ ์ด์ฉ ์ headers, body ๋ฑ์ ์ต์ ํ์
Promise ๊ธฐ๋ฐ์ผ๋ก ๋์
ํ๋ฉฐ fetch์ ๊ธฐ๋ณธ ์๋ต ๊ฒฐ๊ณผ๋ Reponse ๊ฐ์ฒด
์ด๋ค.
Response ๊ฐ์ฒด๋ฅผ ์ป์ ๋ค์ ์๋ต์ json์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ text๋ก ๋ฐ๊พธ๋ ๋ฑ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
HTTP error๊ฐ ๋ฐ์ํ๋๋ผ๋ reject ๋์ง ์๊ธฐ ๋๋ฌธ์ response์ status code๋ ok ์ฒดํฌ ํ์
<html>
<head> </head>
<body>
<button id="fetchButton" type="button" onclick="fetchPage('test.html')">
Fetch Test
</button>
<h3 id="testText"></h3>
<script>
function fetchPage(fileName) {
fetch(fileName)
// fetch์ ๊ธฐ๋ณธ ์๋ต ๊ฒฐ๊ณผ๋ response ๊ฐ์ฒด
.then((response) => {
// response.ok๋ status๊ฐ 200~299์ฌ์ด์ธ ๊ฒฝ์ฐ true
if (response.ok) {
// ์๋ต์ text ํํ๋ก ๋ฐํ
return response.text();
}
throw new Error(`${response.status} ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ์ด์!`);
})
.then((text) => {
document.getElementById("testText").innerHTML = text;
})
.catch((e) => {
alert(e);
});
}
</script>
</body>
</html>
- Fetch API๋ Promise ๊ธฐ๋ฐ์ผ๋ก async, await์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ
์ง๊ด์ ์ด๊ณ ๊ฐ๋ ์ฑ์ด ์ข๋ค
- ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ import ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
- ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ Fetch Polyfill ์ง์
https://velog.io/@shinychan95/42
https://kangaroo-dev.tistory.com/8
https://milkye.tistory.com/266
https://velog.io/@ldaehi0205/ajax-fetch-xhr-๋น๋๊ธฐํต์ -์ดํดํ๊ธฐ https://developer.mozilla.org/ko/docs/Web/Guide/AJAX/GettingStarted#1.eb.8b.a8.ea.b3.84.e2.80.93say.22please.21.22_or_how_to_make_an_http_request
https://deeplify.dev/front-end/js/xml-http-requesthttp://tcpschool.com/ajax/ajax_intro_works https://developer.mozilla.org/ko/docs/Web/Guide/AJAX/Getting_Started