이 글은 '이웅모'님의 '모던 자바스크립트 Deep Dive' 책을 통해 공부한 내용을 정리한 글입니다. 저작권 보호를 위해 책의 내용은 요약되었습니다.
Ajax란 자바스크립트를 사용하여 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 이를 통해 웹페이지를 동적으로 갱신하는 프로그래밍 방식을 말한다.
브라우저에서 제공하는 Web API XMLHttpRequest
객체를 기반으로 동작한다.
전통적인 방식은 화면이 전환되면 서버로부터 새로운 HTML을 전송받아 웹페이지 전체를 처음부터 다시 렌더링한다. 따라서 다음과 같은 단점이 있다.
전통적인 방식에 비해 다음과 같은 장점이 있다.
클라이언트-서버 간 HTTP 통신을 위한 텍스트 데이터 포맷을 JSON(JavaScript Object Notation)이라 한다. 자바스크립트에 종속되지 않은 언어 독립형 데이터 포맷이다.
JSON 키는 반드시 큰따옴표로 사용해야한다. 문자열 역시 반드시 큰따옴표로 사용해야한다.
null
)null
) (max <= 10) (문자열 가능)const obj = {
name : 'kim',
age : 25,
liveInSeoul : false,
hobby : ['soccer', 'playingGame'],
}
const json = JSON.stringify(obj);
console.log(typeof json, json);
// string {"name":"kim","age":25,"liveInSeoul":false,"hobby":["soccer","playingGame"]}
null
)const obj = {
name : 'kim',
age : 25,
liveInSeoul : false,
hobby : ['soccer', 'playingGame'],
}
const json = JSON.stringify(obj);
console.log(typeof json, json);
// string {"name":"kim","age":25,"liveInSeoul":false,"hobby":["soccer","playingGame"]}
const reObj = JSON.parse(json);
console.log(typeof reObj, reObj);
// object {name: 'kim', age: 25, liveInSeoul: false, hobby: Array(2)}
자바스크립트를 사용하여 HTTP 요청을 전송하려면 XMLHttpRequest
객체를 사용한다.
XMLHttpRequest
객체는 브라우저에서 제공하는 Web API이므로 브라우저 환경에서만 정상적으로 실행된다.
const xhr = new XMLHttpRequest();
프로퍼티와 메서드는 이곳(MDN XMLHttpRequest)를 참고하자.
const xhr = new XMLHttpRequest();
xhr.open('GET', '/sing-in');
xhr.setRequestHeader('content-type', 'application/json'); // MIME 타입 지정 : json
xhr.send();
send
메서드에는 요청 몸체(Request Body)를 담아 페이로드를 인수로 전달할 수 있다. 페이로드가 객체인 경우 반드시 직렬화한 다음 전송해야한다.
GET
요청의 경우 페이로드로 전달된 인수는 무시되고 null
로 설정되어 전송된다.
서버가 전송한 응답을 처리하려면 XMLHttpRequest
객체가 발생시키는 이벤트를 캐치해야 한다.
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1'); // Fake REST API
xhr.send();
// readyState 프로퍼티가 변경될 때마다 readstatechange 이벤트 발생 (onload도 가능)
xhr.onreadystatechange = () => {
// 서버 응답 미완료시 처리 대기
if(xhr.readyState !== XMLHttpRequest.DONE) return;
// 서버 응답 결과에 따른 처리
if(xhr.status === 200) {
console.log(JSON.parse(xhr.response));
} else console.log(xhr.status, xhr.statusText);
}