AJAX(1) - 개념 소개, XMLHttpRequest를 이용한 요청
AJAX
AJAX는 Asynchronous JavaScript and XML의 약자로, 자바스크립트와 XML을 이용해 비동기적으로 서버에 리소스를 요청할 수 있는 기술을 말한다.
반대로 AJAX가 아닌, 우리가 일반적으로 서버에 요청하는 방식을 동기적 요청이라고 한다.
동기적 요청을 실행하면 서버로부터 웹 페이지 전체를 받아오기 때문에, 브라우저가 보여주는 페이지를 처음부터 다시 로딩해야 하는 불편함이 생긴다.
따라서 브라우저 사용자는 서버로부터 응답이 올 때까지 다른 일을 하지 못하고, 응답이 완료되어야 다른 처리를 진행할 수 있다.
하지만 AJAX를 이용하면 웹 페이지 전체가 아닌 일부를 로딩(데이터만 로딩)할 수 있고, 브라우저가 아닌 백그라운드 영역(비동기)에서 서버와 통신하기 때문에 페이지를 새로고침하지 않는다.
즉 AJAX를 이용하면, 요청이 진행중이더라도 문서 속 입력란에 텍스트를 입력하거나 버튼을 누르는 등 문서의 요소와 상호작용할 수 있다.
이러한 장점으로 인해 지도 서비스나 검색 엔진의 검색어 추천 서비스에 AJAX가 이용된다.
최근에는 AJAX를 이용할 때 XML 대신 JSON을 이용한다.
자바스크립트의 XMLHttpRequest
자바스크립트에서 ajax 요청을 진행할 때 XMLHttpRequest 객체가 사용된다.
XMLHttpRequest의 프로퍼티
XMLHttpRequest 객체의 프로퍼티를 이해해야 AJAX 요청을 진행할 수 있다.
요청/처리 관련
- readyState: XMLHttpRequest 객체의 현재 상태 의미
- 0(UNSENT): XMLHttpRequest 객체가 생성된 후, open()이 호출되지 않은 상태
- 1(OPENED): open() 메소드가 성공적으로 실행 - send()를 호출할 수 있게 됨
- 2(HEADERS_RECEIVED): send() 메소드가 호출되어 클라이언트가 보낸 요청이 서버에 도착 후 리스폰스 헤더를 받는 상태
- 3(LOADING): 서버가 클라이언트의 요청을 처리하여 리스폰스 바디를 받고 있는 상태(말 그대로 로딩중)
- 4(DONE): 요청 처리 완료
- status: 서버에서 보낸 응답 코드 저장(200, 404 등)
- onreadystatechange: XMLHttpRequest 객체의 readyState 프로퍼티 값이 변할 때마다 자동으로 호출되는 함수(이벤트 리스너) 지정
- onload: XMLHttpRequest 객체를 통한 요청에 대한 응답이 성공적으로 완료된 경우 자동으로 호출되는 함수(이벤트 리스너) 지정
응답 컨텐츠 관련
- response: 리스폰스 바디를 저장
- responseType 프로퍼티(디폴트값: "text")에 response 프로퍼티의 저장 방식 설정 가능
- xhr.responseType = "json"; 으로 지정하고(xhr은 XMLHttpRequest 객체) AJAX 요청을 진행하면 response 프로퍼티에는 자바스크립트 객체가 저장(JSON으로 온 응답을 자바스크립트 객체로 파싱하기 때문)
- responseText: 리스폰스 바디를 텍스트 형태로 저장
- responseXML: 리스폰스 바디를 XML 형태로 저장
XMLHttpRequest을 통한 AJAX 요청 방법
일반적으로 XMLHttpRequest 객체를 통해 AJAX 요청을 진행할 때 아래의 과정을 거친다.
- XMLHttpRequest 객체(이하 xhr) 생성
- xhr.onreadystatechange 프로퍼티 값으로 핸들러 함수를 설정해 서버 응답시 함수 내용 실행하도록 정의
- xhr.open() 메소드 호출하여 서버로 보낼 ajax 요청 형식 설정(2, 3번은 바뀌어도 상관없을 것 같다)
- xhr.send() 메소드를 호출해 2, 3번 과정에서 세팅한 ajax 요청을 서버로 전송
아래는 실제로 요청하는 예시이다.
// 클라이언트에서 서버로 ajax 요청할 때
const xhr = new XMLHttpRequest();
function handler() {
// js 특징: xhr를 외부에서 캡처하여 참조
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
// ajax 요청에 성공했을 때 처리할 내용 예시
console.log(xhr.responseText); // 리스폰스 바디(텍스트)를 브라우저 콘솔창에 출력
} else {
// 실패했을 때 처리할 내용
}
}
xhr.onreadystatechange = handler;
xhr.open('GET', 'https://localhost:8080/data', true);
xhr.send();
xhr.open() 메소드의 인자
위의 예시에서 xhr.open()을 호출할 때 인자 3개를 전달했다.
첫 번째 인자는 요청 메소드를 정의하는 문자열을 의미한다.
예를 들어 'GET', 'POST' 등 HTTP 메소드를 의미하는 문자열이 첫 번째 인자로 들어간다.
두 번째 인자는 AJAX 요청을 진행할 경로를 의미한다.
마지막으로 세 번째 인자는 비동기 요청 여부를 의미하며 디폴트값은 true이다.
open()의 마지막 인자에 디폴트값이 true로 지정되어 있으므로 open()을 호출할 때 마지막 인자는 생략할 수 있다.
즉, open('GET', 'https://localhost:8080/here')와 같은 형태로 open()을 호출할 수 있다.
참고한 자료
https://www.tcpschool.com/ajax/intro
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState
https://velog.io/@surim014/AJAX%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80