Ajax(Asynchronus JavaScript and XML)λ μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ κ° μλ²μκ² λΉλκΈ° λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μμ²νκ³ μλ²κ° μλ΅ν λ°μ΄ν°λ₯Ό μμ νμ¬ μΉνμ΄μ§λ₯Ό λμ μΌλ‘ κ°±μ νλ νλ‘κ·Έλλ° λ°©μμ λ§νλ€. Ajaxλ λΈλΌμ°μ μμ μ 곡νλ Web APIμΈ XMLHttpRequest
κ°μ²΄λ₯Ό κΈ°λ°μΌλ‘ λμνλ€.
Ajax μ΄μ μ μΉνμ΄μ§λ html νκ·Έλ‘ μμν΄μ html νκ·Έλ‘ λλλ μμ ν HTMLμ μλ²λ‘λΆν° μ μ‘λ°μ μΉνμ΄μ§ μ 체λ₯Ό μ²μλΆν° λ€μ λ λλ§νλ λ°©μμΌλ‘ λμνλ€. νλ©΄μ΄ μ νλλ©΄ μλ²λ‘λΆν° μλ‘μ΄ HTMLμ μ μ‘λ°μ μΉνμ΄μ§ μ 체λ₯Ό μ²μλΆν° λ€μ λ λλ§νλ€.
μ΄λ¬ν μ ν΅μ μΈ λ°©μμ λ€μκ³Ό κ°μ λ¨μ μ΄ μλ€.
JSON(JavaScript Object Notation)μ ν΄λΌμ΄μΈνΈμ μλ² κ°μ HTTP ν΅μ μ μν ν μ€νΈ λ°μ΄ν° ν¬λ§·μ΄λ€. μλ°μ€ν¬λ¦½νΈμ μ’ μλμ§ μλ μΈμ΄ λ 립ν λ°μ΄ν° ν¬λ§·μΌλ‘, λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©ν μ μλ€. JSONμ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ 리ν°λ΄κ³Ό μ μ¬νκ² ν€μ κ°μΌλ‘ ꡬμ±λ μμν ν μ€νΈλ€.
ν΄λΌμ΄μΈνΈκ° μλ²λ‘ κ°μ²΄λ₯Ό μ μ‘νλ €λ©΄ κ°μ²΄λ₯Ό λ¬Έμμ΄νν΄μΌ νλλ° μ΄λ₯Ό μ§λ ¬ν(serializing)μ΄λΌνλ€. JSON.stringify λ©μλλ κ°μ΄λ κ°μ²΄λ₯Ό JSON ν¬λ§·μ λ¬Έμμ΄λ‘ λ³ννλ€.
console.log(JSON.stringify({ x: 5, y: 6 }));
// expected output: "{"x":5,"y":6}"
console.log(JSON.stringify([new Number(3), new String('false'), new Boolean(false)]));
// expected output: "[3,"false",false]"
console.log(JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] }));
// expected output: "{"x":[10,null,null,null]}"
console.log(JSON.stringify(new Date(2006, 0, 2, 15, 4, 5)));
// expected output: ""2006-01-02T15:04:05.000Z""
μλ²λ‘λΆν° ν΄λΌμ΄μΈνΈμκ² μ μ‘λ JSON λ°μ΄ν°λ λ¬Έμμ΄μ΄λ€. μ΄ λ¬Έμμ΄μ κ°μ²΄λ‘μ μ¬μ©νλ €λ©΄ JSON ν¬λ§·μ κ°μ²΄νν΄μΌ νλλ° μ΄λ₯Ό μμ§λ ¬ν(deserializing)λΌ νλ€. JSON.parse λ©μλλ JSON ν¬λ§·μ λ¬Έμμ΄μ κ°μ²΄λ‘ λ³ννλ€.
const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);
console.log(obj.count);
// expected output: 42
console.log(obj.result);
// expected output: true
λΈλΌμ°μ λ μ£Όμμ°½μ΄λ HTMLμ form
νκ·Έ λλ a
νκ·Έλ₯Ό ν΅ν΄ HTTP μμ² μ μ‘ κΈ°λ₯μ κΈ°λ³Έ μ 곡νλ€. μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ μ μ‘νλ €λ©΄ XMLHttpRequest
κ°μ²΄λ₯Ό μ¬μ©νλ€.
XMLHttpRequest
κ°μ²΄λ XMLHttpRequest
μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μμ±νλ€. XMLHttpRequest
κ°μ²΄λ λΈλΌμ°μ μμ μ 곡νλ Web APIμ΄λ―λ‘ λΈλΌμ°μ νκ²½μμλ§ μ μμ μΌλ‘ μ€νλλ€.
const xhr = new XMLHttpRequest();
HTTP μμ²μ μ μ‘νλ κ²½μ° λ€μ μμλ₯Ό λ°λ₯Έλ€.
XMLHttpRequest.prototype.open
λ©μλλ‘ HTTP μμ²μ μ΄κΈ°ννλ€.XMLHttpRequest.prototype.setRequestHeader
λ©μλλ‘ νΉμ HTTP μμ²μ ν€λ κ°μ μ€μ νλ€.XMLHttpRequest.prototype.send
λ©μλλ‘ HTTP μμ²μ μ μ‘νλ€.// XMLHttpRequest κ°μ²΄ μμ±
const xhr = new XMLHttpRequest();
// HTTP μμ² μ΄κΈ°ν
xhr.open('GET', '/user');
// HTTP μμ² ν€λ μ€μ
// ν΄λΌμ΄μΈνΈκ° μλ²λ‘ μ μ‘ν λ°μ΄ν°μ MIME νμ
μ§μ :: json
xhr.setRequestHeader('content-type', 'application/json');
μλ²κ° μ μ‘ν μλ΅μ μ²λ¦¬νλ €λ©΄ XMLHttpRequest
κ°μ²΄κ° λ°μμν€λ μ΄λ²€νΈλ₯Ό μΊμΉν΄μΌνλ€. XMLHttpRequest
κ°μ²΄κ° κ°λ μ΄λ²€νΈ νΈλ€λ¬ νλ‘νΌν° μ€μμ HTTP μμ²μ νμ¬ μνλ₯Ό λνλ΄λ readyState
νλ‘νΌν° κ°μ΄ λ³κ²½λ κ²½μ° λ°μνλ readystatechangae
μ΄λ²€νΈλ₯Ό μΊμΉνμ¬ λ€μκ³Ό κ°μ΄ HTTP μλ΅μ μ²λ¦¬ν μ μλ€.
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1')';
xhr.send();
// readystatechange μ΄λ²€νΈλ HTTP μμ²μ νμ¬ μνλ₯Ό λνλ΄λ readyState νλ‘νΌν°κ°
// λ³κ²½λ λλ§λ€ λ°μνλ€.
xhr.onreadystatechange = () => {
// readyState νλ‘νΌν°λ HTTP μμ²μ νμ¬ μνλ₯Ό λνλΈλ€.
// readyState νλ‘νΌν° κ°μ΄ 4(XMLHttpRequest.DONE)κ° μλλ©΄
// μλ² μλ΅μ΄ μλ£λμ§ μμ μνμ΄λ€.
if (xhr.readyState !== XMLHttpRequest.DONE) {
return;
}
if (xhr.status === 200) {
console.log(JSON.parse(xhr.response));
}
else {
console.error('Error', xhr.status, xhr.statusText));
}
}
send λ©μλλ₯Ό ν΅ν΄ HTTP μμ²μ μλ²μ μ μ‘νλ©΄ μλ²λ μλ΅μ λ°ννλ€. νμ§λ§ μΈμ μλ΅μ΄ ν΄λΌμ΄μΈνΈμ λλ¬ν μ§ μ μ μκΈ° λλ¬Έμ readystatechange
κ°μ μ΄λ²€νΈλ₯Ό ν΅ν΄ HTTP μμ²μ νμ¬ μνλ₯Ό νμΈν΄μΌνλ€.
onreadystatechange
μ΄λ²€νΈ νΈλ€λ¬ νλ‘νΌν°μ ν λΉν μ΄λ²€νΈ νΈλ€λ¬λ HTTP μμ²μ νμ¬ μνλ₯Ό λνλ΄λ xhr.readyState
κ° XMLHttpRequest.DONE
μΈμ§ νμΈνμ¬ μλ²μ μλ΅μ΄ μλ£λμλμ§ νμΈνλ€. μ΄ν μλ²μ μλ΅μ΄ μλ£λλ©΄ HTTP μμ²μ λν μλ΅ μν(HTTP μν μ½λ)λ₯Ό λνλ΄λ xhr.statusκ° 200μΈμ§ νμΈνμ¬ μ μ μ²λ¦¬μ μλ¬ μ²λ¦¬λ₯Ό ꡬλΆνλ€.