2010년 2월에 Google Buzz가 실행된 이후로 이는 실로 엄청난 반향을 불러일으켰다. 사용자가 동영상 및 사진과 같은 풍부한 콘텐츠를 공유할 수 있을 뿐만 아니라 간단한 상태 업데이트도 제공하여 버즈는 빠른 속도로 Google의 가장 대중적인 서비스 중 하나가 되었으며 친밀한 Gmail 통합으로 인해 어느 누구도 피해를 입지 않았다!
Google Buzz는 웹 개발자들이 좋아할 만한 장점들이 더 많다. 다른 많은 Google 서비스와 마찬가지로 Google Buzz는 개발자 API가 함께 제공되어, 개발자가 서비스의 중심을 관리할 수 있고 그 위에 자체적인 매시업을 작성할 수 있다. 그리고 API가 REST를 사용하기 때문에 대부분의 프로그래밍 툴킷들— 필자 본인이 가장 많이 사용하는 PHP 포함 —과 간편하게 통합할 수 있다.
이 기사에서는 Google Buzz API를 소개하여 Google Buzz 콘텐츠를 PHP 애플리케이션과 통합하여 사용하는 방법을 보여준다. 그러면 이제 시작하자.
Google Buzz를 사용하는 애플리케이션을 개발하려면 먼저 Google Buzz가 작동하는 방식을 이해해야 한다. 모든 REST 기반 서비스를 사용할 때와 마찬가지로 작동 과정은 지정된 자원에 HTTP 요청을 함으로써 시작된다. 이 HTTP 요청에는 하나 이상의 입력 매개변수가 있는 쿼리가 포함되어 있으며 서버는 Atom이나 JSON 피드를 사용하여 쿼리에 응답한다. 요청에서 사용되는 HTTP "동사"는 —읽기를 위한 GET, 쓰기를 위한 POST와 PUT 및 삭제를 위한 DELETE— 필요한 조치 유형을 표시하며, 서버로 리턴된 HTTP 상태 코드는 조치의 성공 여부를 표시한다.
이러한 과정이 어떻게 작동하는지 확인하려면 Google 계정에 로그인하여 사용 중인 웹 브라우저에서 https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@public이라는 URL을 요청해보자. URL에서 YOUR_ID 문자열을 Google ID로 바꾸는 것을 유의하자. 이는 사용자의 Google 계정 설정 페이지에 표시되는 Google 프로필 URL에서 확인할 수 있다. 이 요청에 대한 응답(결과 페이지의 소스 코드에서 확인할 수 있음)은 목록 1과 같은 형태가 되며, 여기에는 가장 최신의 Google Buzz 게시 목록이 포함되어 있을 것이다.
목록 1. Google Buzz 피드 예제
<?xml version="1.0" encoding="UTF-8"?>
<feed gd:kind="buzz#activityFeed"
xmlns="http://www.w3.org/2005/Atom"
xmlns:activity="http://activitystrea.ms/spec/1.0/"
xmlns:buzz="http://schemas.google.com/buzz/2010"
xmlns:crosspost="http://purl.org/syndication/cross-posting"
xmlns:gd="http://schemas.google.com/g/2005"
xmlns:georss="http://www.georss.org/georss"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:poco="http://portablecontacts.net/ns/1.0"
xmlns:thr="http://purl.org/syndication/thread/1.0">
<link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
<link
href="https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@public?alt=atom"
rel="self" type="application/atom+xml"/>
<title type="text">Google Buzz Public Feed</title>
<updated>2010-06-24T18:16:47.108Z</updated>
<id>tag:google.com,2010:buzz-feed:public:posted:YOUR_ID</id>
<generator uri="http://www.google.com/buzz">Google Buzz</generator>
<entry gd:kind="buzz#activity">
<title>Watching it rain and planning tomorrow's shopping</title>
<published>2010-06-18T14:13:51.000Z</published>
<updated>2010-06-18T14:13:51.400Z</updated>
<id>tag:google.com,2010:buzz:s12ard75xvreh35</id>
<link href="http://www.google.com/buzz/YOUR_ID/fqFn7S27Va4" rel="alternate"
type="text/html"/>
<link href="https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@self/
tag:google.com,2010:buzz:s12ard75xvreh35?alt=atom" rel="self"
type="application/atom+xml"/>
<link href="https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@self/
tag:google.com,2010:buzz:s12ard75xvreh35/@comments?alt=atom" rel="replies"
thr:count="0" thr:updated="2010-06-18T14:13:51.400Z"
type="application/atom+xml"/>
<author>
<poco:id>YOUR_ID</poco:id>
<poco:photoUrl/>
<name>Vikram Vaswani (Melonfire)</name>
<uri>http://www.google.com/profiles/YOUR_ID</uri>
<link href="" rel="photo" type="image/jpeg"/>
<activity:object-type>http://activitystrea.ms/schema/1.0/
person</activity:object-type>
</author>
<content type="text/html">Watching it rain and planning
tomorrow's shopping</content>
<activity:verb>http://activitystrea.ms/schema/1.0/post
</activity:verb>
<activity:object>
<activity:object-type>http://activitystrea.ms/schema/1.0/note
</activity:object-type>
<content type="text/html">Watching it rain and planning
tomorrow's shopping</content>
<buzz:original-content type="text"/>
<link href="http://www.google.com/buzz/YOUR_ID/fqFn7S27Va4"
rel="alternate" type="text/html"/>
</activity:object>
<source>
<activity:service>
<title>Buzz</title>
</activity:service>
</source>
<buzz:visibility>
<buzz:aclentry type="group">
<poco:id>tag:google.com,2010:buzz-group:@me:@public</poco:id>
<uri>https://www.googleapis.com/buzz/v1/people/@me/
@groups/@public?alt=atom</uri>
<poco:name>Public</poco:name>
</buzz:aclentry>
</buzz:visibility>
<link buzz:count="0" href="https://www.googleapis.com/buzz/v1/
activities/YOUR_ID/@self/tag:google.com,2010:buzz:s12ard75xvreh35/
@liked?alt=atom" rel="http://schemas.google.com/buzz/2010#liked"
type="application/poco+xml"/>
</entry>
<entry>
...
</entry>
</feed>
|
Google Buzz API는 요청된 데이터가 포함된 Atom 또는 JSON 피드를 사용하여 REST 요청에 응답한다. Google Buzz는 다음과 같이 흥미로운 피드를 많이 제공한다.
- 특정 사용자의 모든 공개 게시가 포함된 사용자당 액티비티 피드
- Google Buzz에서 모든 공개 게시가 포함된 글로벌 액티비티 피드
- 특정 액티비티에서 사용자 댓글 목록이 포함된 액티비티당 댓글 피드
- 특정 사용자에 팔로우되고 그가 팔로우하는 사용자 목록이 포함된 사용자당 인물 피드
일부 피드는 공개로 검색하고 액세스할 수 있으며, 일부는 인증 성공 이후에 피드 소유자만 사용할 수 있다. 대부분의 피드는 인증을 통한 읽기 및 쓰기 조작을 둘 다 지원한다. 이는 인증된 사용자가 새 콘텐츠를 프로그래밍 방식으로 그/그녀의 공개 액티비티 피드에 게시하거나, Google Buzz API를 통해 다른 사용자의 공개 피드에 댓글을 쓸 수 있음을 의미한다.
이 피드는 표준 Atom 피드로 최상위 <feed> 요소에는 결과 세트의 현재 페이지(그리고 가능한 경우 다음 및 이전 페이지)에 대한 URL이 있는 <link> 요소가
포함되어 있다. 또한, 최상위 <feed> 요소는 하나 이상의 <entry> 요소를 둘러싸고 있으며 각 요소는 Google Buzz 게시를 나타낸다. 각 엔트리에는 게시 ID, 제목, 작성자, 게시 날짜
및 URL과 같은 기술적 메타데이터가 포함된다. 각 <entry>에는 <author> 요소도 포함되며, 이는 프로필 ID, 프로필 URL, 사진 URL 및 게시 작성자의 이름 및 게시 댓글 피드나 "좋아요" 피드로의 URL 링크를 제공하는 <link> 요소를 제공한다.
Google Buzz 액티비티에서 구체적인 정보를 제공하는 <activity:> 네임스페이스된 요소를 지적할 필요가 있다. <activity:verb> 요소는
액티비티의 유형을 지정하는 반면에 <activity:object> 요소는 액티비티의 콘텐츠를 지정한다.
더 나아가기 전에 제3자 적용 면에서 Google Buzz 콘텐츠의 사용은 Google Buzz 서비스 약관으로 운영됨을 참고하자. 또한 사용자의 적용은 Google Buzz 개발자 정책 및 브랜드 가이드라인을 준수해야 한다. 개발을 시작하기 전에 모든 필수 규칙을 준수하도록 보장하기 위해 이러한 문서를 읽어볼 필요가 있다. 이러한 가이드라인에 대한 링크는 참고자료를 참조한다.
이제 공개 REST API를 통해 Google Buzz 액티비티 피드에 액세스하는 방법을 알았으니, PHP 애플리케이션 내에서 동일한 작업을 수행하는 것을 살펴보자. 한 가지 방법은 PHP의 내장 XML 처리 확장(SimpleXML, DOM 또는 XMLReader)을 사용하여 Google Buzz에서 리턴된 Atom 피드를 구문 분석하고 그로부터 정보의 관련된 단편을 추출하는 것이다. 하지만 이는 특히 대규모의 네임스페이스된 정보나 대형 피드를 처리하는 경우에는 매우 지루할 수 있다.
두 가지의 또 다른 접근방식이 더 편리하다.
- Zend 프레임워크의 Zend_Rest_Client 컴포넌트는 REST 기반 웹 서비스와 PHP 애플리케이션을 통합하려고 시도하는 개발자들을 위해 특별히 디자인되었다. 이 클라이언트를 사용하여 REST 서비스 엔드포인트로의 GET, POST, PUT 및 DELETE 응답을 수행한다. REST 응답은 Zend_Rest_Client_Response 오브젝트의 인스턴스로 리턴되어 개별 응답 특성에 간편하게 액세스할 수 있다.
- Google Buzz PHP 클라이언트 라이브러리는 Google Buzz 피드와 함께 사용하기 위해 특별히 디자인된 오픈 소스 클라이언트 라이브러리이다. 또한 이 라이브러리는 Google Buzz 피드를 네이티브 PHP 오브젝트로 리턴하여 데이터 액세스를 간소화해 준다.
Google Buzz PHP 클라이언트 라이브러리를 사용하려면 또한, 웹 애플리케이션을 Google로 등록하고 OAuth 인증을 위해 필수 OAuth 이용자 기밀을 확보해야 할 것이다. 참고자료에서 두 라이브러리 모두에 대한 다운로드 링크와 지시사항을 찾을 수 있다. 이러한 라이브러리를 설치할 때에 위치를 반영하는 PHP 'include_path'를 업데이트하는 것을 유의하자.
이 두 옵션 중에 어느 것이 더 나은가? 지금으로서는 Google Buzz PHP 클라이언트 라이브러리가 OAuth 인증 지원도 포함되어 있기 때문에 우위를 점한다. 이 지원으로 인해 Google Buzz 서비스로 인증된 요청을 전송하는 것과 연관된 작업이 엄청나게 줄어든다. 전문가 사용자들은 여전히 Zend_Rest_Client 라이브러리와 Zend_Oauth 컴포넌트를 결합하여 동일한 결과를 달성할 수 있지만, 그 프로세스는 조금 더 복잡하다. 따라서 비록 처음 몇 개의 예제에서 인증되지 않은 요청에 대해 Zend_Rest_Client 라이브러리의 사용을 보여주지만, 이 기사에서의 예제들은 Google Buzz PHP 클라이언트 라이브러리를 활용할 것이다.
목록 2에서는 사용자의 공개 액티비티 피드(목록 1과 동일한 피드)를 검색하고 구문 분석하도록 Google Buzz PHP 클라이언트 라이브러리를 사용하는 방법을 보여준다.
목록 2. 버즈 PHP 클라이언트로 공개 게시 나열하기
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->getPosts('@public', '@me');
// iterate through feed data
echo '<h1>' . $result->title . '</h1>';
echo count($result->posts) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
echo isset($post->links['alternate'][0]->href) ?
'<a href="' . $post->links['alternate'][0]->href .
'">' . $post->title . '</a>' : $post->title;
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
목록 2는 소스 파일을 포함하여 시작한 후에 새 buzz 오브젝트를 작성한다. 이 buzz
오브젝트는 Google Buzz API와 통신하기 위한 중심 지점의 역할을 담당하여 Google Buzz 데이터에 액세스하기 위한 다양한 메소드를 노출한다. 오브젝트를 초기화하기 위해 생성자에게 두 개의 인수를 전달한다.
- 올바르게 구성된
buzzStorage오브젝트이며, 로컬 캐싱이 어떻게 나타날지 지정한다. Google Buzz PHP 클라이언트 라이브러리는 APC(Alternative PHP Cache), memcached 및 파일 기반 캐싱을 지원하며, 각각buzzApcStorage,buzzMemcacheStorage및buzzFileStorage클래스로 표현된다. - 올바르게 구성된
buzzOAuth오브젝트. 이 오브젝트는 정적buzzOAuth::performOAuthLogin()메소드로 생성되며, 이는 두 개의 인수인buzzStorage오브젝트와 로컬 사용자 ID를 수락한다.buzzOAuth::performOAuthLogin()은 그러면 Google 서버로 OAuth 인증의 수행을 처리하여, 사용자에게 사용자의 Google Buzz 데이터로의 애플리케이션 액세스를 수락하거나 거부하는 적절한 프롬프트를 표시하고 필요한 재이동을 수행한다.
기본 buzz 오브젝트를 작성하면 오브젝트의
getPosts() 메소드를 사용하여 사용자의 액티비티 피드에 액세스할 수 있다. 이 메소드는 피드 결과에 포함되는 다섯 개의 인수인 피드 유형, 사용자 ID 및 댓글 수, 좋아요 및 게시를 수락한다. 이 메소드의 리턴 값은 내포된 PHP 오브젝트의 시리즈이며, 각각은 내재된 Atom 결과 피드에 엔트리를 표현한다. 이제 이 오브젝트 콜렉션을 반복하는 것이 매우 간편하게 되어, 표준 오브젝트->특성 표기를 사용하여 표시하기 위해 관련된 정보를 추출한다.
그림 1에는 결과의 모습을 실례로 보여준다.
그림 1. 공개 게시 목록
이제 피드 유형에 대해 간략하게 살펴보자. Google Buzz API는 다음 세 가지의 피드 유형을 제공한다.
- 사용자의 공개(public) 피드에는 사용자의 공개 게시가 들어 있고
@public으로 참조된다. 이 피드는 대개 https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@public에 위치한다. - 사용자의 소비(consumption) 피드에는 팔로우되는 사용자로부터의 게시가 들어 있고
@consumption으로 참조된다. 이 피드는 대개 https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@consumption에 위치한다. - 사용자의 개인(personal) 피드에는 사용자의 공개 및 비공개 게시가 들어 있고
@personal로 참조된다. 이 피드는 대개 https://www.googleapis.com/buzz/v1/activities/YOUR_ID/@personal에 위치한다.
consumption 및 personal 피드는 공개 피드에서는 필요하지 않은 인증이 필요하다. 특수 사용자 ID 문자열 @me는 숫자 Google ID 대신에 "현재 인증된 사용자"를 참조하는 편리한 바로 가기로 사용될 수도 있다.
목록 3은 Zend_Rest_Client 라이브러리를 사용하여 목록 2에 상응하는 결과를 만든다.
목록 3. Zend REST 클라이언트로 공개 게시 나열
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
try {
// get feed of user public activities
$client = new Zend_Rest_Client('https://www.googleapis.com/buzz/v1/
activities/YOUR_ID_HERE/@public');
$result = $client->get();
// iterate through returned feed
echo '<h1>' . $result->title . '</h1>';
echo count($result->entry) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->entry as $entry) {
echo '<li>';
echo isset($entry->link[0][@href]) ? '<a href="' .
$entry->link[0][@href] . '">' . $entry->content .
'</a>' : $entry->content;
echo ' (' . date("d M Y h:i", strtotime($entry->published)) . ')';
echo '</li>';
}
echo "</ol>";
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
목록 3에서 먼저 Zend 클래스 라이브러리를 로드한 후 Zend_Rest_Client 클래스의 인스턴스를 초기화한다. 이전에 목록 1에서 수행한 것과 같이 이 클라이언트를 사용하여 사용자의 공개 피드에 대한 인증되지 않은 GET 요청을 초기화한다. 이 경우에 피드 URL에는 사용자의 Google 프로필 ID가 들어 있어야 함을 참고한다. 그러면 리턴된 Atom 피드는 구문 분석되고 Zend_Rest_Client_Response 오브젝트로 변환된다. 이전처럼 이제 이 오브젝트 콜렉션을 반복하고 그로부터 특정 게시의 세부사항을 추출하는 것이 매우 간편하게 된다.
Google이기 때문에 Google Buzz API가 검색 기능을 포함하지 않는다면 정말 이상할 것이다. 그러므로 API는 공개 검색 피드를 제공하여, 이는 모든 사용자가 모든 공개 게시를 검색하고 지정된 검색 용어와 일치하는 것을 리턴하는 데 사용될 수 있다. 공개 검색 피드는 https://www.googleapis.com/buzz/v1/activities/search에서 액세스할 수 있다.
Google Buzz PHP 클라이언트 라이브러리를 사용하는 경우 간단히 search() 메소드를 호출하여 쿼리 용어에 이를 전달할 수 있다. 목록 4에서 시연한다.
목록 4. 버즈 PHP 클라이언트로 게시 검색하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching public activity feeds</title>
<style>
body {
font-family: Verdana;
}
li {
border-bottom: solid black 1px;
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post"
action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->search($_POST['q']);
// iterate through feed data
echo '<h1>' . $result->title . '</h1>';
echo count($result->posts) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
echo isset($post->links['alternate'][0]->href) ?
'<a href="' . $post->links['alternate'][0]->href .
'">' . $post->title . '</a><br/>' :
$post->title . '<br/>';
echo $post->person->name . ' (' .
date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
목록 4는 사용자에게 웹 양식을 표시하여 하나 이상의 검색 용어를 입력하도록 표시하여 시작한다. 이 양식이 제출되면 스크립트는 새 버즈 오브젝트를 작성하고
검색 용어를 오브젝트의 search() 메소드로 전달한다. 이 메소드는 필수 REST 요청을 Google Buzz API로 생성하고
결과 피드를 buzzPost 오브젝트의 콜렉션으로 변환한다. 이제 할 일은 콜렉션을 루프 처리하여 각각의 콘텐츠, 작성자 및 게시 날짜를 인쇄하는 것만 남았다.
그림 2는 chocolate에 대한 검색 결과를 보여준다.
그림 2. Google Buzz 검색의 결과
검색 피드가 공개이기 때문에 인증되지 않은 HTTP 클라이언트를 사용하여 이를 쿼리할 수도 있다. 목록 5는 검색 피드 URL을 직접 요청하고 응답을 처리하는 Zend_Rest_Client 라이브러리를 사용하여 보여준다.
목록 5. Zend REST 클라이언트로 게시 검색하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching public activity feeds</title>
<style>
body {
font-family: Verdana;
}
li {
border-bottom: solid black 1px;
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
try {
if (empty($_POST['q'])) {
throw new Exception('No search term provided');
}
// search all feeds
$url = 'https://www.googleapis.com/buzz/v1/activities/search?q=' .
urlencode($_POST['q']);
$client = new Zend_Rest_Client($url);
$result = $client->get();
// iterate through returned feed
// display results
echo '<h1>' . $result->title . '</h1>';
echo count($result->entry) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->entry as $entry) {
echo '<li>';
echo '<a href="' . $entry->link[0][@href] . '">' .
$entry->content . '</a><br/>';
echo $entry->author->name;
echo ' (' . date("d M Y h:i", strtotime($entry->published)) . ')';
echo '</li>';
}
echo "</ol>";
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
목록 5는 새 REST 클라이언트를 초기화하고 이를 사용하여 인증되지 않은 GET 요청을 공개 검색 피드로 전송한다. 사용자 제공 검색 매개변수는
URL 인코드되었으며, 특수 q 매개변수를 통해 요청으로 추가된다. 목록 3과 같이 foreach() 루프를 사용하여 생성된 오브젝트 콜렉션에 대해 반복하여 목록 4의 결과물에 상응하는 결과물을 만든다.
다른 Google 피드와 마찬가지로 Google Buzz API를 통해 개발자들은 REST 쿼리에 다음 매개변수를 추가하여 결과물을 사용자 정의할 수 있다.
alt매개변수는 피드 형식을 지정한다('atom' 또는 'json').max-results매개변수는 검색하는 최대 엔트리의 수를 지정한다.max-comments매개변수는 엔트리당 검색하는 최대 댓글의 수를 지정한다.lat및lon매개변수는 검색 결과에 대한 지리적 필터를 지정한다.
고급 검색 쿼리 연산자를 요청 URL에 첨부하는 것도 가능하다. 예제와 함께 전체 연산자 목록은 Google Buzz API 개발자 가이드(링크는 참고자료 참조)를 살펴보자.
게시의 나열과 검색을 처리한다. 이제는 이를 추가, 편집하고 삭제해 보자.
REST 호환 API로서 Google Buzz API는 정규 HTTP 동사의 사용을 지원하여 필요한 조치 유형을 표시한다. 따라서 새 게시를 추가하려면 인증된 POST 요청을 피드 URL로 간단히 전송하여 게시 콘텐츠를 요청 본문에 추가한다. 유사한 방식으로 게시를 편집하거나 삭제하기 위해 게시 ID가 들어있는 인증된 PUT 또는 DELETE 요청을 피드 URL로 전송한다.
개발자들이 더 간편하도록 Google Buzz PHP 클라이언트 라이브러리는 위의 태스크를 두 개의 메소드인 updatePost()와 deletePost()로 압축한다. 이를 시연하기 위해 PHP로 새 Google Buzz 게시를 추가하는 방법을 보여주는 목록 6을 고려하자.
목록 6. 게시 추가하기
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// add a new post
$object = new buzzObject('Adding this post through the Buzz API...woohoo!');
$post = buzzPost::createPost($object);
$result = $buzz->updatePost($post);
echo 'Added new post with ID: ' . $result->id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
비즈니스의 첫 번째 순서는 새 buzz 인스턴스를 작성하는 것이다. 그 후에 새 buzzObject 인스턴스를 작성하고 이를 게시되는 콘텐츠로 초기화한다. 그런 다음 이 buzzObject를
buzzPost::createPost() 메소드를 통해 Google Buzz 엔트리로 변환하고,
updatePost() 메소드를 사용하여 전체 요청 패킷을 Google Buzz 서버로 POST한다. 새 게시가 작성되면 서버는 201(Created) 상태 코드와 새롭게 추가된 게시를 표현하는 전체 <entry> 단편을 다시 전송한다.
그림 3. 새 Google Buzz 게시 추가하기의 결과
게시를 편집하는 것은 조금 다르다. 먼저 새 게시를 작성한 후에 그 ID를 바꾸려는 게시의 ID로 설정해야 한다. 목록 7에서는 이를 보여준다.
목록 7. 게시 수정하기
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// edit a post
$object = new buzzObject('Updating this post through the Buzz API...yeehaw!');
$post = buzzPost::createPost($object);
$post->id = 'tag:google.com,2010:buzz:z133';
$result = $buzz->updatePost($post);
echo 'Updated post with ID: ' . $result->id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
목록 7에서 코드는 정확한 콘텐츠로 새 buzzPost 오브젝트를 초기화하고 그 ID를 편집된 게시의 ID로 설정한다.
updatePost() 메소드는 그러면 PUT 요청을 개정된 엔트리로 Google Buzz 서버에 전송한다. 성공하면 서버는 201(OK) 상태 코드와 개정된 <entry>로 응답할 것이다. 그림 4는 비슷한 결과물을 보여준다.
그림 4. Google Buzz 게시 편집하기의 결과
게시를 삭제하는 것은 비교적 간단하다. 게시 ID를 deletePost() 메소드에 제공하면 Google Buzz PHP 클라이언트 라이브러리는 DELETE 요청을 REST API로 구축하고 전송할 것이다. 목록 8에서 이 프로세스를 보여준다.
목록 8. 게시 삭제하기
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// delete a post
$id = 'tag:google.com,2010:buzz:z13';
$buzz->deletePost($id);
echo 'Deleted post with ID: ' . $id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
|
그림 5는 결과물을 표시한다.
그림 5. Google Buzz 게시 삭제하기의 결과
키워드 검색이 가능할 뿐만 아니라 Google Buzz API는 사람을 이름으로 검색할 수도 있다. 이는 HTTP GET 요청을 https://www.googleapis.com/buzz/v1/people/search라는 URL에 전송하여, 이에 필수 검색 용어를 추가하여 수행된다. 이 요청으로의 응답은 일치하는 사용자 목록과 함께 그 이름과 Google ID가 들어있는 Atom이나 JSON 피드이다.
목록 9는 Google Buzz PHP 클라이언트 라이브러리를 사용하여 이를 수행하는 방법을 보여준다.
목록 9. 버즈 PHP 클라이언트로 사용자 검색하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching for people</title>
<style>
table {
border-collapse: yes;
}
tr {
border-bottom: solid black 1px;
}
td {
vertical-align: top;
border: solid black 1px;
}
li {
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for people: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->searchPeople($_POST['q']);
// iterate through feed data
echo '<h1>Search Results</h1>';
echo '<table>';
foreach ($result as $person) {
echo '<tr>';
// display user full name and photo
echo '<td><img src="' . $person->thumbnailUrl .
'" /><br/>';
echo '<strong>' . $person->name .
'</strong></td><td>';
// fetch user's public feed
$result = $buzz->getPosts('@public',
$person->id, false, false, 3);
// iterate through feed data
echo 'Recent updates: <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
$url = isset($post->links->self[0]->href) ?
$post->links->self[0]->href : '#';
echo '<a href="' . $url . '">' . $post->title . '</a>';
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol></td>';
echo '</tr>';
}
echo '</table>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
목록 9는 사용자가 사람의 이름을 검색 양식에 입력하도록 요청한 후에
searchPeople() 메소드를 사용하여 일치하는 사람을 Google
버즈 API에 쿼리한다. 이 메소드의 리턴 값은 buzzPerson 오브젝트의 콜렉션이며, 각각에는 사용자에 대한 정보, 즉 이름, 성, Google ID, Google 프로필 URL, 사진 URL 및 다른 개인 정보가 들어있다. 목록 9는 이 정보를 추출한 후에 Google ID를 getPosts() 메소드로 사용하여 사용자의 가장 최신의 세 개의 게시도 검색한다. 그림 6에 있는 것과 같이 이 모든 정보는 읽기 가능한 웹 페이지에 형식화된다.
그림 6. Google Buzz 개인 검색의 결과
목록 10은 동일한 결과를 완수하기 위해 Zend_Rest_Client 라이브러리를 사용하여 목록 9에 대한 대안을 제공한다.
목록 10. Zend REST 클라이언트로 사용자 검색하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Searching for people</title>
<style>
table {
border-collapse: yes;
}
tr {
border-bottom: solid black 1px;
}
td {
vertical-align: top;
border: solid black 1px;
}
li {
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Search for people: <input type="text" name="q" />
<input type="submit" name="submit" value="Search">
</form>
<?php
if (isset($_POST['submit'])) {
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');
try {
if (empty($_POST['q'])) {
throw new Exception('No search term provided');
}
// search people feed
$client = new Zend_Rest_Client('https://www.googleapis.com/buzz/v1/
people/search?q=' . urlencode($_POST['q']));
$result = $client->get();
// iterate through returned feed
// for each result, display user name and photo
echo '<h1>Search Results</h1>';
echo '<table>';
foreach ($result->entry as $entry) {
echo '<tr>';
echo '<td><img src="' . $entry->thumbnailUrl .
'" /><br/>';
echo $entry->displayName . '</td><td>';
// get feed of user's three most recent public posts
$client2 = new Zend_Rest_Client('https://www.googleapis.com/buzz/
v1/activities/' . $entry->id . '/@public?max-results=3');
$result2 = $client2->get();
echo 'Recent updates: <br/>';
echo '<ol>';
foreach ($result2->entry as $entry2) {
echo '<li>';
echo '<a href="' . $entry2->link[0][@href] . '">' .
$entry2->content . '</a>';
echo ' (' . date("d M Y h:i", strtotime($entry2->published)) . ')';
echo '</li>';
}
echo "</ol></td>";
echo '</tr>';
}
echo '</table>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
}
?>
</body>
</html>
|
목록 10은 Zend_Rest_Client 라이브러리를 사용하여 사람 검색 서비스에 대한 REST 엔드포인트에 직접 액세스하여 Atom 피드의 오브젝트 표현을 리턴한다. 이 오브젝트 콜렉션은 관련된 정보를 추출하기 위해 필요한 대로 사용할 수 있다. 쿼리 용어는 이 경우에 수동으로 URL 인코드되어야 함을 참고한다.
사용자는 Google Buzz를 통해 서로를 "팔로우"할 수 있다. 사용자를 자동으로 팔로우하면 게시가 사용자의 consumption 피드의 일부가 된다. Google Buzz API를 통해 이 정보는 https://www.googleapis.com/buzz/v1/people/YOUR_ID/@groups/@followers 및 https://www.googleapis.com/buzz/v1/people/YOUR_ID/@groups/@following 각 URL에서 follower 및 following 피드를 통해 사용 가능하게 된다.
PHP 클라이언트 라이브러리를 사용하여 이 정보를 보려면 followers() 및 following() 메소드를 사용하며, 이는 사용자의 팔로워와 팔로잉을 표현하는 buzzPerson 오브젝트 콜렉션을 리턴한다. 목록 11에 예제가 있다.
목록 11. 팔로워와 팔로잉 나열하기
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// get followers
$followers = $buzz->followers('@me');
echo '<h1>Currently being followed by:</h1>';
foreach ($followers as $person) {
displayUserBlock($person);
}
// get following
$following = $buzz->following('@me');
echo '<h1>Currently following:</h1>';
foreach ($following as $person) {
displayUserBlock($person);
}
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
// render user block
function displayUserBlock($person) {
// get object from global scope
global $buzz;
// display user full name
echo '<strong>' . $person->name . '</strong><br/>';
// fetch user's public feed
$result = $buzz->getPosts('@public', $person->id, false, false, 3);
// iterate through feed data
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
$url = isset($post->links->self[0]->href) ?
$post->links->self[0]->href : '#';
echo '<a href="' . $url . '">' . $post->title .
'</a>';
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ')';
echo '</li>';
}
echo '</ol>';
}
?>
|
목록 11은 먼저 followers() 메소드를 사용하여 인증된 사용자의 팔로워 목록을 검색한다. 이 메소드의 리턴 값은 buzzPerson 오브젝트의 콜렉션이며, 각각은 사용자 정의된 displayUserBlock() 메소드에 전달된다. 이 메소드는 각 팔로워의 이름과 ID를 검색한 후에 두 번째 요청을 만드는 ID를 사용하여, 이번에는 getPosts() 메소드를 통해 팔로워의 세 개의 최신 게시들을 검색한다. 이 정보는 표시를 위해 형식화되었다.
이 후에 following() 메소드를 사용하여 인증된 사용자에 의해 현재 팔로우된 사용자 목록을 검색한다. 이 메소드로 리턴된 콜렉션은 유사한 방식으로 처리된다.
Google Buzz API도 프로그래밍 방식으로 특정 사용자를 팔로우하거나 팔로우 취소할 수 있다. 이러한 API 메소드는 버즈 오브젝트의 follow() 및 unfollow() 메소드에 반영되며, 둘 다 사용자 ID를 수락하며 인증된 사용자의 팔로우 큐에서부터 사용자를 추가하거나 삭제한다.
이제 Google Buzz API가 작동하는 방식에 대해 조금 알았으니, 이를 대화식으로 사용하는 방법을 시연하는 간단한 웹 애플리케이션을 만들어 보자. 목록 12는 목록 2를 업데이트하여 추가 양식을 작성하고 각 게시에 삭제 링크를 첨부한다. 이러한 추가를 통해 인증된 사용자는 공개 피드를 볼 수 있고 새 게시를 대화식으로 추가하거나 여기에서부터 기존 게시를 삭제할 수 있다. —이 모두에서 Google Buzz 인터페이스를 사용하지 않는다.
목록 12. 사용자 게시 나열하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<style>
body {
font-family: Verdana;
}
li {
margin: 10px;
padding: 2px;
width: auto;
padding-bottom: 20px;
}
</style>
</head>
<body>
<h1>Add New Post</h1>
<form method="post" action="add.php">
Message: <br/>
<textarea name="buzz" cols="60" rows="5"></textarea><br/>
<input type="submit" name="submit" value="Post!" />
</form>
<h1>Recent Posts</h1>
<?php
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// fetch authenticated user's public feed
$result = $buzz->getPosts('@public', '@me');
// iterate through feed data
echo count($result->posts) . ' post(s) found. <br/>';
echo '<ol>';
foreach ($result->posts as $post) {
echo '<li>';
echo isset($post->links['alternate'][0]->href) ?
'<a href="' . $post->links['alternate'][0]->href .
'">' . $post->title . '</a>' : $post->title;
echo ' (' . date("d M Y h:i", strtotime($post->published)) . ') ';
echo '<a href="delete.php?id=' . $post->id . '">[Delete this post]</a>';
echo '</li>';
}
echo '</ol>';
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
</body>
</html>
|
목록 12는 두 개의 부분으로 구분된다.
- 첫 번째 부분은
buzz오브젝트를 초기화하고getPosts()메소드를 사용하여 사용자의 공개 피드를 검색한다. 각 게시는 사용자가 delete.php 스크립트를 통해 게시를 삭제할 수 있는 링크가 함께 나와있다. 게시 ID는 표준 GET 매개변수로 delete.php 스크립트로 전달된다. - 두 번째 부분에는 HTML 양식이 들어있으며, 이는 사용자가 새 게시를 입력하는 입력 필드가 제공된다. 양식을 통해 제출된 데이터는 POST를 통해 add.php 스크립트로 전송된다.
목록 13에는 add.php 스크립트가 들어있으며, 이는 POST를 통해 입력 데이터를 수신하며 이를
buzzPost 오브젝트로 변환한다. 그러면 이 오브젝트는 이전에 논의한 updatePost() 메소드를 통해 POST 요청으로
Google Buzz 서비스에 전송된다. 목록 13은 코드를 보여준다.
목록 13. 새 게시 추가하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
<?php
if (!isset($_POST['buzz'])) {
die('ERROR: Please enter some Buzz content!');
}
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// add a new post
$object = new buzzObject($_POST['buzz']);
$post = buzzPost::createPost($object);
$result = $buzz->updatePost($post);
echo 'Added new post with ID: ' . $result->id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
</body>
</html>
|
목록 14에는 delete.php 스크립트가 들어있으며, 이는 삭제되는 스크립트의 ID를 수신하고 이 ID를 deletePost() 메소드로 전달한다. 이 메소드는 DELETE 요청을 구축하고 이를 실행하기 위해 Google Buzz API로 넘겨준다. 그 코드는 다음과 같다.
목록 14. 게시 삭제하기
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
</head>
<body>
<?php
if (!isset($_GET['id'])) {
die('ERROR: Please provide a valid Buzz ID for deletion');
}
// include PHP client library
require_once 'buzz.php';
try {
// set up file store
$storage = new buzzFileStorage('/tmp/cache');
// get user ID
$uid = 1;
// perform authentication with Google
$auth = buzzOAuth::performOAuthLogin($storage, $uid);
// initialize Buzz object
$buzz = new buzz($storage, $auth);
// delete a post
$buzz->deletePost($_GET['id']);
echo 'Deleted post with ID: ' . $id;
} catch (Exception $e) {
echo 'ERROR:' . $e->getMessage();
}
?>
</body>
</html>
|
그림 7은 목록 12의 출력을 표시한다.
그림 7. Google Buzz 상호작용에 대한 웹 양식
이러한 예제가 시연하는 대로 Google Buzz API 및 PHP 클라이언트 라이브러리를 통해 버즈 게시들과 액티비티 스트림을 직접 PHP 애플리케이션으로 통합하는 것은 가능하다. 이 기사에서 예제는 단지 빙산의 일각을 다룬 것에 불과하다. Google Buzz로 다음을 비롯하여 훨씬 더 많은 작업을 수행할 수 있다.
- 비공개(private) 액티비티 작성하기
- 무음(mute), 무음 취소(unmute) 및 좋아요 게시
- 댓글 작성 및 편집
- 고급 검색 쿼리 작성
이 글을 쓰는 시점에도 Google Buzz API는 여전히 개발 중이기 때문에 앞으로 훨씬 더 나은 장점을 기대해 볼 수 있다!
요약하면 Google Buzz API는 개발자들에게 공개 버즈 콘텐츠를 어느 웹 애플리케이션에서나 통합하기 위한 세련되고 양식 중립적인 메커니즘을 제공한다. 이는 매시업이나 Google Buzz로 자체적인 사용자 정의 인터페이스를 빌드하기에 훌륭하다. 한 번 시도해보고 제공 내역을 알아보자!
교육
- Google Buzz 서비스 약관: Google Buzz 콘텐츠의 사용을 이 서비스 약관의 제3자 적용 면을 기반으로 하자.
- Google Buzz 개발자 정책 및 브랜드 가이드라인: Google Buzz를 사용할 수 있는 방법에 대해 읽어보고 적용하도록 이러한 정책과 가이드라인을 준수를 보장하자.
- Google 계정: 무료 계정을 등록하여 시작할 수 있다.
- 개발자 가이드 및 REST 참조: Atom이나 JSON 데이터 구조에 액세스하는 RESTful 호출 스타일을 사용하는 Google Buzz API 및 API의 일반 기능에 대해 알아보자.
- Google OAuth 인증: OAuth 프로토콜의 Google의 구현으로 사용자의 데이터에 대한 액세스하기 위한 웹 애플리케이션의 요청을 인증하자.
- Google 인증 서비스: 웹 애플리케이션을 무료로 등록하자.
- Google Buzz PHP 클라이언트 라이브러리 설치 및 사용: 웹 서버에서부터 Google Buzz 데이터로 작동하는 이 클라이언트 라이브러리를 사용하는 방법을 이해하자.
- Google Buzz API 개발자 포럼: Google Buzz API 개발에 관련된 토론에 참여하자.
- Google Social 웹 블로그: Google Buzz에 관한 새로운 소식을 확인할 수 있다.
- Programmer's Reference Guide: Zend_Rest_Client 라이브러리에 대해 더 자세히 읽어보자.
- Writing a REST Web Service and Client With Zend_Controller(Jon Lebensold저, Zendcasts, 2009년 4월): 이 스크린캐스트에서 REST 웹 서비스와 클라이언트를 빌드하는 방법에 대해 알아보자(38.50분).
- developerWorks의 XML 영역: XML 영역에서 기술 향상에 도움이 되는 참고자료를 얻을 수 있다.
- My developerWorks: developerWorks와 관련된 경험을 개인화할 수 있다.
- IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.
- XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다. 또한 더 많은 XML 팁을 읽어본다.
- developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.
- Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.
- developerWorks
podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
- developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.
제품 및 기술 얻기
- Google Buzz PHP 클라이언트 라이브러리: 다운로드하여 서버에서 Google Buzz 데이터로 작동해보자. 언어 선택은 PHP이다.
- Zend 프레임워크: 더 안전하고 믿을 수 있는 현대식 Web 2.0 애플리케이션과 웹 서비스를 광범위하게 사용 가능한 API로 다운로드하고 빌드하자.
- IBM 제품 평가판: IBM SQA Sandbox의 온라인 시험판을 다운로드하거나 살펴보고 DB2®,
Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
토론
- XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.
- developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.