Ajax : Asynchronous JavaScript and XML

  • 프레임워크나 언어를 지칭하는 것이 아닌, 대화식 웹 어플리케이션 제작 기법을 의미
  • 페이지 전환 없이 JS단에서 서버에 데이터를 요청하는 것이 Ajax
  • Ajax 예?
    • 자동완성 기능.
    • 페이스북. 페이지 이동을 하지 않고 데이터를 불러오고, 댓글이 새로고침되니까
  • F12의 Network탭을 보면 주고받는 데이터를 확인할 수 있음

 

JSON ( JavaScript Object Notation )

자바스크립트에서 사용하는 객체 형태로 데이터를 표시하는 형식이다.

json data는 ``js eval()``을 이용해 바로 js 객체로 만들 수 있다.

(``$.extend``를 사용해도 가능할 것 같다.)

```js

let json = eval('(' + data + ')');

```

``data``가 배열일 경우 문제가 발생하는 것을 방지하기 위해 ``()``로 감싸준다.

 

```js

let json = JSON.parse(data)

```

그러나 서버가 JSON을 이상한 형식으로 만들어 보내는 경우, 또 서버가 프록시 역할을 하여 단순 포워딩하는 경우가 있을 수 있기 때문에 ``eval()``을 사용하는 것 보다는 ``js JSON.parse()`` 메소드를 사용하는 것이 좋다.

 

XMLHttpRequest

Ajax로 데이터를 주고 받을 때는 ``XMLHttpRequest`` 객체를 사용한다.

Ajax는 보통 jQuery 또는 axios(react)를 사용해서 처리하게 되는데, 내부 native js에서는 이런 식으로 동작한다. 

```js

var request = new XMLHttpRequest();

//request.open(HTTP method, data path, sync);

request.open('GET', '/data.html', false);

request.send();

alert(request.responseText);

```

 

위는 동기 방식이고, 비동기 방식으로 구성하면 이렇게 된다.

```js

var request = new XMLHttpRequest();

request.onreadystagechange = function (event) {

if (request.readyState == 4){

if (request.status == 200) {

alert(request.responseText);

}

}

}

request.open('GET', '/data.html', ture);

request.send();

```

 

``onreadystagechange`` 이벤트는 ``XMLHttpRequest``의 상태가 변경될 때 마다 이벤트를 호출하기 때문에, 이벤트 리스너를 연결하는 방식으로 처리할 수 있다.

``readyState``는 데이터 수신 상태를 나타낸다. `` readyState == 4``는 모든 데이터를 수신했음을 의미한다.

HTTP Status Code는 ``status``에 저장된다. `` request.status == 200``으로 검사하면 응답이 200일 때만 처리할 수 있다.

 

 

jQuery Ajax

``js $.ajax([url,] options)``

호출하면 알아서 ``XMLHttpRequest`` 객체를 만들고 Ajax를 수행한다. url은 따로 첫번째 인자로 넣어도 되고, ``options``에 속성으로 지정해도 된다.

```js

$.ajax({

url: '/data.html',

success: function (data) {

alert(data);

}

});

```

 

Ajax Event 종류(success, error, complete, ...)

 

Shorthand Method는 다음 세 가지. ``js $.get(), $.post(), $.getJSON()`` 

 

다른 사이트로의 Ajax는 Same-origin Policy 때문에 금지

 

WebSocket과 Socket.io

 

'JS Stack > Front-end' 카테고리의 다른 글

HTML5 data-* attribute  (0) 2018.11.23
[HTML] form tag, input 태그 속성  (0) 2017.06.10
CSS Selector  (0) 2017.05.24
CSS 팁과 기본 지식  (0) 2017.05.03
[HTML, JS] refresh / redirect  (0) 2017.04.29