JQuery〃에이작스(AJAX) 동작원리, 설정, 비동기 요청함수

반응형


Asynchronous JavaScript And XML의 약자인 에이작스는 번역하면 비동기적 자바스크립트와 XML의 뜻을 가지고 있습니다. 새로운 언어는 아니고 기존에 사용하고 있는 HTML, CSS, JavaScript, XML등의 언어를 편리하게 사용하기 위해 만들어진 기술이라 생각하면 될 것 같아요.


에이작스를 사용하게 된 이유는 웹브라우저와 서버의 데이타 전송을 조각방식으로 나눠 전체 페이지를 리로드하지 않아도 되지 않아도 되는 유용성 때문인데요. 그 이유는 기존 XML이 데이타를 교환할때 전체 페이지를 모두 전송했기에 대역폭 낭비가 심했기 때문입니다. 




AJAX의 동작구조



1. 웹 브라우저의 인터페이스에서 자바스크립트 함수를 호출시킵니다.

2. XMLHttpRequest 객체의 인스턴스를 생성시킵니다.

3. HTML의 상태를 가지고 있는 XML을 서버로 전송합니다.

4. 서버에서 전송된 요청을 자체 처리 후 다시 웹브라우저로 재전송합니다.

5. XML의 데이타를 받은 XMLHttpRequest 객체는 HTML의 상태를 포함시켜 인터페이스로 전송하여 업데이트 합니다.

 




 AJAX 환경 셋팅


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
             function createXMLHttpRequest(){
 
                    var xmlHttp;
                  
                    if(window.ActiveXObject){
                                 try{                                
                                              xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                                 } catch(e){
                                        try{
                                              xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                                        } catch(e1){
                                              xmlHttp = null;
                                        }
                                 }
                    } else if(window.XMLHttpRequest){
                           try{                       
                                        xmlHttp = new XMLHttpRequest();
                           } catch(e){
                                        xmlHttp = null;
                           }
                    }
                           
 
                    if(xmlHttp == null) errorMessage();
                    return xmlHttp;
             }
 
       
 
             function errorMessage(){
                    alert("에러가 났어요");
             }       


▲ createXMLHttpRequest.js 소스코드

위 소스코드는 이번 게시판 만들기 프로젝트에 사용하기 위해 만들었던 AJAX 기본 셋팅 코드입니다. HTML파일에 작성해도 무관하지만 이렇게 따로 자바스크립트 파일을 만들어 HTML파일 HEAD영역에 <script language="javascript" type="text/javascript" src="js/createXMLHttpRequest.js"></script> 이렇게 선언만 해주면 간단하게 사용할 수 있어 저는 이 방법을 씁니다.


▼ 설명

var xmlHttp;  → XMLHttpRequest 객체를 담기 위해 만들어줍니다.

if(window.ActiveXObject){  ~~  [14번째줄] }  → 만약에 브라우저가 ActiveX를 지원하면 객체를 생성

                                                          ( 익스플로러 버전 5~10까지 )

else if(window.XMLHttpRequest){  ~~  [21번째줄] }  → XMLHttpRequest를 지원한다면 객체 생성

                                                        익스플로러 버전 11이상, 크롬, 사파리, 파이어폭스 등등 )

아래에 있는 나머지 [24~32번째줄]은 xmlHttp가 null값이면 에러메시지 알람을 띄운다는 코드입니다. 






 비동기 요청 함수


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    var xmlHttp;
 
    var xmlDoc;
 
    var message;
 
    function contentprev(seq) {
 
        var url = "boardAjax.action?seq=" + seq; //미리보기 서블릿 호출
 
        xmlHttp = createXMLHttpRequest();
 
        xmlHttp.onreadystatechange = handleStateChange;
 
        xmlHttp.open("get", url, true);
 
        xmlHttp.send(null);
 
    }
 
    function handleStateChange() {
 
        if (xmlHttp.readyState == 4) {
            if (xmlHttp.status == 200) {
                xmlDoc = xmlHttp.responseText;
                document.getElementById("layer1").innerHTML = xmlDoc;
            }
 
        }
 
    }


▲ 게시판 만들기 프로젝트 중 Board_List.jsp에서 AJAX 부분 코드


마찬가지로 쉬운 정리를 위해 게시판 만들기에 사용했던 코드르 가져왔습니다. 위에서 환경 셋팅을 해줬다면 다음 function을 이용해 비동기 요청을 하기 위한 함수를 선언해야 합니다.


function contentprev(seq) {

var url = "boardAjax.action?seq=" + seq;  

  seq를 통해 본문을 미리보기 위해 함수를 만들고 AJAX 컨트롤러로 보내기 위한 URL을 작성합니다.



xmlHttp = createXMLHttpRequest();

 XMLHttpRequest 객체를 담기 위해 만들어 주고


xmlHttp.onreadystatechange = handleStateChange; 

 웹브라우저에서 서버로 보낸 데이타가 재전송 오게되면 onreadystatechange 이벤트가 발생하게 됩니다. 일단 여기서는 [21번째줄]에 있는 handleStateChange를 담겠네요.


xmlHttp.open("get", url, true);

xmlHttp.send(null);

 서버로 요청을 보내는 코드로 xmlHttp.open(메소드, URL, 비동기 사용유무)로 작성합니다. 저는 GET방식에 URL로 AJAX컨트롤러에 보내고, 비동기를 사용했습니다. 비동기를 사용하게 되면 서버의 응답을 기다리지 않고 스크립트를 일단 실행 시키고 나중에 응답준비가 되면 그 응답을 처리합니다. 



다음은  handleStateChange 에 대한 설명입니다.

if (xmlHttp.readyState == 4) {

if (xmlHttp.status == 200) {

 readyState는 요청에 대한 상태로 각 숫자마다 기능이 담겨있습니다. 

0번 → 요청이 초기화 되지 않은 상태  //  1번 → 서버와 연결이 됨  //  2번 → 요청이 수신됨  //  3번→ 요청을 처리중인 상태  //  4번 → 요청처리가 종료되어 응답이 준비된 상태 

또한 status == 200 은 HTTP status 코드로 숫자마다 기능이 담겨있습니다. 

100번 → 전송이 계속된다  //  200번 → 에러없이 전송 성공  //  201번 → 요청이 충족되었고 새로운 자원을 만들었다.  //  302번 → 요청된 페이지는 새로운 임시 URL에 전송  

등등 http://www.w3schools.com/tags/ref_httpmessages.asp 추가로 링크를 통해 다양한 코드상태를 알 수 있습니다. 즉 제가 사용한 코드는 " 요청처리가 종료되어 응답이 준비되어 있는 상태에서 에러없이 전송을 성공한다면 " 이란 조건을 건 것이죠.


xmlDoc = xmlHttp.responseText;

document.getElementById("layer1").innerHTML = xmlDoc;

 위의 조건일때 텍스트 형식의 응답을 받아와 재전송된 HTML상태를 업데이트합니다. 여기서 layer1은 제가 Board_list.jsp에 정의해 놓은 스타일 태그이름입니다. 여기서는 따로 명시하지 않았지만 본문 미리보기에 해당하는 CSS 코드가 요청을 받을때마다 전체페이지를 리로드 하지 않고, 그 부분만 리로드 되는것이죠.




일단 여기까지가 AJAX의 기초에 해당하는 이론이네요. 저도 좀더 자세히 공부해야겠지만 일단 게시판 만들기 프로젝트에 사용했던 AJAX 환경설정과 비동기 요청함수로 본문 미리보기를 활성화 한 것까지 정리를 했기 때문에 그 부분에 대해서는 열심히 정리해봤습니다. 

반응형