jQuery $.ajax() 공략

황제낙엽 2011.03.27 07:40 조회 수 : 415

sitelink1  
sitelink2  
sitelink3 http://1 
extra_vars4 ko 
extra_vars5 http://grimdream.tistory.com/entry/JQuery-Ajax-1%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0 
extra_vars6 sitelink1 
[JQuery-Ajax] 1.시작하기

ajax 통신의 시작은 $.ajax() 라는 함수로 시작합니다 $.ajax()함수에는 기본적으로 한개의 인자가 들어갑니다.그 인자는 바로 json 오브젝트 형태의 ajax 객체에 대한 설정 프로퍼티 인데요일단 이에 설정 할 수 있는 프로퍼티들을 정리 해 보았습니다.

 

JQuery Ajax 프로퍼티 목록

프로퍼티명

자료형

설명

url

String

요청 url

type

String

사용한 메서드(POST/GET)

data

Object

요청에 전달되는 프로퍼티를 가진 객체

dataType

String

응답의 결과로 반환되는 데이터의 종류
(xml,html,json,jsonp,script,text)

timeout

Number

요청 제한 시간

global

Boolean

전역함수 활성/비활성

contentType

String

요청에 명시되는 컨텐츠 삽입
(
기본값:application/x-www-form-urlencoded)

success

Function

응답 성공시 핸들링 함수(인자로 응답 본문을 받는다)

error

Function

응답 실패시 핸들링 함수(XHR인스턴스,상태값,예외객체)

complete

Function

요청 완료시 호출(XHR인스턴스,상태메시지) success error 콜백 이후 실행 된다.

beforeSend

Function

요청이 전송되기에 앞서 호출되는 함수(XHR인스턴스)

async

Boolean

false이면 요청이 동기 호출로 전송(기본은 비동기 요청)

processData

Boolean

false이면 URL인코딩된 형태로 처리되어 전달된 데이터 금지(기본:application/x-www-form-urlencoded)

ifModified

Boolean

true일 때 Last-Modified헤더를 확인하여 마지막 요청 이후에 응답 콘텐츠가 변경되지 않았다면 요청 성공 생략하면 헤더 확인X

 

위에 나열 된 프로퍼티 중 기본적으로 사용 되는 프로퍼티는 url, type, data, timeout, error, success 입니다일단 이 6개의 프로퍼티만 사용해도 기본적인 비동기 통신은 무리 없이 진행 할 수 있습니다우선 예제 소스 보시죠. 

 

$(document).ready(function() {

             $.ajax({

                    url:'document.xml',

                    type:'get',

                    timeout:1000,

                    error:function(xhr,status,e){

                           alert('Error');

                    },

                    success: function(xml){

                           $(xml).find('cat').each(function(){

                                 var item_text=$(this).text();

                                 alert(item_text);

                           });

                    }

             });

 

위 소스는 document.xml 이라는 xml 파일을 읽어 들이는 간단한 소스 입니다단순히 존재하는 xml 파일을 읽어 올 뿐이라서넘겨주는 데이터도 없기 때문에 data 프로퍼티도 생략 한 형태입니다일단 전반적인 이해를 돕기 위해 대상이 되는 document.xml 파일을 살펴 보겠습니다.

 

<?xml version="1.0" encoding="UTF-8"?>

<animal>

       <cat>

             <text>사자</text>

       </cat>

       <cat>

             <text>호랑이</text>

       </cat>

</animal>

  

정말 간단하죠? -_-;; 갑자기 왜 사자와 호랑이가 생각 났는지 모르겠지만…. 여튼, document.xml 의 구조를 살펴 보면, 최상위 노드인 동물(animal) 노드에 고양이과 동물(cat) 노드가 각각 있고각 cat노드의 하위에는 이름 프로퍼티인 text 노드가 있습니다.

 

아제 다시 jquery 코드로 돌아가서 살펴 보면 $.ajax() 펑션에 다음과 같은 구조의 프로퍼티 객체가 들어가 있습니다.

1)     url ? document.xml 파일을 비동기 방식으로 읽어 올 대상으로 설정 했습니다.

2)     type - 통신 방식을 get방식으로 설정했습니다.

3)     timeout - 통신 에러시 최대 대기 시간을 1초로 설정 했습니다.

4)     error ? 에러시 처리할 콜백 함수를 정의했습니다간단히 에러 메시지를 경고창으로 띄웁니다.)

5)     success ? 통신 성공시 처리할 콜백 함수를 정의 했습니다함수 처리 내용은 밑에서 따로 분석 하겠습니다.

 

이렇게 위와 같이 5개의 프로퍼티를 설정해 주었습니다이제 해당 함수가 불리워 질 때, ajax를 통하여document.xml 파일을 읽어 오고이를 성공적으로 읽어 왔을 시, success함수를 통해 후처리를 하게 됩니다.

 

success 함수에서는 인자로 불리워진 데이터 객체를 받게 됩니다위 코드를 실행 시키면,  document.xml 파일을 읽어 들여서 jquery의 탐색 함수를 사용해서 cat 노드들을 찾은 후그 자식 노드들을 each함수를 통해 하나씩 읽어 들여 가며 해당 하는 객체의 text 속성을 읽어 그 값을 item_text라는 변수에 저장한 후, 이를 경고창으로 표시합니다.

 

실행 결과는 다음과 같습니다. 

 

M7.gif M9.gif

 

위와 같이 두개의 얼럿창이 뜨게 됩니다.

일단 이로써 첫번째 글을 마치고 다음 응답글에서는 ajax를 이용해서 데이터를 넘겨 보도록 하겠습니다.


[JQuery-Ajax] 2.객체를 이용해 값 입력하기

이번에는 jquery의 ajax를 이용해 값을 넘겨 보도록 하겠습니다.

이전 글에서 언급 했듯이, ajax로 값을 넘기기 위해서는 data 프로퍼티를 이용하면 됩니다.

 

예제 소스 코드 입니다.(풀 코드는 파일로 첨부 합니다.)

 

$(document).ready(function() {

             $("#btn").click(function(){

                    $.ajax({

                           url:'ak.jsp',

                           type:'post',

                           data:'input_id='+$('#input_id').attr('value') +

                                 '&input_name='+$('#input_name').attr('value'),

                           timeout:1000,

                           error:function(){

                                 alert('Error');

                           },

                           success:function(msg){

                                 var str=msg+"";

                                 $('input[type^=text]').attr('value','');

                                 $('#div_tab').html(str);  

                           }

                    });

             });

       });

 

jquery 코드만을 발췌한 거라, html 구조는 생략 되어 있지만, jquery의 셀렉터 부분만 보셔도 어느정도 구조를 가늠 할 수 있으리라 생각됩니다. ^^;

간략히 설명하자면 id가 각각 input_id, 그리고 input_name인 두개의 text 입력 상자가 있으며, 이들 값을 입력할 때 사용하는 버튼 객체(id="btn")가 하나 있습니다. 그리고 읽어 들여온 문서를 보여줄 div_tab이라는 아이디를 가진 div 엘리먼트가 하나 있습니다.

 

이를 구현해서 웹브라우저로 띄우면 다음과 같은 화면이 나옵니다.

 

M2.gif

 

이제 이 창의 텍스트 입력 상자에 값을 입력하고 버튼을 클릭하면 ajax의 타겟으로 지정된 ak.jsp가 불리워 지고 ak.jsp의 내용이 div_tab 안에 나타나게 될 텐데요. 우선 ak.jsp파일을 살펴 보도록 하지요.

 

<script type="text/javascript">

<%! ArrayList<String> arr = null;%>

<%

if(arr == null){

 arr = new ArrayList();

}

String input_id=request.getParameter("input_id");

String input_name=request.getParameter("input_name");

 

arr.add(input_id+"/"+input_name);

%>

$(document).ready(function() {

<%

for(String str:arr){

%>

$('#tab').append("<tr><td><%=str%></td></tr>");

<%

}

%>

});

</script>

 

주요한 부분만 발췌 했는데, 이 jsp 페이지를 구성하는 엘리먼트는 tab이라는 id를 가진 table 엘리먼트 하나 뿐입니다. ^^;

일단 jsp 구성을 살펴 보자면 선언부에서 ArrayList 객체를 선언 해 주고, 이후 request에서 각각의 파라미터를 얻어와 이를 적절히 합쳐서 ArrayList에 담은 후, ArrayList 안에 담긴 결과물을 다시 jquery를 이용해 table에 append 시켜 주어 테이블을 구성 하도록 되어 있습니다. 이렇게 구성된 html파일을 앞선 html 페이지에서 읽어 들여서 div안에 표시 하게 되는 것이죠.

 

그럼, 입력 결과를 살펴 볼까요?

 

 

M8.gif M10.gif

 

네 이렇게 입력한 내용이 추가가 되어 나타나는 것을 볼 수 있습니다.

해당 테스트 파일을 본 글에 게시 하고, 다음 응답글에서는 보다 간편화 시킨 ajax 문법을 알아 보도록 하겠습니다.


[JQuery-Ajax] 3.함수 간소화 시키기

지금까지의 예제에서 JQuery로 Ajax 통신을 처리 할 때, $.ajax()함수를 사용했고, 프로퍼티를 json object로 만들어 입력 하였습니다. 근데 이걸 간소화 시킬 수 있는 방법이 있어서 요번 글에서 소개 하고자 합니다.

 

바로 $.get() 함수와 $.post()함수, 그리고 load()함수인데요. 함수 명만 봐도 아시겠지만, $.ajax()함수에서 type 항목에 설정 했던, 통신 방식을 기준으로 메소드화 시킨 함수들입니다. $.get() 함수는 get방식의 통신을, $.post()함수는 post방식의 통신을 하며, load()함수는 파라미터가 있다면 post방식으로, 파라미터가 없다면 get방식으로 통신을 합니다.

 

 $.get()과 $.post()함수, load()함수는 $.ajax()함수와는 달리 필요한 프로퍼티들을 json 오브젝트로 받는게 아니고, 직접 인자로 입력 받습니다. 일단 말로 백번 설명하는 것 보다. 1번 항목에서 사용했던 예제를 간소화 시킨 코드와 비교해 보도록 하겠습니다.

 

$(document).ready(function() {

             $.ajax({

                    url:'document.xml',

                    type:'get',

                    timeout:1000,

                    error:function(xhr,status,e){

                           alert('Error');

                    },

                    success: function(xml){

                           $(xml).find('cat').each(function(){

                                 var item_text=$(this).text();

                                 alert(item_text);

                           });

                    }

             });

 

1번에서 사용했던 예제 소스입니다.(기억 나시죠? 사자, 호랑이) 이 소스를 간소화(통신 타입이 get방식이니 .get() 함수를 이용하면 되겠지요) 시키면 다음과 같은 소스가 됩니다.

 

 

$(document).ready(function() {

$.get('document.xml',

function(xml){

                        $(xml).find('cat').each(function(){

                          var item_text=$(this).text();

                           alert(item_text);

                        });

                 });

             });

 

정말 간단해 졌지요? 간단해진 대신, 그만큼 이것저것 빠진것도 많은데요. 위 소스와 비교 해 봤을때, timeout 항목과, error 항목이 빠졌습니다. 그것은 $.get() 함수와 $.post()함수, 그리고 load()함수가 인자로 받을 수 있는 항목들이 제한되어 있기 때문인데, 인자로 받을 수 있는 항목들은 다음과 같습니다.

 

1.url - 불러들일 문서 주소

2.data - 파라미터로 보낼 값들, json object

3.success - 콜백 함수

4.datatype - 콜백시 받아올 데이터의 형식

 

네, 확실히 함수 자체가 간소화 되는 만큼 잃는 부분도 많은것 같습니다.... 만, 뭐 꼭 필요한 경우가 아니면 $.get()과 $.post()함수, load()함수를 쓰는것 만으로도 핵심적인 기능은 대부분 소화 할 수 있을 것 같습니다.

 

한번 더 정리하는 의미에서 2번 글에서 사용한 예제를 $.post()함수를 사용해서 표현해 보겠습니다.

 

 

$(document).ready(function() {

       $("#btn").click(function (){

           $.post('ak.jsp',

                  {input_id:$("#input_id").attr('value'),

                   input_name:$("#input_name").attr('value')},

                   function(msg){

                        var str=msg+"";

                        $('input[type^=text]').attr('value','');

                        $('#div_tab').html(str);

                   });

             });

        });

 

이 코드 또한 2번 글에서 사용한 코드에 비하면 상당히 라인수가 줄어든 모습을 보여 주고 있습니다.

 

마지막으로 load() 함수는 $.post()함수나 $.get()함수와는 달리 바로 jquery 루트에서 사용 할 수 있는 함수가 아닙니다. load()함수를 사용 하기 위해서는 주체가 되는 객체가 셀렉터로 선택 되어 있어야 하는데요.

가령 예를 들어 위 첫번째 예제인 사자와 호랑이 코드를 load()함수를 사용하는 방식으로 바꾸려면

 

$(document).ready(function() {

                    $("#btn").click(function (){

                           $('#div_tab').load('ak.jsp',

                  {input_id:$("#input_id").attr('value'),

                            input_name:$("#input_name").attr('value')},

                       function(msg){

                            var str=msg+"";

                            return str;

                       });

             });

       });

 

위 코드와 같이 div_tab 엘리먼트를 .load 함수의 주체로 잡고, 콜백 함수에서 결과를 리턴 해주기만 하면 됩니다. ^^;


[JQuery-Ajax] 4.기타 프로퍼티들 1/2

이번 글에선 여태 못다뤄 본 나머지 프로퍼티들에 대해서 다루어 볼 까 합니다.

 일단첫번째 글에서 쭉 나열했던 프로퍼티들을 좀 볼까요?

 

JQuery Ajax 프로퍼티 목록

프로퍼티명

자료형

설명

url

String

요청 url

type

String

사용한 메서드(POST/GET)

data

Object

요청에 전달되는 프로퍼티를 가진 객체

dataType

String

응답의 결과로 반환되는 데이터의 종류
(xml,html,json,jsonp,script,text)

timeout

Number

요청 제한 시간

global

Boolean

전역함수 활성/비활성

contentType

String

요청에 명시되는 컨텐츠 삽입
(기본값:application/x-www-form-urlencoded)

success

Function

응답 성공시 핸들링 함수(인자로 응답 본문을 받는다)

error

Function

응답 실패시 핸들링 함수(XHR인스턴스,상태값,예외객체)

complete

Function

요청 완료시 호출(XHR인스턴스,상태메시지) success error 콜백 이후 실행 된다.

beforeSend

Function

요청이 전송되기에 앞서 호출되는 함수(XHR인스턴스)

async

Boolean

false이면 요청이 동기 호출로 전송(기본은 비동기 요청)

processData

Boolean

false이면 URL인코딩된 형태로 처리되어 전달된 데이터 금지(기본:application/x-www-form-urlencoded)

ifModified

Boolean

true일 때 Last-Modified헤더를 확인하여 마지막 요청 이후에 응답 콘텐츠가 변경되지 않았다면 요청 성공 생략하면 헤더 확인X

 

현재까지 예제에서 한번이라도 다루어 본 프로퍼티는 분홍색으로 색을 입혀 보았습니다. ^^;

이렇게 해 놓고 보니 총 8개의 프로퍼티가 남았네요.

일단 위에서 부터 알아 볼까요?

 

1.dataType

 

dataType 프로퍼티는 ajax를 통해 받아올 데이터의 형식을 설정 해주는 항목이며이 부분을 잘못 설정할시, ajax함수는

error를 표시하게 됩니다.

xml html,text는 따로 다루어 보지 않아도 될것 같습니다만... json, jsonp, script 요 세녀석이 문제네요.

요 세녀석들을 어떻게 받아 올까요?

일단 json json 문법에 맞춘 문서를 읽어 옵니다 예제 코드를 볼까요?

 

$(document).ready(function() {

             $("#btn").click(function(){

                    $.ajax({

                           url:'test.js',

                           type:'post',

                           dataType:'json',

                           error:function(){

                                 alert('Error');

                           },

                           success:function(obj){

                                 alert(obj[0].name+"n"+obj[0].tel);

                           }

                    });

             });

       });

 

간단하게 작성해 봤습니다그럼 이어서 타겟이 되는 test.js 파일을 보시죠

 

[

       {

                    "name":"마음정보",

                    "tel":"02-780-0362"

       }

]

 

.. 일단 테스트용으로 간단하게 만든거라 별 내용은 없습니다. ^^;

 

이 두개의 파일을 두고 테스트를 하면.. 네 그렇죠마음정보전화번호가 적힌 경고창이 뜨겠죠.

뭐 이 이상 넘어가는건 의미가 없을 듯 하니 다음 항목으로 빠르게 넘어가죠.

 

jsonp입니다~!

jsonp는 기본적으로 위에서 설명한 json과 용법이 비슷하지만, 단 한가지, 크로스도메인을 지원한다는데 있습니다. 다른 도메인에 있는 json파일을 가져 오는것이 가능 하다는 거죠.

(그냥 json은 다른 도메인의 json 데이터를 가져오는것이 제한 되어 있습니다.)

jsonp를 사용 하기 이ㅜ해서는 가져올 경로의 url 뒷부분에 "?callback=?" 프로퍼티를 추가하면 된다는데... 테스트를 해보았으나 정상적인 결과를 얻을 수 없었기에 일단 넘어가도록 하겠습니다.

 

다음은  script입니다.

ajax 함수의 데이터 타입을 script로 설정하고 특정 경로의 js파일을 읽어 들이면 이  js파일의 스크립트를 그대로 구현 시키고, 해당 스크립트의 text 형태를 리턴 합니다.

간단히 예제를 보시죠

 

$(document).ready(function() {

             $("#btn").click(function(){

                    $.ajax({

                           url:'http://211.240.107.49:8080/jqueryajax/test.js',

                           type:'post',

                           timeout:1000,

                           dataType:'script',

                           error:function(){

                                 alert('Error');

                           },

                           success:function(obj){

                                 alert('success');

                                 alert(obj);

                                 testFunc();

                           }

                    });

             });

       });

 

위 소스와 비교해서 달라진 점은 데이터 타입이 script라는점, 그리고 success함수에서 리턴 받은 결과를 alert으로 출력하는점, 그리고 추가로 testFunc()라는 함수를 호출 하는 점입니다. 그러면 이 난데 없는 testFunc()함수는 어디에서 부터 불리워 지는 걸까요?

 

 

function testFunc(){

       alert('aaa');

}

 

호출 대상인 test.js의 파일 내용입니다. 단순히 testFunc()라는 함수 하나만 코딩 되어 있습니다. jquery가 test.js파일을 읽어 들여오며 evaluation까지 동시에 이루어 지므로, 따로 eval()함수등을 사용 하지 않아도 읽어들인 js 파일의 스크립트가 자동으로 본래의페이지에 구현 되는 것입니다. 이 때, 만약 불러들여오는 js파일의 함수, 혹은 변수와 본래 페이지에 있는 함수, 혹은 변수의 이름이 같다면, 불러들여오는 js파일의 것으로 오버라이딩 되니 주의 하셔야 할듯 합니다.

 

2.global

 

Boolean 타입의 파라미터인 global은 전역함수 활성화여부를 설정하기 위한 항목입니다. 기본값은 true로 되어 있으며 true일 경우 ajaxStart(), ajaxStop()등의 함수를 사용 할 수 있습니다. 예제를 보도록 하겠습니다.

 

$(document).ready(function() {

             $("#btn").click(function(){

                    testFunc();

                    $.ajax({

                           url:'http://211.240.107.49:8080/jqueryajax/test.js',

                           type:'post',

                           timeout:1000,

                           dataType:'script',

                           global:false,

                           error:function(req,txt){

                                 alert('Error'+req.status);

                           },

                           success:function(obj){

                                 alert('success');

                                 alert(obj);

                           }

                    });

             })

             .ajaxStart(function (){

                    $("#btn").attr("value","로딩중");

             })

             .ajaxStop(function (){

                    $("#btn").attr("value","로딩끝");

             })

       });

 

네 중간에 global 프로퍼티를 추가하고 밑에 ajaxStart와 ajaxStop 이벤트 핸들러를 달았습니다.

 

이 코드에서 global 프로퍼티의 값을 true로 주고 버튼을 클릭하면, ajax 로딩이 시작되며 버튼의 label 값이 로딩중으로 바뀌고, 로딩이 끝나면 label이 로딩끝으로 바뀌는 걸 볼수 있으나, global프로퍼티의 값을 false로 주고 버튼을 클릭하면 버튼의 label에 아무 변화도 생기지 않는것을 볼 수 있습니다.

 

3.contentType

 

이 프로퍼티는 서버로 보내어지는 데이터의 타입을 정의 합니다. 기본값은 "application/x-wwwform-urlencoded" 인데, 이는 URL인코딩이라고 부릅니다. 만약 전송할 데이터가 이미지나 파일등의 바이너리 형식의 데이터인경우, "multipart/form" 이라는 값을 설정 하면 됩니다.

  

4.complete, beforeSend

 

이 프로퍼티들은 ajax통신 시작전, 후에 불리워질 함수를 설정 합니다. 간단히 테스트 해보자면

 

$(document).ready(function() {

             $("#btn").click(function(){

                    $.ajax({

                           url:'http://211.240.107.49:8080/jqueryajax/test.js',

                           type:'post',

                           dataType:'script',

                           error:function(req,txt){

                                 alert('Error');

                           },

                           success:function(obj){

                                 alert('success');

                           },

                           beforeSend:function(){

                                 alert('start');

                           },

                           complete:function(){

                                 alert('complete');

                           }

                    });

             })

       });

 

위 코드를 실행 했을 경우, 에러가 없다면 start-success-complete의 순으로, 에러가 있다면 start-Error-complete 순으로 얼럿창이 뜨는 것을 볼 수 있습니다.

 

이제 async,processData,ifModified 세개의 프로퍼티가 남았는데, 글이 너무 길어지는 관계로 여기서 일단 끊고 다음그레서 계속 이어 나가도록 하겠습니다. ^^


[JQuery-Ajax] 5.기타 프로퍼티들 2/2

네, 이 바로 윗글에 이어서 바로 가겠습니다. 일단 중간 점검부터...

JQuery Ajax 프로퍼티 목록

프로퍼티명

자료형

설명

url

String

요청 url

type

String

사용한 메서드(POST/GET)

data

Object

요청에 전달되는 프로퍼티를 가진 객체

dataType

String

응답의 결과로 반환되는 데이터의 종류
(xml,html,json,jsonp,script,text)

timeout

Number

요청 제한 시간

global

Boolean

전역함수 활성/비활성

contentType

String

요청에 명시되는 컨텐츠 삽입
(기본값:application/x-www-form-urlencoded)

success

Function

응답 성공시 핸들링 함수(인자로 응답 본문을 받는다)

error

Function

응답 실패시 핸들링 함수(XHR인스턴스,상태값,예외객체)

complete

Function

요청 완료시 호출(XHR인스턴스,상태메시지) success와 error 콜백 이후 실행 된다.

beforeSend

Function

요청이 전송되기에 앞서 호출되는 함수(XHR인스턴스)

async

Boolean

false이면 요청이 동기 호출로 전송(기본은 비동기 요청)

processData

Boolean

false이면 URL인코딩된 형태로 처리되어 전달된 데이터 금지(기본:application/x-www-form-urlencoded)

ifModified

Boolean

true일 때 Last-Modified헤더를 확인하여 마지막 요청 이후에 응답 콘텐츠가 변경되지 않았다면 요청 성공 생략하면 헤더 확인X

 

1.async - 비동기 통신 여부

 

기본값은 true이며, false로 하면 요청이 동기 호출로 전송... 된다네요. ajax는 비동기 방식이라, 내가 보낸 요청이 처리 되는것과, 다른 페이지 구성 요소의 처리가 각각 개별적으로 이루어 지는데, async 프로퍼티는 false로 하면 해당 ajax 요청이 완료 되기 전까지는 브라우저 자체가 블록 되버린다고 합니다. 이 부분에 대해서 테스트 해보았는데... 다소 단순 무식한 방법이긴 했지만... 어느정도 결과는 얻어 낼 수 있었습니다. ㅡㅡ;

 

$(document).ready(function() {

             $("#btn").click(function(){

                    $.ajax({

                           url:'http://211.240.107.49:8080/jqueryajax/test.jsp',

                           type:'post',

                           dataType:'json',

                           async:true,

                           success:function(obj){

                                 alert("통신 종료");

                           },

                    });

             });

             $("#btn2").click(function(){

                    alert("지금은 통신중이 아닙니다.");

             });

       });

 

네, 일단 ajax쪽 함수를 위와 같이 셋팅 해주고, 별도의 버튼 엘리먼트를 한개 더 만들어서, 클릭하면 alert창이 뜨게끔 했습니다.

 

그리고 타겟이 되는 test.jsp 파일을 다음과 같이 코딩 하였습니다.

 

[

<%

final double LIMIT = 200000.0d;

for(double i = 0.0d; i< LIMIT; i++){

       String s = "{name:"name"}";

       if(i<(LIMIT - 1.0d)){

             s+=",";

       }

 out.print(s);     

}

%>

]

 

길이가 20만개인 json배열을 만든것이죠... 네...

무튼 이렇게 해서 async 항목을 바꿔가면서 테스트를 해 보았습니다. 테스트 방법은 간단 합니다.

ajax 통신 시작 버튼을 눌러서 20만개의 데이터를 가져오는동안, 두번째 버튼을 클릭해서 "지금은 통신중이 아닙니다." 라는 얼럿창이 뜨는지 안뜨는지 보는거죠. 결과는 당연하세도, async 항목이 true일땐 얼럿창이 나타났지만, async항목이 false일때는 success 콜백함수에서 띄우는 메시지인 "통신 종료"가 뜨기 전엔 두번째 버튼으로 인한 얼럿창은 볼 수 없었습니다. 정말 단순 무식한 테스트였지만, 테스트 결과를 얻어 냈다는데 의의를 두어야겠습니다. ^^;

 

2.processData

 

기본값은 true입니다. 이 항목이 true일때 보내는 data의 형식을 query string 형태로 보내게 됩니다. 만약 query String 형태고 보내지 않고자 하면 이 값을 false로 주면 됩니다.

 

3.ifModified

 

기본값은 false입니다. 이 값을 true로 하면 기존에 가져온 결과와 새로 가져온 결과가 다를때만 요청을 처리합니다.

 

$(document).ready(function() {

             $("#btn").click(function(){

                    $.ajax({

                           url:'http://211.240.107.49:8080/jqueryajax/test.js',

                           type:'get',

                           dataType:'json',

                           ifModified:true,                       

                           success:function(obj){

                                 alert(obj.length+"");

                           }

                    });

             });

       });

 

위와 같이 소스를 구성하였습니다. test.js 파일의 소스는 다음과 같습니다.

 

[

 {

        name:"김구라",

        age:41

 }

 ]

 

 이 상태에서 위 페이지를 열어 통신요청을 하면, ifModifide 속성이 true로 되어 있을땐 처음 데이터를 가져올때 success 콜백 함수의 alert창이 뜨지만, 계속해서 통신 요청을 해도 test.js파일에 변화가 없으니 더이상 success 콜백 함수가 실행되지않습니다.

 

M6.gif M11.gif 

첫 시도시                                                      두번째 이후

  

이 상태에서 그대로 test.js 파일만 편집을 해 보았습니다.

 

[

 {

        name:"김구라",

        age:41

 },

 {

        name:"이경규",

        age:49

 }

]

 

위와 같이 test.js파일을 변경 하고 (새로고침 없이) 다시 원래의 페이지에서 버튼을 누르면 다시한번 success 함수가 발동 되지만, 다시 두번째 이후로는 클릭해도 아무 반응이 없는 것을 알 수 있습니다.

 

M4.gif M3.gif

test.js파일 편집후 첫 시도시                            두번째 이후

 

 

다시 ifModified 속성을 false로 하고 요청 버튼을 클릭하면, test.js파일이 변화가 없더라도 계속해서 success함수가 발동 되는 것을 볼 수 있습니다.


[JQuery-Ajax] 6.추가 간소화 이벤트

지금까지 $.ajax()와 통신 메쏘드에 따른 간소화 함수인 $.get(), $.post(), 그리고 load()에 대해서 알아 봤습니다.

이제 마지막으로. 데이터 타입에 따른 추가 간소화 함수를 알아 볼까 합니다.

 

1.$.getJSON()

 

$.getJSON()함수는 이름 그대로, JSON타입의 데이터를 얻어 올 때 사용 할 수 있는 함수 입니다.

지금부터 알아볼 함수들은 모두 $.get()...함수와 비슷한 형태를 취하고 있는데요. 바로 함수에 들어가는 인자들의 구성입니다.

예제를 한번 볼까요?

 

$(document).ready(function(){

       $.getJSON('test.js'function(data){

             $(data).each(function(){

                    alert(this.name);

             });

       });

});

 

아... 정말 심플합니다. 네. 민망할 정도로 심플 하네요.

보시다시피 $.getJSON() 함수는 $.get() 함수와 마찬가지로 가져올 URL과 콜백 함수를 인자로 넣으면 작동하는 간단한 함수입니다.

이 코드에서 가지고 오는 test.js 파일은 이전 예제에서도 사용 했던 파일로 다음과 같은 구성인데요.

[

 {

        name:"김구라",

        age:41

 },

 {

        name:"이경규",

        age:49

 }

 ]

 

이 파일을 읽어 들여온 후, 콜백 함수에서 each문으로 돌려서 이름을 얼럿창으로 표시 해 주겠지요?

 

더이상 설명 할 것이 없을 정도로 간단합니다.

다음에 설명할 함수도 마찬가지 일텐데 몸둘바를 모르겠네요.

 

2.$.getScript()

 

 이 함수도 딱 이름만 보면 감이 오실껍니다. $.ajax() 함수에서 dataType프로퍼티를 "script" 로 주었을때와 마찬가지겠지요.

 

$(document).ready(function(){

       $.getScript('test2.js'function(code){

             alert(code);

             alertTest();

       });

});

 

 역시 초 간단한 예제네요. 역시나 getJSon 함수와 마찬가지로 불러올 URL과 콜백 함수를 함수의 인자로 정의 해 주고 있습니다. 이 함수 역시 $.ajax()의 script 데이터 타입과 마찬가지라면 불러들여온 js파일의 코드evaluation시키고 텍스트타입으로 리턴하겠지요.

 

테스트용으로 쓰인 test2.js파일입니다

 

function alertTest(){

       alert('Im here!!');

}

 

그럼 모두가 예상하고 있는 결과를 확인 사살 해 보도록 하지요.

 

M1.gif

 

네, 역시나 우리의 예상은 맞았습니다. 불러들여온 자바스크립트 코드의 구현과 텍스트 타입으로의 리턴, 이 또한 $.ajax()함수를 썼을때와 다름이 없네요.

 

이렇듯, 여태까지 JQuery에서 ajax를 사용하는 법을 알아 봤습니다.