Ajax isn’t a technology. It’s really several technologies, each flourishing in its own right, coming together in powerful new ways.

Ajax: A New Approach to Web Applications, Jesse James Garrett, Feb 18, 2005

43.1 Ajax(Asynchronous JavaScript and XML)란?

Ajax란 자바스크립트를 사용하여 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 웹페이지를 동적으로 갱신하는 프로그래밍 방식을 말한다.

Ajax는 서버와 통신하기 위해 브라우저에서 제공하는 Web API인 XMLHttpRequest 객체를 사용한다.

모던 자바스크립트 Deep Dive,  p.817,  그림 43-1 참조

모던 자바스크립트 Deep Dive, p.817, 그림 43-1 참조

이전의 웹페이지는 html 태그로 시작해서 html 태그로 끝나는 완전한 HTML을 서버로부터 전송받아 웹페이지 전체를 처음부터 다시 렌더링하는 방식으로 동작했다.

모던 자바스크립트 Deep Dive,  p.818,  그림 43-2 참조

모던 자바스크립트 Deep Dive, p.818, 그림 43-2 참조

2.3.1 Ajax(Asynchronous JavaScript and Xml) - 2.3.1 Ajax 에서 관련 내용을 더 살펴볼 수 있다.

CORS 에러

Ajax GET 요청 시, CORS 에러가 자주 발생한다.

개발 과정에서 CORS를 잠깐 끄고 싶을 때

  1. 헤더에 Access-Control-Allow-Origin : “*” 추가한다.
  2. CORS 정책 관련 기능을 끈다.
  3. Node.js인 경우 아래 코드를 추가한다.
/* Node.js */
var cors = require('cors');
app.use(cors());

43.2 JSON(JavaScript Object Notation)

JSON은 클라이언트와 서버 간의 HTTP 통신을 위한 텍스트 데이터 포맷이며, 언어 독립형 데이터 포맷이다.

JSON은 ES5 이전의 JavaScript 문법을 기초로 한다.

43.2.1 JSON 표기 방식

JSON은 자바스크립트의 객체 리터럴과 유사하게 키와 값으로 구성된 순수한 텍스트다.

{
	"name" : "Hardy",
	"sex" : "male",
	"age" : 25,
	"alive" : true, 
}

JSON의 키는 반드시 큰따옴표(작은따옴표 사용 불가)로 묶어야 한다.

값은 객체 리터럴과 같은 표기법을 그대로 사용할 수 있다. 단, 문자열은 반드시 작은따옴표가 아닌 큰따옴표로 묶어야 한다는 것에 유의해야 한다.

JSON = null
      or true or false
      or JSONNumber
      or JSONString
      or JSONObject
      or JSONArray

  JSONNumber = - PositiveNumber
            or PositiveNumber
  PositiveNumber = DecimalNumber
                or DecimalNumber . Digits
                or DecimalNumber . Digits ExponentPart
                or DecimalNumber ExponentPart
  DecimalNumber = 0
               or OneToNine Digits
  ExponentPart = e Exponent
              or E Exponent
  Exponent = Digits
          or + Digits
          or - Digits
  Digits = Digit
        or Digits Digit
  Digit = 0 through 9
  OneToNine = 1 through 9

  JSONString = ""
            or " StringCharacters "
  StringCharacters = StringCharacter
                  or StringCharacters StringCharacter
  StringCharacter = any character
                    except " or \\ or U+0000 through U+001F
                 or EscapeSequence
  EscapeSequence = \\" or \\/ or \\\\ or \\b or \\f or \\n or \\r or \\t
                or \\u HexDigit HexDigit HexDigit HexDigit
  HexDigit = 0 through 9
          or A through F
          or a through f

  JSONObject = { }
            or { Members }
  Members = JSONString : JSON
         or Members , JSONString : JSON

  JSONArray = [ ]
           or [ ArrayElements ]
  ArrayElements = JSON
               or ArrayElements , JSON

43.2.2 JSON.stringify

JSON.stringify 메서드는 객체(또는 배열)를 JSON 포맷의 문자열로 변환한다. 즉 값을 JSON 표기법으로 변환한다.

[JSON.stringify(value[, replacer[, space]])](<https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#매개변수>)
JSON.stringify({});                  // '{}'
JSON.stringify(true);                // 'true'
JSON.stringify('foo');               // '"foo"'
JSON.stringify([1, 'false', false]); // '[1,"false",false]'
JSON.stringify({ x: 5 });            // '{"x":5}'

JSON.stringify(new Date(2006, 0, 2, 15, 4, 5))
// '"2006-01-02T15:04:05.000Z"'

JSON.stringify({ x: 5, y: 6 });
// '{"x":5,"y":6}' or '{"y":6,"x":5}'
JSON.stringify([new Number(1), new String('false'), new Boolean(false)]);
// '[1,"false",false]'

// Symbols:
JSON.stringify({ x: undefined, y: Object, z: Symbol('') });
// '{}'
JSON.stringify({ [Symbol('foo')]: 'foo' });
// '{}'
JSON.stringify({ [Symbol.for('foo')]: 'foo' }, [Symbol.for('foo')]);
// '{}'
JSON.stringify({ [Symbol.for('foo')]: 'foo' }, function(k, v) {
  if (typeof k === 'symbol') {
    return 'a symbol';
  }
});
// '{}'

// Non-enumerable properties:
JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true } }) );
// '{"y":"y"}'

43.2.3 JSON.parse

JSON.parse 메서드는 JSON 포맷의 문자열을 객체(또는 배열)로 변환한다.

[JSON.parse(text[, reviver])](<https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#매개변수>)
JSON.parse('{}');              // {}
JSON.parse('true');            // true
JSON.parse('"foo"');           // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null');            // null

JSON.parse는 작은따옴표와 trailing commas를 허용하지 않는다는 것에 주의해야 한다.

객체 안에서의 trailing commas는 ECMAScript 5에 와서야 추가되었다.

[JS] Trailing Commas에 대한 고찰 (feat.ESLint)

43.3 XMLHttpRequest

브라우저는 주소창이나 HTML의 form 태그 또는 a 태그를 통해 HTTP 요청 전송 기능을 기본 제공한다.

만약 자바스크립트를 사용하여 HTTP 요청을 전송하려면 XMLHttpRequest 객체를 사용한다.

XMLHttpRequest 객체는 HTTP 요청 전송과 HTTP 응답 수신을 위한 다양한 메서드와 프로퍼티를 제공 하는 Web API이므로, 브라우저 환경에서만 정상적으로 실행된다.