Ajax(Asynchronous JavaScript and Xml)
μ΄λ
- μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ κ° μλ²μκ² λΉλκΈ° λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μμ²νκ³ , μλ²κ° μλ΅ν λ°μ΄ν°λ₯Ό μμ νμ¬ μΉ νμ΄μ§λ₯Ό λμ μΌλ‘ κ°±μ νλ νλ‘κ·Έλλ° λ°©μμ΄λ€.
- Ajaxλ λΈλΌμ°μ μμ μ 곡νλ WEB APIμΈ XMLHttpRequest κ°μ²΄λ₯Ό κΈ°λ°μΌλ‘ λμνλ€. XMLHttpRequestλ HTTP λΉλκΈ° ν΅μ μ μν λ©μλμ νλ‘νΌν°λ₯Ό μ 곡νλ€.
- λ³κ²½μ΄ νμν λΆλΆλ§ νμ μ μΌλ‘ λ λλ§ νλ λ°©μμ΄ κ°λ₯ν΄μ‘λ€.
μ ν΅μ λ°©μκ³Ό λΉκ΅νμ λμ Ajax μ₯μ
- λ³κ²½ν λΆλΆμ κ°±μ νλ λ° νμν λ°μ΄ν°λ§ μλ²λ‘λΆν° μ μ‘λ°κΈ° λλ¬Έμ λΆνμν λ°μ΄ν° ν΅μ μ΄ λ°μνμ§ μλλ€.
- λ³κ²½ν νμκ° μλ λΆλΆμ λ€μ λ λλ§νμ§ μλλ€. λ°λΌμ νλ©΄μ΄ μκ°μ μΌλ‘ κΉλΉ‘μ΄λ νμμ΄ λ°μνμ§ μλλ€.
- ν΄λΌμ΄μΈνΈμ μλ²μμ ν΅μ μ΄ λΉλκΈ° λ°©μμΌλ‘ λμνκΈ° λλ¬Έμ μλ²μκ² μμ²λ³΄λΈ μ΄ν λΈλ‘νΉμ΄ λ°μνμ§ μλλ€.
JSON(JavaScript Object Notation)μ ν΄λΌμ΄μΈνΈμ μλ² κ°μ HTTP ν΅μ μ μν ν μ€νΈ λ°μ΄ν° ν¬λ§·μ΄λ€. JSμ μ’ μλμ§ μλ μΈμ΄ λ 립ν λ°μ΄ν° ν¬λ§·μ΄κΈ°λλ¬Έμ λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄μμ μ¬μ©ν μ μλ€.
JSONμ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ 리ν°λ΄κ³Ό μ μ¬νκ² ν€μ κ°μΌλ‘ ꡬμ±λ μμ ν μ€νΈλ€.
{
"name": "Lee",
"age": 24,
"alive": true,
"hobby": ["traveling", "tennis"]
}
JSONμ ν€λ λ°λμ ν°λ°μ΄νλ‘ λ¬Άμ΄μΌ νλ€. κ°μ κ°μ²΄ 리ν°λ΄κ³Ό κ°μ νκΈ°λ²μ κ·Έλλ‘ μ¬μ©ν μ μλ€. νμ§λ§ λ¬Έμμ΄μ λ°λμ ν°λ°μ΄νλ‘ λ¬Άμ΄μΌνλ€. μμ λ°μ΄νλ μ¬μ©μ΄ λΆκ°νλ€.
JSON.stringify λ©μλλ κ°μ²΄λ₯Ό JSON ν¬λ§·μ λ¬Έμμ΄λ‘ λ³ν
νλ€. ν΄λΌμ΄μΈνΈκ° μλ²λ‘ κ°μ²΄λ₯Ό μ μ‘νλ €λ©΄ κ°μ²΄λ₯Ό λ¬Έμμ΄ν ν΄μΌ νλλ° μ΄λ₯Ό μ§λ ¬ν(serializing)μ΄λΌ νλ€.
// value : JSONμ λ¬Έμμ΄λ‘ λ°νν κ°, replacer : λ¬Έμμ΄ν λμ λ°©μμ λ³κ²½νλ ν¨μ,
// νΉμ JSON λ¬Έμμ΄μ ν¬ν¨λ κ° κ°μ²΄μ μμ±λ€μ μλ΅νκΈ° μν νμ΄νΈλ¦¬μ€νΈλ‘ μ°μ΄λ String, Number κ°μ²΄λ€μ λ°°μ΄
// μ΄ κ°μ΄ null μ΄κ±°λ μ 곡λμ§ μμΌλ©΄, κ°μ²΄μ λͺ¨λ μμ±λ€μ΄ JSON λ¬Έμμ΄ κ²°κ³Όμ ν¬ν¨λλ€.
// space : κ°λ
μ±μ μν 곡백
JSON.stringify(value[, replacer[, space]])
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"]}
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 ν¬λ§·μ λ¬Έμμ΄μ λ°°μ΄λ‘ λ³ν, λ°°μ΄μ μμκΉμ§ κ°μ²΄λ‘ λ³ν
λΈλΌμ°μ λ μ£Όμμ°½μ΄λ HTMLμ form νκ·Έ λλ a νκ·Έλ₯Ό ν΅ν΄ HTTP μμ² μ μ‘ κΈ°λ₯μ κΈ°λ³Έ μ 곡νλ€. μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ HTTP μμ²μ μ μ‘νλ €λ©΄ XMLHttpRequest κ°μ²΄λ₯Ό μ¬μ©νλ€.
- XMLHttpRequest κ°μ²΄λ XMLHttpRequest μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μμ±νλ€.
- μ΄ κ°μ²΄λ λΈλΌμ°μ μμ μ 곡νλ Web APIμ΄λ―λ‘ λΈλΌμ°μ νκ²½μμλ§ μ μ μ€νλλ€.
const xhr = new 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 | μλ² μλ΅ μλ£ |
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λ₯Ό ꡬννλ€.
HTTP μμ² λ©μλ | μ’ λ₯ | λͺ©μ | νμ΄λ‘λ (μ μ‘ λ λ°μ΄ν° μ 무) |
---|---|---|---|
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
-
μλ²κ° μ μ‘ν μλ΅μ μ²λ¦¬νλ €λ©΄ 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); } }