서버 측 스크립트와 프로그램에서 JSON으로 응답하기

developerWorks
문서 옵션
수평출력으로 설정

이 페이지 출력

이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기

영어원문

영어원문


제안 및 의견
피드백

난이도 : 고급

Brett McLaughlin, Author and Editor, O'Reilly Media Inc.

2007 년 10 월 09 일

지난 기술자료에 서는 JavaScript의 객체를 JSON으로 변환하는 방법을 배웠습니다. 이 포맷은 객체들 또는 객체 어레이들로 매핑하는 데이터를 보내는데(그리고 받는데) 사용할 수 있습니다. 본 시리즈 마지막 기술자료에서는, JSON 포맷으로 서버에 보내진 데이터를 핸들하는 방법과, 같은 포맷을 사용하여 스크립트에 응답하는 방법을 설명합니다.

JSON의 실질적 가치

소셜 북마크
mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

본 시리즈의 이전 기술자료에 서 언급된 것처럼, JSON은 Ajax 애플리케이션을 위한 유용한 포맷으로서 JavaScript 객체와 스트링 값 사이를 빠르게 변환할 수 있게 해준다. Ajax 애플리케이션들은 플레인 텍스트를 서버 측 프로그램으로 보내고 받는데 가장 알맞고, 텍스트를 생성하는 API는 텍스트를 생성하지 않는 API를 통해서 이루어진다. JSON은 네이티브 JavaScript 객체들과 함께 작동할 수 있도록 해주며, 이러한 객체들이 표현되는 방식에 대해서는 걱정하지 않는다.

developerWorks Ajax 리소스 센터
Ajax 리소스 센터는 Ajax 프로그래밍 모델 관련 튜토리얼, 디스커션 포럼, 블로그, wiki, 이벤트, 뉴스 등을 제공하고 있습니다. Ajax에 관한 모든 것이 집대성 되어 있습니다.

XML 은 똑같은 텍스트 효과를 제공하지만, JavaScript 객체를 XML로 변환하는 API는 JSON API만큼 성숙하지 못했다. JavaScript 객체를 생성하여 여러분이 선택했던 XML 변환 API로 실행될 수 있는지를 확인해야 한다. JSON은 다르다. 매우 인지 가능한 객체 유형을 핸들하고 훌륭한 JSON 데이터 표현을 제공한다.

JSON의 가장 큰 가치는 JavaScript가 데이터-포맷 언어로서가 아닌 JavaScript로서 역할을 할 수 있다는 점이다. JavaScript 객체를 사용하면서 배운 모든 것을 코드에 적용할 수 있고, 이러한 객체들이 텍스트로 변환되는 방식에 대해서는 걱정할 필요가 없다. 이제 간단한 JSON 메소드 호출을 해보자.

String myObjectInJSON = myObject.toJSONString();

이제 여러분은 결과 텍스트를 서버에 보낼 준비가 되었다.




위로


JSON을 서버로 보내기

JSON 을 서버로 보내는 것은 특별히 어려운 것은 아니지만, 중요한 문제이고 몇 가지 선택권이 있다. 하지만, 일단 JSON을 사용하기로 결정했다면, 선택은 훨씬 단순하고 제한되어 있다. 따라서 이 부분에 대해 크게 염려할 필요가 없다. 최소한, JSON 스트링을 서버에 가능한 빠르고 간단하게 보내기만 하면 된다.

GET을 통해 이름/값 쌍으로 JSON 보내기

JSON 데이터를 서버로 보내는 가장 쉬운 방법은 이것을 텍스트로 변환하고, 이름/값 쌍의 값으로 보내는 것이다. JSON으로 포맷된 데이터는 하나의 긴 객체일 뿐이며, Listing 1처럼 보인다.


Listing 1. JSON 포맷으로 된 JavaScript 객체
                
var people =  { "programmers": [    { "firstName": "Brett", "lastName":"McLaughlin",
"email": "brett@newInstance.com" },    { "firstName": "Jason", "lastName":"Hunter",
"email": "jason@servlets.com" },    { "firstName": "Elliotte", "lastName":"Harold",
"email": "elharo@macfaq.com" }   ],  "authors": [    { "firstName": "Isaac", 
"lastName": "Asimov", "genre": "science fiction" },    { "firstName": "Tad", 
"lastName": "Williams", "genre": "fantasy" },    { "firstName": "Frank", 
"lastName": "Peretti", "genre": "christian fiction" }   ],  "musicians": [    
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },   
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }   ]  }

이것을 이름/값 쌍으로서 서버 측 스크립트로 보낼 수 있다.

var url = "organizePeople.php?people=" + people.toJSONString();
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = updatePage;
xmlHttp.send(null);

잘 되는 것처럼 보이지만, 한 가지 문제가 있다. 웹 브라우저가 인터프리팅을 시도할 수도 있는 공간과 모든 종류의 문자들이 JSON 데이터에 생겼다. 이러한 문자들이 서버에서(또는 데이터를 서버로 전송할 때) 혼란을 일으키지 못하게 하려면, JavaScript escape() 함수를 추가한다.

var url = "organizePeople.php?people=" + escape(
people.toJSONString()
);
request.open("GET", url, true);
request.onreadystatechange = updatePage;
request.send(null);

이 함수는 공백, 사선(slash) 등을 처리하고, 이것들을 안전한 문자로 변환한다. (예를 들면, 공백은 %20으로 변환되어, 브라우저는 이것을 공백으로 취급하지 않고, 변경되지 않은 채로 서버로 전달한다. 그리고 나면, 서버는 (일반적으로 자동으로) 이것을 전송 후에 다시 변환한다.

이러한 방식의 단점은 두 가지이다.

  • GET 요청을 사용하여 많은 데이터 청크를 보내는데, 이는 URL 스트링에 길이 제한을 갖고 있다. 이것은 허용되는 길이이지만, 객체의 JSON 스트링 표현의 길이는 가늠할 수 없다. 특히 매우 복잡한 객체를 사용할 때는 더욱 알 수가 없다.
  • 텍스트로서 네트워크를 통해서 모든 데이터를 보낼 때, 이는 매우 불안한 상태로 데이터를 보내는 것이다.

간 단히 말해서, 이러한 문제들은 JSON 데이터와 구체적으로 관련이 있다기 보다는 GET 요청의 제한 요소라고 볼 수 있다. 하지만, 사용자의 이름과 성 이외의 것을 보낼 때 큰 문제가 된다. 원격으로 확인이 되었거나, 매우 긴 경우를 다룰 경우에는 POST를 고려해 볼 수 있다.

JSON 데이터의 포스팅(POST)

JSON 데이터를 서버로 보낼 때 POST 요청을 사용하기로 결정했다면, 코드를 크게 변경할 필요가 없다. 다음을 보자.

var url = "organizePeople.php?timeStamp=" + new Date().getTime();
request.open("POST", url, true);
request.onreadystatechange = updatePage;
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send(people.toJSONString());

이 코드 대부분이 POST 요청을 보내는데 초점을 맞추었던 " Ajax 마스터하기, Part 3: Ajax의 고급 요청과 응답"에서 보았던 것이다. 요청은 GET 대신 POST를 사용하여 열리고, Content-Type 헤더는 서버가 어떤 종류의 데이터를 기대하는지 알 수 있도록 설정된다. 이 경우, application/x-www-form-urlencoded인데, 이것은 서버가 텍스트를 통해 보낸 것이 일반 HTML 폼에서 온 것처럼 알도록 한다.

한 가지 주지할 점은 URL에 현재 시간을 붙였다는 점이다. 이로써 요청이 처음 보내진 후에 캐싱되지 않고, 메소드가 호출될 때마다 재생성 및 재전송 된다는 것이 확실해 진다. 이 URL은 변화하는 타임 스탬프 때문에 미묘하게 다르다. 이것은 스크립트로 POST 하는 것이 반복적으로 새로운 요청을 매번 생성하고 웹 브라우저는 서버에서 응답을 시도하고 저장하지 않는다.

JSON은 텍스트일 뿐이다!

GET 또는 POST를 사용하든지 간에, 중요한 것은 JSON은 단순한 텍스트 데이터일 뿐이라는 점이다. 특별한 인코딩을 필요로 하지 않으므로 쉽게 조작할 수 있고 서버로 보낼 수 있고, 모든 서버 측 스크립트는 텍스트 데이터를 처리할 수 있다. JSON이 바이너리 포맷이거나 이상한 텍스트 인코딩을 갖고 있다면, 상황은 달라졌을 것이다. 다행히도, JSON은 일반적인 텍스트 데이터이다. POST 섹션과 Content-Type 헤더에서 보았던 것처럼 이것을 서버로 보낼 때 많은 걱정을 할 필요가 없다.




위로


서버에서 JSON 인터프리팅 하기

클 라이언트 측 JavaScript 코드를 작성했고, 사용자들이 웹 폼과 페이지와 상호 작동 할 수 있도록 했고, 서버 측 프로그램으로 보내야 하는 정보를 수집했다면, 서버가 이제 중요한 역할을 할 차례이다. (비동기식으로 사용하는 서버 측 프로그램에 호출한다고 가정한다면, "Ajax 애플리케이션"으로 생각할 수도 있다.)

JSON 두 단계

서버에서 어떤 언어를 사용하든지 간에, 서버 측에서 JSON을 작동시키는 것은 두 단계이다.

  1. 자신이 사용하고 있는 언어용 JSON parser/toolkit/helper API를 찾아서 서버 측 프로그램을 작성한다.
  2. JSON parser/toolkit/helper API를 사용하여 클라이언트에서 요청 데이터를 가져다가 이것을 스크립트가 이해할 수 있는 것으로 바꾼다.

이것이 전부이다. 이제 이러한 단계를 보다 상세히 알아보자.

JSON 파서 찾기

JSON 파서나 툴킷을 찾을 수 있는 최상의 리소스는 JSON 웹 사이트이다. (참고자료) 포맷에 대한 많은 것을 배우는 것은 물론이고, ASP부터 Erlang, Pike, Ruby 등을 위한 JSON 툴과 파서에 대한 링크도 제공한다. 스크립트가 작성된 언어를 찾고 툴킷을 다운로드 한다. 이것을 제거, 확장, 설치하여(서버에서 C#, PHP, 또는 Lisp를 사용할 때 여러 변수들이 있다.) 서버 상의 스크립트와 프로그램이 이 툴킷을 사용할 수 있도록 한다.

예 를 들어, PHP를 사용하고 있다면, PHP 5.2로 업그레이드 하고 이것을 사용하여 수행될 수 있도록 한다. 최신 버전의 PHP에는 JSON 확장이 포함되어 있다. 사실, 이것은 PHP로 작업할 때 JSON을 다룰 수 있는 최상의 방법이다. 자바 서블릿을 사용한다면, json.org에 호스팅 된 org.json 패키지가 제격이다. 이 경우, JSON 웹 사이트에서 json.zip을 다운로드 하고 포함된 소스 파일을 프로젝트의 빌드 디렉토리에 추가한다. 이 파일을 컴파일 하면 실행할 준비가 된 것이다. 다른 지원 언어도 과정은 비슷하다. 여러분이 사용하는 언어에 대한 전문적인 지식을 갖추는 것이 중요하다.

JSON 파서 사용하기

프로그램에 사용할 수 있는 리소스가 있다면, 호출 할 올바른 메소드를 찾는 것이 중요하다. 예를 들어, PHP와 함께 JSON-PHP 모듈을 사용하고 있다면,

// This is just a code fragment from a larger PHP server-side script
require_once('JSON.php');

$json = new Services_JSON();

// accept POST data and decode it
$value = $json->decode($GLOBALS['HTTP_RAW_POST_DATA']);

// Now work with value as raw PHP

여기에서, 여러분은 모든 데이터 -- 배열 포맷, 다중 행, 단일 값, JSON 데이터 구조에 들어갈 것들 -- 를 $value 변수에 네이티브 PHP 포맷으로 한다.

서블릿에서 org.json 패키지를 사용한다면, 다음과 같이 한다.

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {

  StringBuffer jb = new StringBuffer();
  String line = null;
  try {
    BufferedReader reader = request.getReader();
    while ((line = reader.readLine()) != null)
      jb.append(line);
  } catch (Exception e) { //report an error }

  try {
    JSONObject jsonObject = new JSONObject(jb.toString());
  } catch (ParseException e) {
    // crash and burn
    throw new IOException("Error parsing JSON request string");
  }

  // Work with the data using methods like...
  // int someInt = jsonObject.getInt("intParamName");
  // String someString = jsonObject.getString("stringParamName");
  // JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName");
  // JSONArray arr = jsonObject.getJSONArray("arrayParamName");
  // etc...
}

자세한 내용은 org.json 패키지 문서를 참조하라. (참고자료). (주: org.json 또는 기타 JSON 툴킷에 대한 상세한 내용을 원한다면, 필자에게 이메일을 보내도 좋다. 여러분의 의견을 다음 기술자료에 반영하겠다!).




위로


결론

이제는 서버 측에서 JSON을 다루는 방법에 익숙해 질 때이다. 본 기술자료와 Part 10에 서는 단순한 기술적인 도움을 주는 것을 넘어서 JSON이 진정으로 유연하고 강력한 데이터 포맷이라는 것을 증명했다. 이것이 모든 애플리케이션에 사용되는 것이 아니더라도, 훌륭한 Ajax와 JavaScript 프로그래머라면 툴박스에 JSON 정도는 갖추고 있을 것이고, 사용할 수도 있을 것이다.

필자는 여러분의 JSON 사용 경험이나, 여러분이 서버에서 사용하기에 좋았던 혹은 좋지 않았던 언어에 대한 의견도 듣고 싶다. 자바와 XML 뉴스 그룹에 등록하여 알려주기 바란다. (참고자료) JSON과 텍스트 데이터 포맷의 힘을 누리기 바란다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이

JavaScript 객체 사용하기

developerWorks
문서 옵션
수평출력으로 설정

이 페이지 출력

이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기


제안 및 의견
피드백

난이도 : 초급

Brett McLaughlin, Author and Editor, O'Reilly Media Inc.

2007 년 5 월 02 일

평이한 텍스트와 XML은 비동기식 애플리케이션에서 정보를 송수신 할 때 사용할 수 있는 데이터 포맷입니다. Ajax 마스터하기 시리즈에서는 또 다른 유용한 데이터 포맷인 JavaScript Object Notation (JSON)에 대해 알아보고, 이것이 애플리케이션에서 데이터와 객체들을 어떻게 이동시키는지를 설명합니다.

여러분이 본 시리즈를 오랫동안 읽어왔다면, 데이터 포맷에 대한 지식도 많이 쌓였을 것이다. 이전 기술자료에서는 평이한 텍스트와 간단한 name/value 쌍이 많은 비동기식 애플리케이션에서 어떤 역할을 하는지를 살펴보았다. 여러분은 다음과 같은 데이터를 조합할 수 있다.

firstName=Brett&lastName=McLaughlin&email=brett@newInstance.com

더 이상 무엇을 할 필요가 없다. 사실, 웹 고수들은 이것이 GET 요청을 통해 보내지는 정보용 포맷이라는 것을 알고 있다.

그리고 나서, 본 시리즈에서는 XML에 대해서 다루었다. 확실한 것은 XML은 부정적인 측면과 긍정적인 측면 모두에서 정당한 평가의 몫을 받았고, 이러한 것이 Ajax 애플리케이션에서도 나타나는 것은 그리 놀랄 일이 아니다. 본 시리즈의 지난 기술자료들에서 XML이 대안 데이터 포맷들을 어떻게 제공하는지를 파악하기 바란다.

<request>
  <firstName>Brett</firstName>
  <lastName>McLaughlin</lastName>
  <email>brett@newInstance.com</email>
</request>

이것은 여러분이 위해서 보았던 것과 같은 데이터이지만, XML 포맷으로 저장되어 있다. 그 외에 특징적인 것은 없다. 평이한 텍스트와 name/value 쌍 대신에 XML을 사용할 수 있는 또 하나의 데이터 포맷일 뿐이다.

이 글에서는 또 다른 데이터 포맷인 JavaScript Object Notation(JSON)에 대해 살펴보겠다. JSON은 여러분이 이미 보았던 것과 비슷한 부분이 있고, 어떤 부분은 생소하다. 이것은 여러분에게 또 다른 선택권을 줄 것이며, 그 선택은 그렇게 나쁘지 않다.

선택할 수 있는 권한

JSON 포맷에 대해 상세히 설명하기 전에, 특히, 평이한 텍스트에서 XML과 name/value 쌍으로 작업하는 방법을 이미 알고 있다면, 다양한 데이터 포맷을 다룬 기술자료들을 먼저 읽어보기 바란다.(다음 글에서도 JSON에 대해 다룰 것이다.) 이유는 간단하다. 여러분에게 선택권이 많이 주어지고 문제에 대한 옵션들이 많아질수록, 단 하나의 솔루션 보다는 문제에 대한 최상의 솔루션을 찾을 수 있는 더 좋은 기회들이 생기기 때문이다.

name/value 쌍과 XML

본 시리즈에서는 name/value 쌍이 적합한 상황과 XML을 사용하기에 적합한 상황에 대해 이미 다루었다. 거듭 말하지만, 여러분은 우선 name/value 쌍을 사용하는 것을 늘 생각해야 한다. 이것은 대부분의 비동기식 애플리케이션에서 생기는 문제들에 대한 가장 간단한 솔루션이고, JavaScript에 대한 기본적인 지식만 있어도 간단히 해결된다.

여 러분은 XML로 전향하는데 제약이 없다면 대안 데이터 포맷을 사용하는 것에 관해 걱정할 필요가 없다. 확실히, XML 포맷의 입력을 요하는 서버 측 프로그램으로 데이터를 보낸다면, 데이터 포맷으로 XML을 사용해야 한다. 대부분의 경우, XML은 애플리케이션에 여러 정보 조각들을 보내야 하는 서버용으로 적합하다. 다시 말해서, XML은 Ajax 애플리케이션으로부터의 요청 보다는, Ajax 애플리케이션으로의 응답으로 더 일반적으로 사용된다.

JSON 추가하기

name/value 쌍 또는 XML을 사용할 때, JavaScript를 사용하여 애플리케이션에서 데이터를 가져다가, 이것을 데이터 포맷에 채워 넣는다. 이 경우, JavaScript는 데이터 조작 언어로서의 역할을 하고, 웹 폼에서 데이터를 이동시키고 조작하며, 이것을 서버 측 프로그램에 쉽게 보내질 수 있는 포맷에 넣는다.

하지만, 단순한 포맷 언어 이상으로 JavaScript를 사용해야 할 때가 있다. 이러한 경우에, JavaScript 언어의 객체를 사용하여 데이터를 표현하고, 웹 폼에서 데이터를 가져다가 요청을 한다. 이러한 상황에서, JavaScript에 있는 객체에서 데이터를 추출하고 그 데이터를 name/value 쌍 또는 XML로 채우는 것이 일이다. 이때에 JSON이 빛을 발한다. JavaScript 객체를 (동기식 또는 비동기식) 요청의 일부로 보내질 수 있는 데이터로 쉽게 변환할 수 있다.

기 본적으로 JSON은 문제해결의 특효약은 아니다. 하지만, 매우 특수한 상황에 있어서 훌륭한 옵션이 된다. 그러한 상황에 절대로 놓이지 않을 것이라고 가정하지 말고, 이 글과 다음 글을 읽으면서 JSON을 배워가기 바란다. 그러한 유형의 문제에 직면할 때를 대비한다고 생각하면 좋을 것이다.




위로


JSON 기초

JSON 으로는 JavaScript 객체로 표현된 데이터를 한 함수에서 다른 함수로, 또는 비동기식 애플리케이션의 경우, 웹 클라이언트에서 서버 측 프로그램으로 쉽게 전달할 수 있는 스트링으로 변형할 수 있다. 문자열이 약간 이상해 보이지만 JavaScript에 의해 쉽게 인터프리팅 되고, JSON은 name/value 쌍 보다 복잡한 구조도 표현한다. 예를 들어, 단순한 키와 값 리스트 대신, 배열과 복합 객체들을 나타낼 수 있다.

JSON 예제

JSON에서는 name/value 쌍이 다음과 같이 표현된다.

{ "firstName": "Brett" } 

이는 매우 기본적인 것이고, 텍스트의 name/value 쌍 보다는 더 많은 공간을 차지한다.

firstName=Brett

하지만, JSON은 여러 name/value 쌍들을 하나로 연결할 때 진가를 발휘한다. 우선, 다음과 같이, 여러 name/value 쌍으로 데이터 레코드를 생성할 수 있다.

{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }

신택스의 관점에서 보면 name/value 쌍 보다 나은 점이 없어 보이지만, 이 경우, JSON은 훨씬 더 사용하기 쉬우며, 가독성도 놀랍다. 예를 들어, 위 세 개의 값들은 같은 레코드의 일부이다. 중괄호는 그 값이 같은 커넥션을 갖고 있다는 것을 표시하고 있다.

값들의 배열

값 을 나타내야 할 때, JSON은 보다 읽기 쉽고, 덜 장황하다. 예를 들어, 인명부가 있다고 해보자. XML에서는, 수 많은 오프닝/클로징 태그에 둘러싸이게 되고, 전형적인 name/value 쌍을 사용한다면, 독점적인 데이터 포맷을 사용해야 하거나, person1-firstName처럼 키 네임을 수정해야 한다.

JSON에서는 다음과 같이 괄호를 사용하여 레코드를 그룹핑 할 수 있다.

{ "people": [
  { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
  { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
  { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
]}

이해하기도 어렵지 않다. 이 경우, people이 라는 하나의 변수가 있고, 값은 세 개의 아이템을 포함하고 있는 배열이며, 각각의 레코드에는 이름, 성, 이메일 주소가 있다. 위 예제는 레코드들을 모두 투입하는 방법과, 아이템을 괄호가 있는 싱글 값으로 그룹핑 하는 방법을 설명하고 있다. 물론, 같은 신택스를 사용할 수 있지만, 여러 값들(각각 여러 레코드들을 갖고 있음)을 갖고 있다.

{ "programmers": [
  { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
  { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
  { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
 ],
"authors": [
  { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
  { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
  { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
 ],
"musicians": [
  { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
 ]
}

여기에서 주목해야 할 점은 각각이 다수의 값을 내포하고 있는 많은 값들을 표현할 수 있는 당신의 능력이다. 또 하나 주목해야 할 점은 레코드의 name/value 쌍들은 다른 메인 항목(programmers, authors, musicians)에 따라 변한다는 것이다. JSON은 완전히 동적이고, JSON 구조 안에서 데이터를 표현하는 방식을 바꿀 수 있다.

또 한 가지 알아두어야 할 것은 JSON 포맷 데이터로 작업할 때 제약 조건이 없다는 점이다. 따라서, 어떤 것을 표현하는 방식을 바꿀 수 있고, 심지어는 같은 데이터 구조 내에서 같은 것을 다른 방식으로 나타낼 수도 있다.




위로


JavaScript에서 JSON 사용하기

JSON 포맷을 다룬 후라면, JavaScript에서 이것을 사용하는 것은 간단하다. JSON은 네이티브 JavaScript 포맷이고, JavaScript 내에서 JSON 데이터와 작업하기 위해 특별한 API나 툴킷이 필요 없다.

JSON 데이터를 변수에 할당하기

예를 들어, 새로운 JavaScript 변수를 만들고, JSON 포맷 데이터 스트링을 여기에 직접 할당한다고 해보자.

var people =
  { "programmers": [
    { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
    { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
    { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
   ],
  "authors": [
    { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
    { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
    { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
   ],
  "musicians": [
    { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
    { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
   ]
  }

복잡하지 않다. people에는 이제 JSON 포맷 데이터가 포함되어 있다. 하지만, 많은 것을 수행하지 않는다. 데이터는 여전히 유용한 포맷으로 되어있지 않다.

데이터에 액세스 하기

위 의 매우 긴 스트링은 단순한 배열일 뿐이고, JavaScript 변수에 그 배열이 있다면 쉽게 액세스 할 수 있다. 사실, 그 배열을 마침표로 구분할 수 있다. 따라서, programmers 리스트의 첫 번째 엔트리의 성(last name)에 액세스 하려면, JavaScript에서 다음과 같은 코드를 사용해야 한다.

people.programmers[0].lastName;

인덱싱은 '0' 부터 시작한다. 따라서, 이것은 people 변수에 있는 데이터로 시작한다. 그리고 나서, programmers라고 하는 아이템으로 이동하고, 첫 번째 레코드([0])에 액세스 한다. 마지막으로, lastName 키의 값에 액세스 한다. 결과는 "McLaughlin"이라는 스트링 값이다.

다음은 같은 변수를 사용하는 예제들이다.

people.authors[1].genre			// Value is "fantasy"

people.musicians[3].lastName		// Undefined. This refers to the fourth entry,
 and there isn't one

people.programmers.[2].firstName	// Value is "Elliotte"

이 신택스로도, 다양한 JSON 포맷 데이터로 작업할 수 있고, 추가 JavaScript 툴킷이나 API가 필요 없다.

JSON 데이터 수정하기

위에 나타난 점과 괄호 표기법을 사용하여 데이터에 액세스 하듯, 같은 방식으로 데이터를 쉽게 수정할 수 있다.

people.musicians[1].lastName = "Rachmaninov";

문자열에서 JavaScript 객체로 변환했다면 변수에 있는 데이터를 수정하면 된다.

문자열로 변환하기

물론, 모든 데이터 수정은 텍스트 포맷으로 쉽게 변환할 수 없다면 가치가 없다. 이것 역시 JavaScript에서는 간단하다.

String newJSONtext = people.toJSONString();

이것이 다이다. 원하는 곳 어디에서나 사용할 수 있는 텍스트 문자열이 생겼으니, 이것을 Ajax 애플리케이션에서 요청 스트링으로 사용할 수 있다.

훨씬 더 중요한 것은, 어떤 JavaScript 객체라도 JSON 텍스트로 변환할 수 있다. 원래 JSON 포맷 스트링으로 할당된 변수로만 작업할 필요가 없다. myObject라는 객체를 변형하려면, 같은 종류의 명령어를 실행하면 된다.

String myObjectInJSON = myObject.toJSONString();

이것이 JSON과 다른 데이터 포맷과의 가장 큰 차이이자, 이 시리즈를 통해 탐구할 주제이다. JSON에서는, 단순한 함수를 호출하면, 포맷팅 되어 사용하기에 알맞은 데이터를 얻을 수 있다. 다른 데이터 포맷의 경우, 미가공 데이터와 포맷 데이터간 변환은 여러분의 몫이다. Document Object Model 같이 데이터 구조를 텍스트로 변환하는 함수를 제공하는 API를 사용할 때도, 네이티브 JavaScript 객체와 신택스 보다는, API를 배우고 그 API의 객체를 알아야 한다.

여러분이 많은 JavaScript 객체들과 작업할 때, JSON은 데이터를 서버 측 프로그램으로 요청을 보내기에 알맞은 포맷으로 쉽게 변환할 수 있다.




위로


결론

소셜 북마크
mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

본 시리즈에서는 데이터 포맷에 대한 내용을 많은 부분을 할애했다. 여러분의 비동기식 애플리케이션이 거의 비동기식이기 때문이다. 모든 종류의 데이터를 송수신 할 수 있는 다양한 툴과 기술이 있다면, 각 데이터 유형에 가장 잘 맞는 방식으로 수행하면 되고, Ajax 전문가의 반열에도 오를 것이다. 여기에 JSON을 추가하면, JavaScript에서 보다 복잡한 데이터 구조도 능숙히 다룰 준비가 된다.

다음 기술자료에서는 단순히 데이터를 보내는 것 이상으로, 서버 측 프로그램이 JSON 포맷 데이터를 수신하여 처리하는 부분을 설명할 것이다. 또한, 서버 측 프로그램이 스크립트와 서버 측 컴포넌트에 JSON 포맷으로 된 데이터를 보내는 방법도 설명할 것이다. XML, 평이한 텍스트, JSON 요청과 응답을 혼합하는 부분에 대해서도 설명할 것이다. 목표는 어떤 환경에서도 유연하게 이러한 툴들을 능숙히 조작할 수 있도록 하는 것이다.

기사의 원문보기

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이

비동기식 애플리케이션에 퍼블릭 API 활용하기

developerWorks
문서 옵션
이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기


제안 및 의견
피드백

난이도 : 중급

Brett McLaughlin, Author and Editor, O'Reilly Media Inc.

2007 년 3 월 20 일

비 동기식 요청은 서버 측 프로그램과의 통신에 대한 것만은 아닙니다. Google 또는 Amazon 같은 퍼블릭 API와 통신할 수 있고, 여러분이 갖고 있는 스크립트와 서버 측 프로그램이 제공하는 것 이상의 기능을 웹 애플리케이션에 추가할 수 있습니다. 이 글에서, Brett McLaughlin은 Google 같은 퍼블릭 API를 통해 요청을 하고 응답을 받는 방법을 설명합니다.

지금까지 본 시리즈에서는 클라이언트 웹 페이지가 서버 측 스크립트와 프로그램에 요청을 하는 상황을 주로 다루었다. 바로 이것이 80~90%의 Ajax 애플리케이션- XMLHttpRequest 객체를 사용하는 비동기식 웹 애플리케이션-이 작동하는 방식이다. 하지만, 이러한 방식에도 심각한 한계가 있다. 여러분 개개인의 창의력과 프로그래밍 기술, 또는 기업 내 팀 소속 프로그래머들의 창의성과 프로그래밍 기술력 역시도 제한 요소로 작용할 수 있다.

여 러분은 무엇을 해야 하는지는 알고 있지만, 그 목표를 달성하는데 필요한 기술적 지식이 부족한 경우가 있다. 아마도, 신택스를 잘 모르거나, 올바른 알고리즘을 이해하지 못할 경우일 것이다. 또 어떤 경우에는, 자신의 필요에 맞는 데이터나 리소스(인력 또는 데이터 리소스)가 없을 수도 있다. "다른 사람의 코드를 사용할 수만 있다면….." 이라고 생각하고 있는 자신을 발견할 때가 종종 있다. 이 글에서 바로 이러한 문제에 대하여 다룰 것이다.

오픈 소스 스크립트와 프로그램

웹 애플리케이션에서 퍼블릭 API를 사용하는 문제를 논하기 전에, 오픈 소스 스크립트와 프로그램에 대해 잠깐 이야기 해보자. 오픈 소스는 무료로 사용 및 재사용될 수 있는 애플리케이션 코드를 칭하는 용어이다. 참고자료 섹션에서 관련 링크들을 제공하고 있다. 누군가가 이미 작성해 놓은 오픈 소스 코드를 가져다가, 비용이나 많은 규제 없이 자신의 환경으로 적용하여 사용할 수 있다.

여 러분이 오픈 소스 코드를 사용한다면, 가끔은 애플리케이션에 문서를 추가하거나, 오픈 소스 프로그램이나 스크립트를 수정한 것을 커뮤니티에 기여해야 한다. 커뮤니티 안에서는 어떤 프로그램을 사용하든지 간에, 결과적으로 여러분이 작성하지 않았던 코드 또는 많은 도움과 리소스가 없었다면 작성되지 못했을 코드를 사용할 수 있다. Apache와 같은 프로젝트는 다른 사람들이 했던 작업을 쉽게 활용할 수 있다. 그리고 당신이 그러한 사용권에 대한 걱정할 필요도 없이, 그들은 기꺼이 여러분이 사용하기를 바란다!

기술자료와 튜토리얼 온라인

IBM developerWorks는 기술자료, 튜토리얼, 백서 등을 온라인으로 제공하고 있다. 양도 방대하고, Ajax와 관련한 기술자료만 해도 1000여건에 달한다. 심지어, 실력이 미천한 필자조차도 본 시리즈를 10회까지 진행했다. 이러한 기술자료에는 여러분이 사용할 수 있는 실행 코드, 예제, 다운로드 등이 포함되어 있다.

서버 측 프로그램이나 스크립트를 사용할 능력이 없거나 오픈 소스 프로그램이나 스크립트를 찾을 수 없다면 Google을 검색하여 자신이 찾고 있는 것에 대한 기본적인 설명 글만 입력하면 된다. developerWorks를 검색해도 같은 결과를 얻는다. 정확히 코드 조각을 찾거나, 전체 스크립트를 발견하기도 할 것이다. 도움이 되는 코멘트와 작동 방법에 대한 설명까지 곁들여지면 더욱 완벽하다.




위로


퍼블릭 API 사용하기

때 로는 기술적이지 않는 문제에도 직면하게 될 것이다. 특정 스크립트나 코드 조각을 작성하는 데에는 도움이 필요하지 않다. 오히려, 여러분이 갖고 있지 않은 데이터나 리소스가 필요하다. 이러한 경우에, 튜토리얼이나 오픈 소스 스크립트가 여러분에게 도움이 되겠지만, 이것으로 여러분의 니즈(needs)가 다 채워지는 것은 아니다. 웹 페이지에 검색 엔진을 설치하는 경우를 생각해 보자. 검색하고 싶은 데이터가 있는데, 그 데이터가 여러분의 기업이나 조직이 갖고 있는 것이 아닐 경우 어떻게 하겠는가?

기술이 아닌 데이터에 의해 제약을 받는 경우, public API가 해당 문제 해결에 도움이 된다. 퍼블릭 API를 사용해서는 다른 서버에 호스팅 된 프로그램을 사용할 수 있고, 다른 사람들의 데이터를 사용할 수 있다. 일반적으로, API 자체는 프로그램과 인터랙팅 하는 방식을 정의한다. 예를 들어, Google 검색 엔진에 대한 퍼블릭 API로 검색을 할 수 있지만, Google의 코드는 Google의 데이터를 검색하고 그 결과를 프로그램에 리턴 할 것이다. 여러분은 이러한 프로그램을 작성할 때 다른 사람의 기술력의 도움을 받을 뿐만 아니라, 여러분 또는 여러분 기업 이외의 데이터 스토어를 활용할 수 있는 혜택도 누리게 된다.




위로


Google Ajax Search API 설정하기

Google 은 온라인 시대의 대단한 발명품이라는 점은 두말할 나위 없다. 온라인에 대해 모르는 할머니와 4살 먹은 아이들도 Google에 대해 알고 있다. Google은 매우 대중적이고 유용한 검색 엔진을 구축하고, 여러분 각자의 프로그램에서 사용할 수 있는 퍼블릭 API를 가진 무료 서비스들을 제공하는데 헌신하고 있다. 이 섹션에서는, Google API를 사용할 수 있도록 설정하고, Google로의 비동기식 애플리케이션 통신을 만들 수 있는 방법을 설명하겠다.

Google에서 개발자 키 얻기

이 글은 Google의 Ajax Search API에 특히 초점을 맞출 것이다. Google Ajax Search API 홈 페이지(그림 1)를 방문하여 특정 API에 대한 내용을 찾아보기 바란다. (참고자료)


그림 1. Google의 Ajax Search API 페이지
Google's Ajax Search API page

우선 Sign up for a Google AJAX Search API key 링크를 클릭한다. 클릭하면, Google API를 사용을 위한 가입 페이지로 간다. 사용 조건에 동의하고 애플리케이션이 실행 될 웹 사이트의 URL을 제공한다. (그림 2)


그림 2. Google의 Ajax Search API 가입하기
Signing up for Google's Ajax Search APIn
어떤 URL을 사용해야 할까?

Google이 요구하는 URL은 다름아닌 사이트를 실행하는 도메인이 다. 만일 여러분이 고유의 도메인을 갖고 있다면, http://www.newinstance.com을 사용할 수 있다. (이것은 내 개인 도메인이므로 여러분의 것을 사용해야 한다.) 여러분은 여러분의 사이트가 더 큰 도메인 내의 하위 도메인이나 특정 경로를 사용한다면 보다 구체적으로 지정해야 한다. 그러한 경우에, 여러분은 http://www.earthlink.net/~bmclaugh 또는 http://brett.earthlink.net 같은 URL을 사용해야 한다. 이 같은 특별한 경우를 제외하고는, 지나치게 구체적일 필요는 없다. 그저, 여러분의 전체 웹 사이트에 액세스 하는데 사용하는 기본 URL을 제공하고, 그 URL 내 어디에나 존재하는 API를 사용할 수 있다.

동의서를 읽고 체크 박스에 체크를 했다면, URL에 입력하고, Generate API Key를 클릭한 다음 1~2초 정도 기다린다. 이 시점에서 여러분은 Google로 로그인 하거나, 계정을 만들어야 한다. 이것이 기본 프로세스이고 여러분 스스로 쉽게 할 수 있다. 이것이 다 끝나면 응답 스크린이 나타날 것이고, 매우 긴 키가 제공된다. URL을 반복하고, 심지어 샘플 페이지도 제공한다. 키는 다음과 같은 양상을 띤다.

ABQIAAAAjtuhyCXrSHOFSz7zK0f8phSA9fWLQO3TbB2M9BRePlYkXeAu8lHeUgfgRs0eIWUaXg

Google의 API 문서

여러분에게 할당된 키를 사용하기 전에, Google의 API 문서를 읽어두는 것이 좋다. (키를 제공했던 페이지 하단에 링크가 있고, 아래 참고자료 섹션에서도 제공한다.) 이 글도 충분히 도움이 되겠지만, Google의 API 문서 역시 좋은 참고 자료이며, Google을 사용하는 방법에 대한 훌륭한 통찰력도 얻을 수 있을 것이다.




위로


가장 단순한 Google 검색 웹 애플리케이션

Google이 제공하는 샘플 웹 페이지를 수정해보고, 이것이 어떻게 작동하는지를 보자.

검색 박스 만들기

Listing 1은 매우 단순한 웹 페이지이다. 여러분이 좋아하는 에디터에 타이핑하여, 저장하고 Google에 제공했던 도메인이나 URL에 업로딩 한다.


Listing 1. Google 검색 애플리케이션의 HTML
				
<html>
 <head>
  <title>My Google AJAX Search API Application</title>
  <link href="http://www.google.com/uds/css/gsearch.css"
        type="text/css" rel="stylesheet" />
  <script 
        src="http://www.google.com/uds/api?file=uds.js&v=1.0&key=YOUR KEY HERE" 
        type="text/javascript"> </script>
  <script language="Javascript" type="text/javascript">
    function OnLoad() {
      // Create the Google search control
      var searchControl = new GSearchControl();

      // These allow you to customize what appears in the search results               
      var localSearch = new GlocalSearch();                                     
      searchControl.addSearcher(localSearch);                                   
      searchControl.addSearcher(new GwebSearch());                              
      searchControl.addSearcher(new GvideoSearch());                            
      searchControl.addSearcher(new GblogSearch());                             

      // Tell Google your location to base searches around                      
      localSearch.setCenterPoint("Dallas, TX"); 

      // "Draw" the control on the HTML form
      searchControl.draw(document.getElementById("searchcontrol"));
    }
  </script>
 </head>

 <body onload="OnLoad()">
  <div id="searchcontrol" />
 </body>
</html>

볼드체로 되어 있는 부분을 Google에서 받은 여러분의 개발자 키로 대체하는 것을 잊지 말라. 페이지를 로딩하면, 그림 3과 같은 모습이 된다.


그림 3. Google의 단순한 검색 폼
The simplest search form for Google

특별한 것은 업지만, 이러한 작은 컨트롤 뒤에 Google의 모든 파워가 숨어있다.

검색 실행하기

검색어를 입력하고 Search를 클릭하여 Google을 실행한다. 여러 개의 결과들이 빠르게 나타나는 것을 볼 수 있다. (그림 4)


그림 4. Google의 검색 결과
Google's search results

pre-search 추가하기

확실히, 일단 검색을 수행하면 페이지는 좀더 유려하게 보이며, 비디오, 블로그, 검색 결과들이 이를 장식한다. 여러분이 정의한 검색어인 pre-search를 추가할 수 있다. 이것은 사용자가 페이지를 로딩하면 처음에 나타나는 결과이다. 이를 수행하려면, Listing 2의 굵은 라인을 JavaScript에 추가한다.


Listing 2. pre-search 용어 추가하기
				
    function OnLoad() {
      // Create the Google search control
      var searchControl = new GSearchControl();

      // These allow you to customize what appears in the search results
      var localSearch = new GlocalSearch();
      searchControl.addSearcher(localSearch);
      searchControl.addSearcher(new GwebSearch());
      searchControl.addSearcher(new GvideoSearch());
      searchControl.addSearcher(new GblogSearch());

      // Tell Google your location to base searches around
      localSearch.setCenterPoint("Dallas, TX"); 

      // "Draw" the control on the HTML form
      searchControl.draw(document.getElementById("searchcontrol"));

      searchControl.execute("Christmas Eve");
    }

고유의 초기 검색어를 코드에 삽입하여 페이지가 로딩될 때 나타나는 부분을 커스터마이징 할 수 있다.

JavaScript 분해

더 진행하기 전에, 이러한 기본적인 명령어가 어떤 일을 하는지 보자. 먼저, 새로운 GSearchControl이 만들어진다. (Listing 3) 이것은 모든 검색을 수행할 수 있도록 해주는 구조이다.


Listing 3. 새로운 GSearchControl 생성하기
				
    function OnLoad() {
      // Create the Google search control
      var searchControl = new GSearchControl();

      ...
    }

그런 다음 이 코드는 GlocalSearch를 사용하여 새로운 로컬 검색을 설정한다. 이것은 특정 위치에 기반한 검색을 수행하는 특별한 Google 구조이다. 로컬 검색은 Listing 4에 설명되어 있다.


Listing 4. 새로운 로컬 검색 설정하기
				
    function OnLoad() {
      // Create the Google search control
      var searchControl = new GSearchControl();

      // These allow you to customize what appears in the search results
      var localSearch = new GlocalSearch();
      ...                             

      // Tell Google your location to base searches around
      localSearch.setCenterPoint("Dallas, TX"); 

      ...
    }

일단 여러분은 호출할 객체와 메소드를 배우기만 하면 충분히 이해할 수 있다. Listing 4의 코드는 새로운 로컬 검색자를 만든 다음, 검색의 중심 포인트를 설정한다.

Listing 5에서는 검색 컨트롤에게 어떤 유형의 검색을 수행해야 하는지를 지시하고 있다.


Listing 5. 검색 유형
				
    function OnLoad() {
      // Create the Google search control
      var searchControl = new GSearchControl();

      // These allow you to customize what appears in the search results
      var localSearch = new GlocalSearch();
      searchControl.addSearcher(localSearch);
      searchControl.addSearcher(new GwebSearch());
      searchControl.addSearcher(new GvideoSearch());
      searchControl.addSearcher(new GblogSearch());

      // Tell Google your location to base searches around
      localSearch.setCenterPoint("Dallas, TX"); 

      ...
    }

여러 가지 검색 유형들을 요약하면 다음과 같다.

  • GwebSearch: 웹 검색용 객체이고, Google은 이것으로 유명해졌다.
  • GvideoSearch: 검색어와 관련된 비디오를 찾는다.
  • GblogSearch: 이 객체는 블로그를 통한 검색에 특별한 초점을 맞추고 있는데, 다른 웹 콘텐트 유형과는 약간 다르게 구성되고, 다른 태그가 붙는다.

여러분은 이미 특정 검색을 사전 로딩(pre-load)하는 방법을 배웠다. 이제 남은 것은 Listing 6에 나와있는 draw() 메소드 호출이다. 이 호출을 HTML에 있는 DOM 엘리먼트에 준다. (DOM에 대해서는 이전 기술자료를 참조하라. 참고자료) 컨트롤이 폼에 나타나고 사용할 준비가 된다.


Listing 6. 검색 컨트롤 가져오기
				
    function OnLoad() {
      // Create the Google search control
      var searchControl = new GSearchControl();

      // These allow you to customize what appears in the search results
      var localSearch = new GlocalSearch();
      searchControl.addSearcher(localSearch);
      searchControl.addSearcher(new GwebSearch());
      searchControl.addSearcher(new GvideoSearch());
      searchControl.addSearcher(new GblogSearch());

      // Tell Google your location to base searches around
      localSearch.setCenterPoint("Dallas, TX"); 

      // "Draw" the control on the HTML form
      searchControl.draw(document.getElementById("searchcontrol"));

      searchControl.execute("Christmas Eve");
    }




위로


Ajax는 어디에 있는가?

이 렇게 간단한 검색 박스에서 비동기 특성이 어디에 나타나있는지 확실치 않다. 확실한 것은, 여러분 고유의 웹 애플리케이션 어딘가에 Google 검색 박스를 두긴 했지만, 이것은 Google 검색에 대한 내용이 아닌 Ajax 애플리케이션 시리즈 글이다. 그렇다면, Ajax는 어디에 있는가?

검색어를 입력하고 Search 버튼을 클릭하면, 매우 Ajax 다운 응답을 보게 된다. 검색 결과는 페이지를 재 로딩하지 않아도 나타난다. 바로 이것이 대부분의 Ajax 애플리케이션의 특징이다. 페이지를 다시 로딩하지 않고 시각적인 콘텐트 변화가 이루어 진다. 일반적인 요청/응답 모델 그 이상이라는 점은 확실하다. 그렇다면, XMLHttpRequest? Where is the request 객체는 어디에 있는가? 그리고 getElementById() 메소드 외에, DOM과 페이지 조작은 어떻게 되었는가? 이것은 HTML의 단 두 줄이면 해결된다.

Google과 JavaScript.

첫 번째 줄은 그 동안 많이 다루지 못했던 부분이다. (Listing 7)


Listing 7. 가장 중요한 JavaScript 파일
				
<script 
    src="http://www.google.com/uds/api?file=uds.js
&v=1.0&key=
[YOUR GOOGLE KEY]" 
    type="text/javascript"> </script>

신택스는 특별한 것은 없지만, 중요한 것은 Google이 uds.js라는 파일을 호스팅하는데, 이 안에 검색 박스가 작동하는데 필요한 모든 JavaScript가 들어있다는 점이다. 엄밀히 말하면 다른 사람들의 코드를 사용하고 있는 것이다. 여러분은 서드 파티가 여러분의 애플리케이션이 사용하는 코드를 호스팅 하도록 할 수 있다. Google은 보존과 관리까지 다루기 때문에 이것은 매우 중요하고, 기업이 JavaScript 파일을 업그레이드 할 때 자동적으로 혜택이 미친다. Google은 여러분 모르게 API를 변경하지 않기 때문에 여러분의 코드는 JavaScript 파일이 수정되더라도 계속 실행된다.

GSearchControl 객체

여기에서 숨겨진 한 가지는 GSearchControl 객체용 코드로서 onLoad() JavaScript 함수에서 생성된다. 이 객체를 생성하려면 Listing 8의 코드를 호출한다.


Listing 8. GSearchControl 객체 생성하기
				
// Create the Google search control
var searchControl = new GSearchControl();

이 HTML 역시 매우 간단하다. JavaScript가 참조할 수 있는 div 태그와 ID가 전부이다. (Listing 9)


Listing 9. 검색 컨트롤을 만드는데 필요한 모든 HTML
				
<div id="searchcontrol" />

Google의 JavaScript

Google의 JavaScript는 이해하기가 어렵다. 우선, uds.js JavaScript 파일은 일부 로컬 설정을 파악하고, Google 스팩의 태스크를 처리하며, Google 키를 확인한 다음 두 개의 다른스 크립트: http://www.google.com/uds/js/locale/en/uistrings.js와 http://www.google.com/uds/js/uds_compiled.js를 로딩한다. 이러한 두 개의 파일들을 실제로 가져다가 관심 있는 부분을 보는 것은 좋다. 고급 코드를 파악하는 것은 힘든 일이며 포맷팅은 끔찍하므로 조심하여야 한다. 대부분의 경우, 이러한 파일을 사용하는 방법만 알면 되며, 라인 마다 이들이 무엇을 수행하는지 알려고 고심할 필요까지는 없다.

하 지만, 안 보이는 곳에서 Google의 코드는 거의 모든 종류의 일들을 수행하고 있다. 새로운 텍스트 박스, 일부 아이콘 그래픽, JavaScript 함수를 호출하는 버튼을 만든다. 따라서 여러분은 모든 종류의 작동을 거저 얻게 되는 것이다. 하지만 여러분은 이러한 일이 어떻게 발생하는지에 대한 기초는 이해하고 있으면, 코드를 사용하고 애플리케이션을 실행시키는데 편리하다.

Ajax는 여러분이 작성한 코드 그 이상이다.

Ajax 애플리케이션은 단순히 XmlHttpRequest를 사용하는 것에 관한 것만은 아니다. 이것은 웹 애플리케이션에 접근하는 방식에 관한 것이고, 비동기성에 기반하고 있다. 여러분이 Ajax 스팩의 코드를 작성하지 않았지만, Google 덕택으로 Ajax 애플리케이션이 만들어졌다. Google이 대부분의 작업을 했고, 여러분은 그 수혜자가 된 것이다.




위로


Google의 Ajax Search API 미래

이러한 단계들을 거쳐 이것을 여러분 고유의 애플리케이션에 적용하는 것은 여러분에 달려있다. 가장 간단하게는 div를 자신의 웹 페이지에 추가하고 Listing 1의 JavaScript를 웹 페이지에 추가하는 것이다. 이것으로 Google 검색을 사용할 준비가 된 것이다.

하 지만 이것이 전부가 아니며, 이러한 옵션이나 컨트롤에만 국한될 필요가 없다. 웹 결과, 블로그 결과, 비디오 결과를 웹 애플리케이션에 통합할 수 있다. 각각 특정 유형의 결과에 초점을 맞춘 검색 컨트롤을 여러 개 제공할 수도 있다. div에서 측면을 벗어나는 대신, 애플리케이션 콘텐트의 나머지 중간 오른쪽에 span 엘리먼트에 Google 검색 컨트롤을 삽입할 수 있다. 그 어떤 경우이든, Google 검색은 여러분의 필요에 맞춰 구성될 수 있고, Google에 맞추기 위해 애플리케이션을 수정할 필요는 없다.




위로


맺음말

이 글에서 배운 것을 토대로 구현하고, Google 검색 박스와 기타 Google API를 여러분의 Ajax 애플리케이션에 추가해 보기 바란다. 여러분은 이제 퍼블릭 API를 사용하는 방법을 알았다. 예를 들어, Amazon.com은 퍼블릭 API를 제공하면, Amazon 서점의 책과 다른 상품들에 대해서도 Google과 똑 같은 웹 검색을 수행할 수 있다. 여러분이 선호하는 퍼블릭 API를 선택하여 여러분의 코딩 스킬로 할 수 있는 그 이상을 할 수 있다. 사실, Google, Amazon.com, Flickr 등등의 결과물이 통합된 사이트를 쉽게 만들 수 있다.

소셜 북마크
mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

Google이 제공하는 검색 알고리즘과 수 많은 데이터 스토어 때문에 Google을 사용하는 방법을 익히는 것은 중요하지만, 중요한 것은 퍼블릭 API를 사용하는 방법을 배우는 것이다. 코딩 스킬 이상으로 애플리케이션에 대해 생각해야 한다. 이것은 다양한 데이터 조각에 대한 게이트웨이가 될 수 있다. 그 데이터는 Google, Amazon.com, del.icio.us의 서버에 저장될 수 있다. 이렇게 하는 것 만으로도 여러분 스스로 코딩 할 수 있는 것 이상으로 매우 강력한 솔루션을 얻을 수 있다.

애플리케이션을 만들어 보자. 온갖 장소에 있는 데이터를 사용하고, 여러분이 코딩한 것에만 국한하지 말자. 다음 글에서는 데이터 포맷 같은 보다 기술적인 사안을 가지고 다시 돌아오겠다.

기사의 원문보기

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 백성용 헬로우보이

Ajax 클라이언트/서버 통신이 복잡한 문제가 될 수 있다.

developerWorks
문서 옵션
이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기


제안 및 의견
피드백

난이도 : 중급

Brett McLaughlin, Author and Editor, O'Reilly Media Inc.

2007 년 1 월 02 일

지난 시리즈에 서는, Ajax 애플리케이션인 서버로 가는 요청을 XML로 포맷팅 하는 방법을 설명했습니다. 그리고 대부분의 경우, 이것이 좋은 방법이 아닌지를 설명했습니다. 이번에는, 좋은 방법을 소개합니다. XML 응답을 클라이언트로 리턴하는 방법을 설명합니다.

여러분이 해서는 안될 일에 대한 글을 쓰는 것을 별로 좋아하지 않는다. 그것은 매우 바보 같은 일이다. 지금까지 어떤 것을 설명하는데 할애한 시간만큼, 나머지는 그 동안 배웠던 그 기술을 사용하는 것이 왜 좋은 생각이 아닌지를 설명하는데도 시간을 할애하곤 한다. 바로 지난달 지난 달 기술자료(참고자료)가 그 경우이다. Ajax 애플리케이션 요청에 데이터 포맷으로서 XML을 사용하는 방법을 설명했다.

모쪼록 이 글이, XML 요청에 대해 배우느라 여러분이 보냈던 시간을 보상해 주기를 바란다. Ajax 애플리케이션에서, 송신 데이터 포맷으로서 XML을 사용하는 경우는 드물지만, 서버에서 XML을 클라이언트보내야 하는 이유는 충분하다. 따라서, 지난 글에서 여러분이 XML에 대해 배웠던 모든 것이 이번 글에서 비로서 가치를 지니기 시작했다.

(가끔씩) 서버는 많은 말을 하지 못한다.

서 버에서 XML 응답을 받는 것에 대한 기술적인 상세를 보기 전에, 서버가 요청에 대한 응답으로 XML을 보내는 것이 좋은 것인지를 이해해야 한다. (그리고 클라이언트가 요청을 XML로 보내는 것과는 어떻게 다른지도 이해해야 한다.)

클라이언트는 이름/값 쌍으로 말한다.

클라이언트는 대부분의 경우에 XML을 사용할 필요가 없다. 이름값 쌍을 사용하여 요청을 보낼 수 있기 때문이다. 따라서, 다음과 같이 이름을 보내게 된다: name=jennifer. 또한 이어지는 이름값 쌍들은 앰퍼샌드(&)를 사용하여 추가할 수 있다: name=jennifer&job=president. 간단한 텍스트와 이러한 이름값 쌍을 사용하면, 클라이언트는 여러 값을 가진 요청을 서버로 쉽게 보낼 수 있다. XML이 제공하는 추가 구조(오버헤드)가 필요 없다.

사실, XML을 서버로 보내야 하는 대부분의 이유들이 다음 두 개의 범주로 나뉠 수 있다.

  • 서버는 XML 요청을 수락하기만 한다. 이 경우, 선택권이 없다. 지난 달 기술자료에서, 이러한 유형의 요청들을 보낼 때 필요한 모든