Ajax는 약자에서 알 수 있듯이 말그대로, JavaScript와 XML을 이용한 비동기적 정보교환 방법이다.
XML(eXtensible Markup Language) => 문서 작업이라고 생각하면 된다. 문서나 데이터 구조를 기록하는 언어!
(플젝 할 때 강사님 따라서 그냥 xml파일 수정하기만 했지 뭔지 제대로 찾아볼 생각을 안 했었는데 XML이 뭔지 궁금해서 찾아봤다. 따로 정리하기엔 애매해서 링크 타고 들어가서 헷갈릴 때마다 확인해보자.)
한마디로 말하자면, Client와 Server 간에 XML 데이터를 JavaScript를 사용해 비동기 통신으로 주고받는 기술이다.
하지만 요즘에는 데이터 전송을 위한 데이터 포맷방법으로 XML을 사용하기 보다는 JSON을 더 많이 사용한다.
(cf. HTML은 데이터 표현을 위한 포맷방법)
Ajax는 브라우저의 XMLHttpRequest를 이용해 전체 페이지를 새로 가져오지 않고도 페이지 일부만을 변경할 수 있도록 JavaScript를 실행해 서버에 데이터만을 별도로 요청한다.
이를 이해하기 위해서 Ajax의 주요 구성요소도 정리해보았다.
var xmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
var xmlHttpObject = new XMLHttpRequest();
var xmlHttpRequest = null;
function getXMLHttpRequest() {
if(window.ActiveXObject) {
try{
return new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try{
return new ActiveXObject("Microsoft.XMLHTTP");
} catch(e1) {
return null;
}
} //end of if(window.ActiveXObject)-----------
} else if(window.XMLHttpRequest) {
return new XMLHttpRequest();
} else {
return null;
}
} //end of function getXMLHttpRequest()----------------------------
xmlHttpRequest = getXMLHttpRequest();
(1) abort() 메소드
: 현재의 요청을 중단한다.
(2) getAllResponseHeadders() 메소드
: Http 요청에 대한 모든 응답 헤더들을 키(key)와 값(value)의 쌍인 문자열을 리턴해준다.
(3) getResponseHeaders() 메소드
: 매개 변수로 주어진 headerName 에 해당하는 헤더의 값을 문자열로 리턴해준다.
(4) open() 메소드
: 사용자의 요청을 설정하는 메소드로 반드시 기술해야 하는 매개변수인 method, url 과 선택적으로 기술할 수 있는 요청에 대한 매개변수들을 갖고 있다.
① 첫번째 파라미터: Http method를 지정한다.
HTML 폼을 보면 method 속성에 "GET"이나 "POST"를 값으로 주는데, 이 첫번째 파라미터도 같은 값이 사용된다.
② 두번째 파라미터: 접속할 URL을 입력한다.
웹 브라우저에 보안상의 이유로 접속할 URL은 현재 페이지와 같은 도메인에 있어야 한다.
③ 세번째 파라미터: 비동기(true) / 동기(false) 방식을 지정한다.
open() 메소드에서 세번째 파라미터를 true(비동기) 로 지정해주면
send() 메소드가 호출되고서 send() 메소드를 통한 서버와의 통신이 진행중이더라도
send() 메소드 호출 바로 다음의 코드로 넘어가 진행을 하지만,
open() 메소드에서 세번째 파라미터를 false(동기) 로 지정해주면
send() 메소드가 호출되고서 send() 메소드를 통한 서버와의 통신이 완전히 완료된 이후에야
send() 메소드 호출 바로 다음의 코드로 넘어가 진행을 하게 된다.
(5) send() 메소드
: 사용자의 요청을 서버로 보내는 역할.
(6) setRequestHeader() 메소드
: 헤더의 값을 설정한다.
xmlHttpRequest = getXMLHttpRequest();
xmlHttpRequest.open("GET", "test.jsp?id=hanmailrg&passwd=javateahcer", true);
xmlHttpRequest.send(null);
이때 주의해야 할 점이 있다.
open() 메소드에서 URL이 GET 방식의 파라미터로 넘겨받도록 되어 있는 경우,
그 파라미터 값이 한글이면 한글이 깨진다.
예를 들어, GET 방식으로 웹 서버에 있는 test.jsp 페이지를 요청한다고 생각해보자.
xmlHttpRequest = getXMLHttpRequest();
xmlHttpRequest.open("GET", "/test.jsp?name=김나윤&addr=서울", true);
xmlHttpRequest.send(null);
이 경우 URL을 지정하는 두번째 파라미터 값에 한글이 포함되어 있다. 따라서 한글이 깨져 test.jsp 페이지를 성공적으로 요청할 수 없기 때문에 encodeURIComponent()
함수를 사용하여 오류를 방지한다.
xmlHttpRequest = getXMLHttpRequest();
var params = "name=" + encodeURIComponent("김나윤") + "&addr=" + encodeURIComponent("서울");
xmlHttpRequest.open("GET", "test.jsp?" + params, true);
xmlHttpRequest.send(null);
xmlHttpRequest = getXMLHttpRequest();
xmlHttpRequest.open("POST", "test.jsp", ture);
xmlHttpRequest.send("id=hanmailrg&passwd=javateacher");
xmlHttpRequest = getXMLHttpRequest();
xmlHttpRequest.open("GET", "test.txt", true);
xmlHttpRequest.send(null);
※ XMLHttpRequest 객체의 프로퍼티 종류
(1) onreadystatechange : 서버에 서 응답이 오면 해당하는 이벤트를 처리하기 위해
이벤트 핸들러(자바스크립트로 되어진 콜백함수임)에 해당하는 콜백함수가 실행되어야 하는데
그 콜백함수명을 입력받아주는 곳이 onreadystatechange 이다.
(2) readyState : 서버에서의 응답처리를 해주는 XMLHttpRequest 객체의 진행상태값을 알려준다.
--------------------------------------------------------------------------------------------------------
readyState 의 값 의미 설명
--------------------------------------------------------------------------------------------------------
0 uninitialized XMLHttpRequest 객체만 생성되어져 있고 초기화가 안되어진 상태
(open 메소드를 호출하지 않은 상태)
1 loading open 메소드가 호출되어졌으나 send() 메소드가 호출되지 않은 상태
2 loaded send() 메소드가 호출되었으나 status 와 헤더는 도착하지 않은 상태
3 interactive 서버에서 응답 데이터가 전달되어지고 있는 진행중인 상태
4 completed 서버에서 응답 데이터가 모두 전달되어 모두 받은 상태로서 응답 데이터를 사용할 수 있는 상태.
응답데이터는 요청이 성공한 응답데이터가 일수도 있고 요청이 실패한 응답데이터 일수도 있다.
---------------------------------------------------------------------------------------------------------
(3) responseText : 서버에서의 응답을 문자열로 받을때 사용한다.
(4) responseXML : 서버에서의 응답을 XML 형태로 받을때 사용한다.
(5) responseBody : 서버에서의 응답을 이진 코드 형태로 받을때 사용한다.
(6) status : 서버로 부터 응답받는 Http 상태코드로서 숫자가 리턴된다.
-------------------------------------------------------------------------------------------------
status 의 값 의미 설명
-------------------------------------------------------------------------------------------------
200 OK 요청 성공
403 Forbidden 접근 금지
404 Not Found 페이지 없음
500 Internal Server Error 서버 error 발생
그러므로 서버로 부터 응답이 XMLHttpRequest 객체를 통해 도착되어지면 XMLHttpRequest 객체의 status 프로퍼티 값을 확인하여
요청이 성공적으로 수행되어 도착했는지 실패한 응답이 도착했는지를 먼저 확인해야 한다.
Ajax를 이용한 웹 어플리케이션 개발시 서버와 통신하여 데이터를 보내기도 하고 받기도 한다. 이때, 데이터 전송을 위한 포맷방법은 특정 프로그래밍 언어에 국한되지 않고 독립적으로 사용되도록 만들어야 좋을 것이다.
과거에는 데이터 전송을 위한 방법으로 XML을 많이 사용했다.
그런데 XML은 다소 복잡학고 어렵고, 에러가 있으면 페이지 전체가 멈춘다는 단점이 있다.
이를 보안하기 위해 등장한 데이터 전송을 위한 포맷방법이 바로 JSON 이다.
JSON은 말그대로 자바스크립트 객체 표기법이다.