01. Ajaxλ?
πΉ Ajax(Asynchronous JavaScript and XML)λ μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ κ° μλ²μκ² λΉλκΈ° λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μμ²νκ³ , μλ²κ° μλ΅ν λ°μ΄ν°λ₯Ό μμ νμ¬ μΉνμ΄μ§λ₯Ό λμ μΌλ‘ κ°±μ νλ νλ‘κ·Έλλ° λ°©μμ΄λ€.
πΉ Ajaxλ λΈλΌμ°μ μμ μ 곡νλ Web APIλ XMLHttpRequest κ°μ²΄λ₯Ό κΈ°λ°μΌλ‘ λμνλ€.
π‘ μ λλ°©μ vs. Ajax
1. μ ν΅λ°©μ
πΉ νλ©΄μ΄ μ νλλ©΄ μλ²λ‘λΆν° μλ‘μ΄ HTML νμ΄μ§λ₯Ό μ μ‘λ°μ μΉνμ΄μ§ μ 체λ₯Ό μ²μλΆν° λ€μ λ λλ§νλ€.
β‘οΈ λ¨μ : λΆνμν λ°μ΄ν° ν΅μ μ΄ λ°μνκ³ , λ³κ²½μ΄ νμμλ λΆλΆκΉμ§ λ€μ λ λλ§νλ―λ‘ νλ©΄ μ ν μ νλ©΄ κΉλΉ‘μ νμμ΄ λ°μνλ€. λν, λκΈ° λ°©μμΌλ‘ λμνκΈ° λλ¬Έμ μλ²λ‘λΆν° μλ΅μ΄ μμ λκΉμ§ λ€μ μ²λ¦¬λ λΈλ‘νΉλλ€.
2. Ajax
πΉ λ³κ²½ν νμκ° μλ λΆλΆλ§ νμ μ μΌλ‘ λ λλ§νλ λ°©μμ΄λ€.
πΉ μ₯μ : λΆνμν λ°μ΄ν° ν΅μ μ΄ λ°μνμ§ μκ³ , λ³κ²½ν νμκ° μλ λΆλΆμ 리λ λλ§νμ§ μμΌλ―λ‘ νλ©΄ κΉλΉ‘μ νμμ΄ λ°μνμ§ μλλ€. λν, ν΅μ μ΄ λΉλκΈ° λ°©μμΌλ‘ λμνλ―λ‘ λΈλ‘νΉμ΄ λ°μνμ§ μλλ€.
02. JSON
πΉ JSON(JavaScript Object Notation)μ ν΄λΌμ΄μΈνΈμ μλ² κ°μ HTTP ν΅μ μ μν ν μ€νΈ λ°μ΄ν° ν¬λ§·μΌλ‘, λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©ν μ μλ€.
1) JSON νκΈ° λ°©μ
πΉ ν€μ κ°μΌλ‘ ꡬμ±λ μμν ν μ€νΈλ‘, ν€λ λ°λμ ν° λ°μ΄νλ‘ λ¬Άμ΄μΌ νλ€.
{
"name" : "Lee",
"age" : 20,
"alive" : true,
"hobby" : ["traveling", "tennis"]
}
2) JSON.stringify
πΉ JSON.stringify λ©μλλ κ°μ²΄, λ°°μ΄μ JSON ν¬λ§·μ λ¬Έμμ΄λ‘ λ³ννλ€.
const obj = {
name: 'Lee',
age: 20,
alive: true,
hobby: ['traveling', 'tennis']
};
// κ°μ²΄λ₯Ό JSON ν¬λ§·μ λ¬Έμμ΄λ‘ λ³ννλ€.
const json = JSON.stringify(obj);
console.log(typeof json, json);
// string {"name":"Lee", "age":20, "alive":true, "hobby":["traveling", "tennis"]}
3) JSON.parse
πΉ JSON.parse λ©μλλ JSON ν¬λ§·μ λ¬Έμμ΄μ κ°μ²΄λ‘ λ³ννλ€.
const obj = {
name: 'Lee',
age: 20,
alive: true,
hobby: ['traveling', 'tennis']
};
// κ°μ²΄λ₯Ό JSON ν¬λ§·μ λ¬Έμμ΄λ‘ λ³ννλ€.
const json = JSON.stringify(obj);
console.log(typeof json, json);
// string {"name":"Lee", "age":20, "alive":true, "hobby":["traveling", "tennis"]}
// JSON ν¬λ§·μ λ¬Έμμ΄μ κ°μ²΄λ‘ λ³ννλ€.
const parsed = JSON.parse(json);
console.log(typeof parsed, parsed);
// object {name: "Lee", age:20, alive:true, hobby:["traveling","tennis"]};
03. XMLHttpRequest
1) XMLHttpRequest κ°μ²΄ μμ±
πΉ XMLHttpRequest μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μμ±νλ€.
// XMLHttpRequest κ°μ²΄μ μμ±
const xhr = new XMLHttpRequest();
2) XMLHttpRequest κ°μ²΄μ νλ‘νΌν°μ λ©μλ
XMLHttpRequest κ°μ²΄μ νλ‘ν νμ νλ‘νΌν°
νλ‘ν νμ νλ‘νΌν° | μ€λͺ |
readyState | HTTP μμ²μ νμ¬ μνλ₯Ό λνλ΄λ μ μ |
status | HTTP μμ²μ λν μλ΅ μνλ₯Ό λνλ΄λ μ μ |
statusText | HTTP μμ²μ λν μλ΅ λ©μμ§λ₯Ό λνλ΄λ λ¬Έμμ΄ |
responseType | HTTP μλ΅ νμ |
response | HTTP μμ²μ λν μλ΅ λͺΈμ²΄ |
reponseText | μλ²κ° μ μ‘ν HTTP μμ²μ λν μλ΅ λ¬Έμμ΄ |
XMLHttpRequest κ°μ²΄μ μ΄λ²€νΈ νΈλ€λ¬ νλ‘νΌν°
μ΄λ²€νΈ νΈλ€λ¬ νλ‘νΌν° | μ€λͺ |
onreadystatechange | readyState νλ‘νΌν° κ°μ΄ λ³κ²½λ κ²½μ° |
onloadstart | HTTP μμ²μ λν μλ΅μ λ°κΈ° μμν κ²½μ° |
onprogress | HTTP μμ²μ λν μλ΅μ λ°λ λμ€ μ£ΌκΈ°μ μΌλ‘ λ°μ |
onabort | abort λ©μλμ μν΄ HTTP μμ²μ΄ μ€λ¨λ κ²½μ° |
onerror | HTTP μμ²μ μλ¬κ° λ°μν κ²½μ° |
onload | HTTP μμ²μ΄ μ±κ³΅μ μΌλ‘ μλ£ν κ²½μ° |
ontimeout | HTTP μμ² μκ°μ΄ μ΄κ³Όν κ²½μ° |
onloadend | HTTP μμ²μ΄ μλ£ν κ²½μ°. HTTP μμ²μ΄ μ±κ³΅ λλ μ€ν¨νλ©΄ λ°μ |
XMLHttpRequest κ°μ²΄μ λ©μλ
λ©μλ | μ€λͺ |
open | HTTP μμ² μ΄κΈ°ν |
send | HTTP μμ² μ μ‘ |
aobrt | μ΄λ―Έ μ μ‘λ HTTP μμ² μ€λ¨ |
setRequestHeader | νΉμ HTTP μμ² ν€λμ κ°μ μ€μ |
getResponseHeader | νΉμ HTTP μμ² ν€λμ κ°μ λ¬Έμμ΄λ‘ λ°ν |
XMLHttpRequest κ°μ²΄μ μ μ νλ‘νΌν°
μ μ νλ‘νΌν° | κ° | μ€λͺ |
UNSENT | 0 | open λ©μλ νΈμΆ μ΄μ |
OPENED | 1 | open λ©μλ νΈμΆ μ΄ν |
HEADERS_RECEIVED | 2 | send λ©μλ νΈμΆ μ΄ν |
LOADING | 3 | μλ² μλ΅ μ€(μλ΅ λ°μ΄ν° λ―Έμμ± μν) |
DONE | 4 | μλ² μλ΅ μλ£ |
3) HTTP μμ² μ μ‘
1. XMLHttpRequest.prototype.open λ©μλλ‘ HTTP μμ²μ μ΄κΈ°νν¨
2. νμμ λ°λΌ XMLHttpRequest.prototype.setRequestHeader λ©μλλ‘ νΉμ HTTP μμ²μ ν€λ κ°μ μ€μ ν¨
3. XMLHttpRequest.prototype.send λ©μλλ‘ HTTP μμ²μ μ μ‘ν¨
// XMLHttpRequest κ°μ²΄ μμ±
const xhr = new XMLHttpRequest();
// HTTP μμ² μ΄κΈ°ν
xhr.open('GET', '/users');
// HTTP μμ² ν€λ μ€μ
// ν΄λΌμ΄μΈνΈκ° μλ²λ‘ μ μ‘ν λ°μ΄ν°μ MIME νμ
μ§μ : json
xhr.setRequestHeader('content-type', 'application/json');
// HTTP μμ² μ μ‘
xhr.send();
XMLHttpRequest.prototype.open
πΉ open λ©μλλ μλ²μ μ μ‘ν HTTP μμ²μ μ΄κΈ°ννλ€.
xhr.open(method, url[, async])
πΉ HTTP μμ² λ©μλλ ν΄λΌμ΄μΈνΈκ° μλ²μκ² μμ²μ μ’ λ₯μ λͺ©μ μ μ리λ λ°©λ²μ΄λ€.
β‘οΈ μ£Όλ‘ 5κ°μ§ μμ² λ©μλ(GET, POST, PUT, PATCH, DELETE λ±)λ₯Ό μ¬μ©νμ¬ CRUDλ₯Ό ꡬννλ€.
XMLHttpRequest.prototype.send
πΉ send λ©μλλ open λ©μλλ‘ μ΄κΈ°νλ HTTP μμ²μ μλ²μ μ μ‘νλ€.
πΉ GET μμ²μΌ κ²½μ°, λ°μ΄ν°μ URLμ μΌλΆλΆμΈ 쿼리 λ¬Έμμ΄λ‘ μλ²μ μ μ‘νλ€.
πΉ POST μμ²μΌ κ²½μ°, λ°μ΄ν°λ₯Ό request bodyμ λ΄μ μ μ‘νλ€.
xhr.send(JSON.stringify({ id: 1, content: 'HTML', completed: false }));
πΉ μμ² λ©μλκ° GETμΈ κ²½μ°, send λ©μλμ νμ΄λ‘λλ‘ μ λ¬λ μΈμλ 무μλκ³ μμ² λͺΈμ²΄λ nullλ‘ μ€μ λλ€.
XMLHttpRequest.prototype.setRequestHeader
πΉ setRequestHeader λ©μλλ νΉμ HTTP μμ²μ ν€λ κ°μ μ€μ νλ€.
πΉ λ°λμ open λ©μλλ₯Ό νΈμΆν μ΄νμ νΈμΆν΄μΌ νλ€.
πΉ Content-type μ request bodyμ λ΄μ μ μ‘ν λ°μ΄ν°μ MIME νμ μ μ 보λ₯Ό νννλ€.
β λ§μ½ Accept ν€λλ₯Ό μ€μ νμ§ μμΌλ©΄, send λ©μλκ° νΈμΆλ λ Accept ν€λκ° */* μΌλ‘ μ μ‘λλ€.
4) HTTP μλ΅ μ²λ¦¬
πΉ XMLHttpRequest κ°μ²΄μ μ΄λ²€νΈ νΈλ€λ¬ νλ‘νΌν° μ€ readyState νλ‘νΌν° κ°μ΄ λ³κ²½λ κ²½μ° λ°μνλ readystatechange μ΄λ²€νΈλ₯Ό μΊμΉνμ¬ HTTP μλ΅μ μ²λ¦¬ν μ μλ€.
β‘οΈ HTTP μμ²μ νμ¬ μνλ₯Ό λνλ΄λ xhr.readyStateκ° XMLHttpRequest.DONEμΈμ§ νμΈνμ¬ μλ²μ μλ΅μ΄ μλ£λμλμ§ νμΈνλ€.
β readystatechange μ΄λ²€νΈ λμ , load μ΄λ²€νΈλ₯Ό μΊμΉνλ λ°©λ²λ μλ€.
β‘οΈ load μ΄λ²€νΈλ HTTP μμ²μ΄ μ±κ³΅μ μΌλ‘ μλ£λ κ²½μ° λ°μνκΈ° λλ¬Έμ, xhr.readyStateκ° XMLHttpRequest.DONEμΈμ§ νμΈν νμκ° μλ€.
π μ°Έκ³ μλ£