Asynchronous JavaScript and XML
자바스크립트를 사용하여 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 웹페이지를 동적으로 갱신하는 프로그래밍 방식
전통적인 방식 | Ajax 방식 |
---|---|
서버로부터 완전한 html을 전송받아 웹페이지를 처음부터 렌더링함 | 서버로부터 웹페이지의 변경에 필요한 데이터만 비동기 방식으로 전송받아 변경할 부분만 렌더링함 |
변경하지 않는 부분까지 매번 다시 전송받기 때문에 불필요한 데이터 통신 발생 | 갱신이 필요한 데이터만 전송받기 때문에 불필요한 데이터 통신이 발생하지 않음 |
화면 전환이 일어날 때 화면이 순간적으로 깜빡이는 현상 | 화면이 순간적으로 깜빡이는 현상 없음 |
클라이언트 ↔ 서버 통신이 동기 방식이기 때문에 서버로부터의 응답 전까지는 블로킹됨 | 클라이언트 ↔ 서버 통신이 비동기 방식이기 때문에 서버요청 이후 블로킹이 발생하지 않음 |
JavaScript Object Notation
클라이언트와 서버 간의 HTTP 통신을 위한 텍스트 데이터 포맷
{
"key1" : "value", // key와 문자열 값은 반드시 큰 따옴표로 묶어야 한다.
"key2" : 1
}
JSON.stringify
JSON.parse
HTTP 비동기 통신을 위한 요청 전송과 응답수신을 위한 다양한 메서드와 프로퍼티를 제공하는 Web API
이름만 봐서는 XML만 받아올 수 있을 것 같아 보이지만 모든 종류의 데이터를 받아오는데 사용할 수 있다.
HTTP 이외의 프로토콜도 지원한다.(file, ftp포함)
객체 생성
const xhr = new XMLHttpRequest();
프로퍼티와 메서드
프로토타입 프로퍼티
프로퍼티 | 설명 | 예시 |
---|---|---|
readyState | HTTP 요청의 현재 상태를 나타내는 정수 | 0: UNSENT 1: OPENED 2: HEADERS_RECEIVED 3: LOADING 4: DONE |
status | HTTP 요청에 대한 응답상태(HTTP 상태코드)를 나타내는 정수 | 200 |
statusText | HTTP 요청에 대한 응답메시지를 나타내는 문자열 | “OK” |
responseType | HTTP 응답 타입 | document, json, text, blob, arraybuffer |
response | HTTP 요청에 대한 응답 몸체 | |
responseText | 서버가 전송한 HTTP 요청에 대한 응답 문자열 |
이벤트 핸들러 프로퍼티
프로퍼티 | 설명 |
---|---|
onreadystatechange | readyState 프로퍼티 값이 변경된 경우 |
onloadstart | HTTP 요청에 대한 응답을 받기 시작한 경우 |
onprogress | HTTP 요청에 대한 응답을 받는 도중 주기적으로 발생 |
onabort | abort 메서드에 의해 HTTP 요청이 중단된 경우 |
onerror | HTTP 요청에 에러가 발생한 경우 |
onload | HTTP 요청이 성공적으로 완료한 경우 |
ontimeout | HTTP 요청 시간이 초과한 경우 |
onloadend | HTTP 요청이 완료한 경우, HTTP 요청이 성공 또는 실패하면 발생 |
정적 프로퍼티
프로퍼티 | 값 | 설명 |
---|---|---|
UNSENT | 0 | open 메서드 호출 이전 |
OPENED | 1 | open 메서드 호출 이후 |
HEADERS_RECEIVED | 2 | send 메서드 호출 이후 |
LOADING | 3 | 서버 응답 중(응답 데이터 미완성 상태) |
DONE | 4 | 서버 응답 완료 |
메서드
메서드 | 설명 | 예시 |
---|---|---|
open | HTTP 요청 초기화 | xhr.open(method, url[, async]) |
send | HTTP 요청 전송 | xhr.send(JSON.stringify(data)) |
abort | 이미 전송된 HTTP 요청 중단 | |
setRequestHeader | 특정 HTTP 요청 헤더의 값을 설정 | xhr.setRequestHeader(header,value) |
getResponseHeader | 특정 HTTP 요청 헤더의 값을 문자열로 반환 |
HTTP 요청 전송
open → setRequestHeader → send
요청 초기화 → 헤더 설정 → 요청 전송
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);
}
}
xhr.onload = () => {
if (xhr.status === 200) {
console.log(JSON.parse(xhr.response));
} else {
console.error('Error', xhr.status, xhr.statusText);
}
}