Skip to content

Latest commit

Β 

History

History
226 lines (169 loc) Β· 11.6 KB

File metadata and controls

226 lines (169 loc) Β· 11.6 KB

43μž₯ Ajax

43.1 Ajaxλž€?

Ajax(Asynchronous JavaScript and Xml)μ΄λž€

  • μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ μ„œλ²„μ—κ²Œ 비동기 λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μš”μ²­ν•˜κ³ , μ„œλ²„κ°€ μ‘λ‹΅ν•œ 데이터λ₯Ό μˆ˜μ‹ ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€λ₯Ό λ™μ μœΌλ‘œ κ°±μ‹ ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 방식이닀.
  • AjaxλŠ” λΈŒλΌμš°μ €μ—μ„œ μ œκ³΅ν•˜λŠ” WEB API인 XMLHttpRequest 객체λ₯Ό 기반으둜 λ™μž‘ν•œλ‹€. XMLHttpRequestλŠ” HTTP 비동기 톡신을 μœ„ν•œ λ©”μ„œλ“œμ™€ ν”„λ‘œνΌν‹°λ₯Ό μ œκ³΅ν•œλ‹€.
  • 변경이 ν•„μš”ν•œ λΆ€λΆ„λ§Œ ν•œμ •μ μœΌλ‘œ λ Œλ”λ§ ν•˜λŠ” 방식이 κ°€λŠ₯ν•΄μ‘Œλ‹€.

Traditional

Ajax

전톡적 방식과 λΉ„κ΅ν–ˆμ„ λ•Œμ˜ Ajax μž₯점

  • λ³€κ²½ν•  뢀뢄을 κ°±μ‹ ν•˜λŠ” 데 ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μ„œλ²„λ‘œλΆ€ν„° 전솑받기 λ•Œλ¬Έμ— λΆˆν•„μš”ν•œ 데이터 톡신이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
  • λ³€κ²½ν•  ν•„μš”κ°€ μ—†λŠ” 뢀뢄은 λ‹€μ‹œ λ Œλ”λ§ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ 화면이 μˆœκ°„μ μœΌλ‘œ κΉœλΉ‘μ΄λŠ” ν˜„μƒμ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ™€μ˜ 톡신이 비동기 λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ²„μ—κ²Œ μš”μ²­λ³΄λ‚Έ 이후 λΈ”λ‘œν‚Ήμ΄ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

43.2 JSON

JSON(JavaScript Object Notation)은 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ HTTP 톡신을 μœ„ν•œ ν…μŠ€νŠΈ 데이터 포맷이닀. JS에 μ’…μ†λ˜μ§€ μ•ŠλŠ” μ–Έμ–΄ λ…λ¦½ν˜• 데이터 ν¬λ§·μ΄κΈ°λ•Œλ¬Έμ— λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

43.2.1 JSON ν‘œκΈ° 방식

JSON은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 객체 λ¦¬ν„°λŸ΄κ³Ό μœ μ‚¬ν•˜κ²Œ 킀와 κ°’μœΌλ‘œ κ΅¬μ„±λœ 순수 ν…μŠ€νŠΈλ‹€.

{
  "name": "Lee",
  "age": 24,
  "alive": true,
  "hobby": ["traveling", "tennis"]
}

JSON의 ν‚€λŠ” λ°˜λ“œμ‹œ ν°λ”°μ˜΄ν‘œλ‘œ λ¬Άμ–΄μ•Ό ν•œλ‹€. 값은 객체 λ¦¬ν„°λŸ΄κ³Ό 같은 ν‘œκΈ°λ²•μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ λ¬Έμžμ—΄μ€ λ°˜λ“œμ‹œ ν°λ”°μ˜΄ν‘œλ‘œ λ¬Άμ–΄μ•Όν•œλ‹€. μž‘μ€ λ”°μ˜΄ν‘œλŠ” μ‚¬μš©μ΄ λΆˆκ°€ν•˜λ‹€.

43.2.2 JSON.stringify

JSON.stringify λ©”μ„œλ“œλŠ” 객체λ₯Ό JSON 포맷의 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ 객체λ₯Ό μ „μ†‘ν•˜λ €λ©΄ 객체λ₯Ό λ¬Έμžμ—΄ν™” ν•΄μ•Ό ν•˜λŠ”λ° 이λ₯Ό 직렬화(serializing)이라 ν•œλ‹€.

// value : JSON을 λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•  κ°’, replacer : λ¬Έμžμ—΄ν™” λ™μž‘ 방식을 λ³€κ²½ν•˜λŠ” ν•¨μˆ˜,
// ν˜Ήμ€ JSON λ¬Έμžμ—΄μ— 포함될 κ°’ 객체의 속성듀을 μ„œλ‚΅ν•˜κΈ° μœ„ν•œ ν™”μ΄νŠΈλ¦¬μŠ€νŠΈλ‘œ μ“°μ΄λŠ” String, Number κ°μ²΄λ“€μ˜ λ°°μ—΄
// 이 값이 null μ΄κ±°λ‚˜ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄, 객체의 λͺ¨λ“  속성듀이 JSON λ¬Έμžμ—΄ 결과에 ν¬ν•¨λœλ‹€.
// space : 가독성을 μœ„ν•œ 곡백
JSON.stringify(value[, replacer[, space]])

43.2.3 JSON.parse

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"]}
πŸ’‘ 배열이 JSON 포맷의 λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ˜μ–΄ μžˆλŠ” 경우 JSON.parseλŠ” λ¬Έμžμ—΄μ„ λ°°μ—΄ 객체둜 λ³€ν™˜ν•œλ‹€. λ°°μ—΄μ˜ μš”μ†Œκ°€ 객체인 경우 λ°°μ—΄μ˜ μš”μ†ŒκΉŒμ§€ 객체둜 λ³€ν™˜ν•œλ‹€.
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 포맷의 λ¬Έμžμ—΄μ„ λ°°μ—΄λ‘œ λ³€ν™˜, λ°°μ—΄μ˜ μš”μ†ŒκΉŒμ§€ 객체둜 λ³€ν™˜

43.3 XMLHttpRequest

λΈŒλΌμš°μ €λŠ” μ£Όμ†Œμ°½μ΄λ‚˜ HTML의 form νƒœκ·Έ λ˜λŠ” a νƒœκ·Έλ₯Ό 톡해 HTTP μš”μ²­ 전솑 κΈ°λŠ₯을 κΈ°λ³Έ μ œκ³΅ν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ HTTP μš”μ²­μ„ μ „μ†‘ν•˜λ €λ©΄ XMLHttpRequest 객체λ₯Ό μ‚¬μš©ν•œλ‹€.

43.3.1 XMLHttpRequest 객체 생성

  • XMLHttpRequest κ°μ²΄λŠ” XMLHttpRequest μƒμ„±μž ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μƒμ„±ν•œλ‹€.
  • 이 κ°μ²΄λŠ” λΈŒλΌμš°μ €μ—μ„œ μ œκ³΅ν•˜λŠ” Web APIμ΄λ―€λ‘œ λΈŒλΌμš°μ € ν™˜κ²½μ—μ„œλ§Œ 정상 μ‹€ν–‰λœλ‹€.
const xhr = new XMLHttpRequest();

43.3.2 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 μ„œλ²„ 응닡 μ™„λ£Œ

43.3.3 HTTP μš”μ²­ 전솑

HTTP μš”μ²­μ„ μ „μ†‘ν•˜λŠ” 경우 λ‹€μŒ μˆœμ„œλ₯Ό λ”°λ₯Έλ‹€.

  1. XMLHttpRequestp.prototype.setRequestHeader λ©”μ„œλ“œλ‘œ νŠΉμ • HTTP μš”μ²­μ˜ 헀더 값을 μ„€μ •ν•œλ‹€.
  2. ν•„μš”μ— λ”°λΌμ„œ XMLHttpRequest.prototype.setRequestHeader λ©”μ„œλ“œλ‘œ νŠΉμ • HTTP μš”μ²­μ˜ 헀더 값을 μ„€μ •ν•œλ‹€
  3. 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

43.3.4 HTTP 응닡 처리

  • μ„œλ²„κ°€ μ „μ†‘ν•œ 응닡을 μ²˜λ¦¬ν•˜λ €λ©΄ 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);
    	}
    }