ajax로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

ajax로 검색한 결과
등록일:2008-03-18 17:33:27
작성자:
제목:RSS의 새로운 한계에 도전하기 (한글)


RSS를 사용하여 결합적 데이터베이스 만들기

developerWorks
10 페이지 중 1 페이지Go to the next page

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

이 페이지 출력

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


난이도 : 중급

Jonathan Levin, 강사 겸 컨설턴트, Freelance

2008 년 3 월 11 일

본 튜토리얼은 간단한 관계형 데이터베이스의 기능을 흉내내기 위해 잘 알려진 RSS(Really Simple Syndication) 포맷의 혁신적인 결합적 속성을 혁신적으로 사용하는 방법을 다룹니다. 개인 주소록이나 달력을 사용하듯이 연락처와 회의 정보를 저장하는 데 RSS 채널을 사용하는 방법을 보여주는 것입니다. 이는 items나 guids 같은 RSS 요소와 속성을 사용하여 관계형 데이터의 신경망 같은 것을 만들 것입니다.

시작하기 전에

본 튜토리얼은 유명한 RSS 포맷이 무엇인지, 이 포맷으로 무엇을 할 수 있는지 배우고자 하는 이들을 위해 작성했다. 특히 RSS의 잘 알려지지 않은 기능을 사용하여 더 나은 데이터 저장소를 제공하는 방법을 보여준다.

본 튜토리얼은 XML 기본 개념을 이해하는 독자를 위해 썼지만 RSS에 익숙할 필요는 없다. 프로그래밍 예제는 PHP를 사용했지만 다른 프로그래밍 언어에도 기본 개념은 적용된다.

본 튜토리얼에 대해

많 은 사람이 RSS를 사이트 피드 같은 배급의 목적에 사용한다고 알고 있지만 몇 년 전부터 데이터 배포나 연락처 관리 같은 목적으로 여타 애플리케이션의 저장 포맷으로도 쓰여 왔다. 데이터를 RSS 형태로 저장함으로써 RSS 수집/구독 프로그램을 데이터에 접근하는 데 사용할 수 있다.

즉, 예전에 관계형 데이터에서 저장됐던 방식으로 RSS를 사용하여 정보를 저장할 수 있게 된 것이다.

본 튜토리얼은 일단 RSS 포맷과 몇 가지 실제 피드 샘플을 소개하는 것으로 시작한다. 그리고 나서 기존 포맷을 바꿔 이를 다른 목적(임의 데이터 아이템과 이들의 결합을 저장하는 것)을 위해 재정의한다. 테이블 세 개로 데이터베이스 포맷을 정의하고 이 테이블들을 질의하여 전통적인 SQL SELECT 모두를 흉내낼 수 있음을 보여주고 결합적 룩업을 제공한다. 마지막으로 질의 결과를 처리하거나 XML 폼으로 남겨두거나 이를 XSLT(XML StyleSheet Transformation Language)를 사용하여 사용자에게 보여줄 수 있는 내용으로 변환하는 방법을 다룬다.




위로


필요한 사전지식

본 튜토리얼을 따라하려면 다음 도구들이 필요하다.

  • PHP: 버전은 상관없이 PHP가 있으면 된다. 본 튜토리얼에서는 XML을 처리하는 데 전통적 방식의 DOM(Document Object Model) 대신 PHP 백엔드의 텍스트 처리를 사용한다.
  • XML과 XSLT 파일을 편집하기 위해 XML 편집기가 필요하다. 필자는 UNIX®에서는 vim을, Windows®에서는 메모장을 사용한다.



위로

--다음페이지--

RSS를 사용하여 결합적 데이터베이스 만들기

developerWorks
Go to the previous page10 페이지 중 2 페이지Go to the next page

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

이 페이지 출력

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


RSS 개요

본 절은 RSS 포맷에 대해 설명하고 샘플 피드를 제공하는 것으로 시작한다. 또한 RSS 피드의 모든 요소를 설명하고 RSS를 데이터 저장소로 사용하는 것에 대해 설명한다.

RSS란 무엇인가?

RSS 는 웹 사이트와 내용을 배급하거나 발행하는 데 널리 채택된 포맷이다. 사이트에서 보이는 HTML과는 다르게 RSS는 웹 사이트를 몇 가지 아이템이 들어 있는 XML 채널로 요약한다. 즉, RSS는 XML의 특정 문법이다. RSS는 기본 요소와 간단한 스키마를 사용하여 채널 요소 내에서 아이템 요소를 캡슐화할 수 있다. 여기서 아이템은 블로그 엔트리처럼 일반 정보일 수 있지만 이 맥락에서 아이템은 이미지, URL, 클립, 텍스트 데이터 등 원하는 무엇이든 될 수 있다. 채널은 피드 소스로, 포함하는 아이템의 집합체 역할을 하고 모든 아이템에 공통의 메타데이터를 제공한다. 객체 지향 관점에서는 채널 객체에는 0 또는 그 이상의 아이템 객체의 배열이 들어있다고 말할 수 있다.

뉴욕 타임즈 같은 온라인 뉴스 사이트부터 벼룩시장(Craig's List) 같은 온라인 게시판이나 연재만화(Dilbert, XKCD) 등까지 많은 사이트에서 현재 RSS 피드를 제공한다. 모든 브라우저에서 RSS를 지원하고(파이어폭스, 오페라, 사파리, 인터넷 익스플로러 7에 이르기까지 널리 채택됐다), 맥OS X과 비스타 모두 위젯과 가젯을 통해 RSS를 사용자 데스크톱과 통합하려는 노력을 하고 있다.

XML 폼에서 임의의 내용을 요약함으로써 더 많은 가능성이 열린다. 이 중 현재 가장 중요한 가능성은 특화된 애플리케이션(RSS 취합자라 부르는)이 내용을 더 쉽게 자동으로 처리할 수 있다는 것이다. 효율성에 문제가 있는 HTML 파싱 대신 RSS 포맷은 기계에서 처리하기 편리한 XML을 제공한다. XML은 메타 데이터 태그 덕에 더 쉽게 처리 과정을 자동화한다. 이를 통해 취합자(aggregator)는 개별 내용 아이템에 집중할 수 있고 키워드 분류로 독자의 구미에 맞는 내용을 추측할 수 있다.




위로


샘플 RSS 피드

하 지만 RSS 피드를 더 강력하게 만드는 것은 우아하면서도 간단한 스키마뿐 아니라 어떤 채널 아이템 폼이든 넣어 쉽게 확장할 수 있다는 사실에 있다. RSS 요소에 추가 XML 이름공간을 넣어 확장할 수 있다. 최고의 예제는 야후의 날씨 피드로 Listing 1에서 주석과 함께 볼 수 있다.


Listing 1. 샘플 RSS 피드—우편번호 02139 지역의 야후 일기 예보
                    
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<rss version="2.0"
xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<channel>
<title>Yahoo! Weather - Cambridge, MA</title>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/
Cambridge__MA/*http://weather.yahoo.com/forecast/USMA0066_f.html</link>
<description>Yahoo! Weather for Cambridge, MA</description>
<language>en-us</language>
<lastBuildDate>Wed, 28 Nov 2007 2:54 pm EST</lastBuildDate>

<ttl>60</ttl>
<yweather:location city="Cambridge" region="MA" country="US" />
<yweather:units temperature="F" distance="mi" pressure="in" speed="mph" />
<yweather:wind chill="38" direction="350" speed="9" />
<yweather:atmosphere humidity="43" visibility="1609"
pressure="30.38" rising="1" />
<yweather:astronomy sunrise="6:50 am" sunset="4:14 pm" />

<image>
<title>Yahoo! Weather</title>
<width>142</width>
<height>18</height>
<link>http://weather.yahoo.com/</link>
<url>http://l.yimg.com/us.yimg.com/i/us/nws/th/main_142b.gif</url>
</image>

<item>
<title>Conditions for Cambridge, MA at 2:54 pm EST</title>

<geo:lat>42.38</geo:lat>
<geo:long>-71.12</geo:long>
<link>http://us.rd.yahoo.com/dailynews/rss/weather/
Cambridge__MA/*http://weather.yahoo.com/forecast/USMA0066_f.html</link>
<pubDate>Wed, 28 Nov 2007 2:54 pm EST</pubDate>
<yweather:condition text="Mostly Cloudy" code="28" temp="43"
date="Wed, 28 Nov 2007 2:54 pm EST" />
<description><![CDATA[
<img src="http://l.yimg.com/us.yimg.com/i/us/we/52/28.gif" /><br />
<b>Current Conditions:</b><br />
Mostly Cloudy, 43 F<BR /><BR />
<b>Forecast:</b><BR />
Wed - Sunny. High: 45 Low: 31<br />
Thu - PM Showers. High: 48 Low: 29<br />
<br />
<a href="http://.........html">Full Forecast at
Yahoo! Weather</a><BR/>
(provided by The Weather Channel)<br/>
]]></description>
<yweather:forecast day="Wed" date="28 Nov 2007" low="31" high="45"
text="Sunny" code="32" />

<yweather:forecast day="Thu" date="29 Nov 2007" low="29" high="48"
text="PM Showers" code="39" />
<guid isPermaLink="false">USMA0066_2007_11_28_14_54_EST</guid>
</item>
</channel>
</rss><!-- p4.weather.sp1.yahoo.com compressed
Wed Nov 28 12:03:12 PST 2007 -->

이 경우 날씨 발견 요소를 내장한 RSS 인식 애플리케이션은 설명을 보여주거나(코드에 딸려오는 HTML 조각임을 알 수 있다) 원하는 아이템만 보여준다(예를 들어 day="Thu"yweather:forecast). 더 많은 문법이 발행되고 더 많은 의미(semantic)정보가 추가될수록 내용 배포 플랫폼으로 RSS 사용은 오늘날 HTML만큼이나 독보적인 존재가 될 것이다.

RSS의 유연성 덕에 RSS를 일반적인 데이터 저장 포맷으로 사용하려고 한다. 하지만 먼저 RSS가 제공하는 정보가 무엇인지 살펴보자.




위로


RSS 피드 내의 요소

표 1은 RSS 피드에서 발견할 수 있는 중요한 요소를 요약한다. 굵은 글씨의 요소는 선택적이지만 다른 요소들은 필수다. 대다수의 요소는 <channel> 컨텍스트나 <item> 컨텍스트에서 사용돼 피드 발행자가 채널 기본을 설정하면서 필요한 경우 아이템 당 기준으로 겹쳐쓸 수 있다.


표 1. RSS 피드의 주요 요소
요소
설명채널을 설명하는 하나 또는 두 문장의 설명으로 커서가 채널 이름 위에 있을 때 RSS 리더의 툴팁으로 사용된다.
링크채널의 URL(HTML 내용)
제목RSS 채널의 제목을 보여주고 채널 이름으로 사용된다.
이미지 선택적 이미지 자식 요소. 이미지는 다음과 같이 렌더되는 높이, 넓이, 제목, 링크, URL 자식을 가지고 있다.
<A href="link">
<IMG src="url" title="title" height="height" width="width" />










</A>

pubDate RFC822 시간으로 내용이 발행될 때 지정된다.
ttl 채널 내용을 캐싱하기 위한 초 단위로 제안되는 시간.
카테고리 특정 채널이나 아이템 분류
전역 고유 식별자 전역 고유 식별자. URL 또는 다른 식별자로 유일해야 하기 때문에 질문의 아이템에 정확하고 유일한 레퍼런스를 제공한다.

선 택적 요소는 특히 RSS에 강력한 기능을 추가한다. pubDate와 ttl(Time to Live-유효 시간)은 내용이 언제 유효한지, 유효한지 그렇지 않은지를 나타내 리더(reader)에서 한 편으로는 내용을 캐시하고 다른 한 편으로는 유효 기간이 지난 내용을 피할 수 있도록 한다. guid는 전역 고유 식별자로 본 애플리케이션에서 사용할 수 있도록 할 것이다. 이 글에서 대다수의 애플리케이션은 URL을 사용한다. 이 때 URL은 컨텍스트 내 어딘가에서 인용되지 않는 아이템이라면 실제 URL일 필요는 없다. 카테고리 요소는 내용의 의미 맥락(semantic context)을 추론하는 주요 요소다. Flickr나 Digg 등 태그를 사용하는 사이트들 봤다면 카테고리가 작동하는 것을 봤을 것이다.

표 1에는 필요한 목록만 간략히 있다. RSS 명세서에서 요소의 전체 목록을 찾을 수 있다(참고자료의 링크를 보자). 또한 RSS 컨테이너 컨텍스트에서 요소의 이름공간만 선언해준다면 어떤 요소든 추가할 수 있다.




위로


RSS를 데이터 저장소로 사용하기

지 금까지 새로운 것은 없었다. RSS는 여느 스펙과 다를 바 없다. 개인적인 취합자나 특화된 리더 또는 브라우저에 내장된 RSS 지원을 사용하여 로 RSS 피드를 이미 사용했을 확률이 높다. 하지만 RSS를 실제 데이터 저장소 포맷으로 사용할 수 있다는 사실은 몰랐을 것이다.

데이터베이스의 전통적인 모델에서 데이터는 테이블에 저장됐다. 테이블은 하나 또는 그 이상의 키로 색인되며 아이템은 테이블에 레코드 형태로 저장된다. 구조화된 질의 언어(대체로 SQL)를 사용하여 특정 테이블에서 레코드나 필드를 찾아올 수 있고 이를 다른 테이블의 데이터로 링크(또는 JOIN)할 수 있다. 본 튜토리얼에서 보여주는 모델은 더 결합적이며 인간 뇌의 사고 과정을 따라했다. 시작하기 전에 결합이 어떻게 작동하는지 이해해보자.

인 간의 두뇌는 세포들(또는 신경)의 복잡한 덩어리이며 축색돌기로 각각 연결돼 있다. 어떻게 작동하는지에 대한 자세한 설명은 본 튜토리얼의 범위 밖이지만(또한 이 글을 쓰는 지금 실제로 존재하지도 않는다) 각 신경이 실제 RSS 아이템이라는 단순화한 모델을 생각해보자. 이 아이템은 제목, 가능한 설명, 그리고 제일 중요하게 guid에 유일한 표현을 가지고 있다. 선택적으로 아이템과 관련된 모든 종류의 특정 데이터를 가지고 있을 수도 있지만, 일단 여기서는 차치하자. 이제 이 아이템이 링크가 되는 축색돌기로 다른 아이템과 연결될 수 있다. 여기서 무엇을 갖겠는가? 아이템과 링크의 토폴로지가 생겨나고 그래서 결합된 네트워크라고 불린다.

왜 이 이야기를 언급하는가? 그 이유는 본 튜토리얼에서 마치 신경이 축색돌기를 통해 각각 연결되듯 각기 다른 데이터(사람, 장소, 약속)가 RSS 데이터를 통해 서로 연결되는 애플리케이션을 만들 것이기 때문이다.

이제 데이터베이스를 만들어보자.




위로



--다음페이지--

RSS를 사용하여 결합적 데이터베이스 만들기

developerWorks
Go to the previous page10 페이지 중 3 페이지Go to the next page

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

이 페이지 출력

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


예제를 통해 RSS 데이터베이스 만들기

이전 절에서 정의했듯이 RSS를 데이터 저장소로 사용하는 개념은 여기서 만들 예제로 가장 잘 설명할 수 있다. 다음 세 가지 테스트 피드를 만들 것이다.

  • 개인의 정보를 포함하는 디렉터리
  • 장소를 표현한 지도
  • 행사 일정. 행사는 특정 장소에서 사람이 할 일을 정의하며 이들 두 세트의 데이터를 하나로 묶는 역할을 한다.

만나야 할 사람

연락처를 정의하려면 원하는 어떤 XML 포맷이든 사용할 수 있다. 예전에 쓴 "XSLT를 사용하여 오픈오피스의 편집기능 확장하기 (한글)"(참고자료에서 링크를 확인하자) 튜토리얼에서 설명했듯 VCF의 XML화된 폼이 하나의 옵션이다.


Listing 2. 샘플 RSS 데이터베이스: 디렉터리
                    
<rss version="2.0"
xmlns:mesh="http://www.hisown.com/NameSpaces/Mesh/20071203">
<channel>
<title>People</title>
<item>
<guid>Simpsons:/Homer_J_Simpson</guid>
<title>Homer Jay Simpson</title>
<link>http://en.wikipedia.org/wiki/Homer_Simpson</link>
<description>Nuclear Plant Drone, Sector 7-G</description>
<xvcf:... /> <!-- additional details about this person !-->
<mesh:axon type="relation" value="wife">
Simpsons:/People/Marjorie_M_Simpson</mesh:axon>
<mesh:axon type="relation" value="son">
Simpsons:/People/Bartholomew_J_Simpson</mesh:axon>
<mesh:axon type="relation" value="father">
Simpsons:/People/Abraham_A_Simpson</mesh:axon>
<mesh:axon type="location" value="work">
Simpsons:/Places/Springfield_Nuclear_Power_Plant</mesh:axon>
</item>
</channel>
</rss>

디렉터리
테스트 피드는 본 튜토리얼에 첨부됐다. http://hisown.com/rss/simpsons_contacts.xml에서 온라인으로 볼 수 있다.

테 스트 피드는 매우 간단하다. RSS 채널을 아이템 컨테이너로 만들면 된다. 그리고 나서 아이템 각각을 가장 중요한 요소인 guid와 함께 링크에 사용하듯 추가한다. 그리고 목적을 보여주는 제목을 추가하고 위키백과 엔트리(개인의 신상명세를 연결한다고 상상해보자)에 연결되는 링크를 추가한다. <xvcf:> 이름공간 요소는 어느 것이든 될 수 있고 실제로도 추가 아이템 정보가 여기 저장될 수 있다고 알려주는 위치 구분자다. 이제 mesh라는 새 이름공간을 사용한다. 본 튜토리얼에서 사용하진 않겠지만 링크 또는 커넥터는 axon 요소로 타입이나 값을 붙일 수 있다.

실제 시맨틱 네트워크는 요소 간의 링크 뿐 아니라 방향(a'b 또는 b'a), 타입, 값도 사용한다.




위로


가야 할 장소

위치를 정의하려면 Listing 3처럼 두 번째 채널을 만든다.


Listing 3. 샘플 RSS 데이터베이스 — 지도
                    
<rss version="2.0">
<channel>
<title>Places</title>
<item>
<guid> Simpsons:/Places/Springfield_Nuclear_Power_Plant</guid>
<title>Springfield Nuclear Power Plant</title>
<description>
</description>
<image>
<url> http://upload.wikimedia.org/wikipedia/en/6/6e/Snpp.gif</url>
<title>Springfield Nuclear Power Plant</title>
</image>
<link> http://en.wikipedia.org/wiki/Springfield_Nuclear_Power_Plant</link>
<!-- additional details about this location, if any !-->
<mesh:axon type="relation" value="proprietor">
Simpsons:/People/Charles_Montgomery_Burns</mesh:axon>
</item>
</channel>
</rss>

이 채널은 다른 것과 비슷해야 한다. RSS 채널은 기본적으로 모두 같은 포맷을 공유한다. 아이템의 실제 데이터가 아니라 아이템 guid가 중요하다.




위로


해야 할 일

가상의 인물이 가상의 장소에서 경험할 행사를 정의하기 위해 세 번째 채널을 만들 것이다. 이 행사들은 Listing 4처럼 사람과 공간을 연결하는 역할을 한다.


Listing 4. 샘플 RSS 데이터베이스 — 달력
                    
<rss version="2.0">
<channel>
<title>Calendar</title>
<item>
<guid>http://jade.hisown.com/Calendar/Meetings/1234</guid>
<title>Meeting with Mr. Burns</title>
<description>
</description>
<xics: /> <!-- additional details about this event !-->
<mesh:axon type="location" value="place">
Simpsons:/Places/Springfield_Nuclear_Power_Plant</mesh:axon>
<mesh:axon type="relation" value="participant">
Simpsons:/People/Homer_J_Simpson </mesh:axon>
<mesh:axon type="relation" value="participant">
Simpsons:/People/Charles_Montgomery_Burns</mesh:axon>
</item>
</channel>

</rss>

다시 말하지만 새로운 것은 없다. 특정 장소에서 약속(이 경우 보스와 Homer의 회의)이 있다. 모든 축색돌기는 /People/이나 /Places/ 이름공간 중 하나에서 이미 정의된 요소와 연결돼 있음에 주목하자.

달력
이 테스트 피드 역시 본 튜토리얼에 있다. http://hisown.com/rss/simpsons_engagements.xml에서 온라인으로도 볼 수 있다.

이제 mesh:axon 요소에 의해 연관 링크를 갖게 됐다. 이런 각각의 링크를 링크 타입(관계 또는 위치)과 값(아버지, 아들, 참여자)으로 어떻게 정의했는지 적어두자. 이 정의나 분류(사람, 장소) 세트를 분류법이라 부른다. 관계(아버지, 아들, 은(는) ~이다, ~의 하위클래스)를 만드는 것은 온톨로지가 된다.

또한 데이터를 연결하는 데 RSS 빌트인 데이터를 사용했다는 것에 주목하자. axon 요소 값은 RSS 아이템이 무엇을 말하는지 유일하게 정의한 guid로 재참조한다.

지 금까지 분류법의 가장 기본적인 응용을 봤다. 이것을 더 확장할 수 있다. 다시 말하면 특별한 XML 문법, 비슷한 특징을 지닌 항목 간 관계와 연관을 사용해 시맨틱 웹(또는 웹 3.0. 사실 웹 2.0이 뭔지도 명확치 않긴 하지만)이라 알려진 것을 구성할 수 있다. 이미 몇 가지가 진행 중에 있는데 그 중 가장 잘 알려진 것이 W3C의 웹 온톨로지 언어(참고자료의 링크를 보자)다.

이로써 데이터 저장에 몇 가지 인터페이스 타입을 제공한다. 하지만 이를 위해 먼저 RSS 데이터를 프로그램적으로 쉽게 조작할 수 있는 방법을 찾아야 한다.

이제 가지고 있는 데이터로 조작을 해보자.




위로



--다음페이지--

RSS를 사용하여 결합적 데이터베이스 만들기

developerWorks
Go to the previous page10 페이지 중 4 페이지Go to the next page

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

이 페이지 출력

샘플 코드


제안 및 의견
피드백

튜토리얼 평가

이 컨텐츠를 개선하기 위한 도움을 주십시오.


RSS 내용 파싱하기

RSS 내용은 본질적으로 또 다른 XML 방언이다. 모든 언어에는 DOM 또는 SAX 프로세스를 처리하는 많은 복잡한 라이브러리와 함께 XML을 분석하는 여러 방법이 있다. PHP도 그 중 하나다. 하지만 PHP의 강력한 정규식 지원을 사용해 RSS를 분석하는 간단한 접근을 시도할 것이다. 정규식은 저주같아 보이겠지만 텍스트를 다루는 능력은 최고다.

정규식 사용하기

본 튜토리얼에서 다양한 파싱 방법 중 하나로 쉽고 빠른 정규식을 사용할 것이다. 이는 빌트인이고 간단한 사용 메커니즘으로 PHP의 DOM 라이브러리와는 상관 없다. 물론 완전한 문서 트리, 스키마 검증, 공백에 둔감 등 DOM의 장점이 많지만 본 튜토리얼은 이미 굉장히 앞선(avant garde) 개념을 보여줬으므로 하나 더 보여준다고 크게 나쁠 것 없다. DOM과 SAX 모두 정규식으로 기본 XML을 분석한다.

이전에 정규식을 사용해 봤다면 "@#%#$" 같은 것이겠지만(이것 또한 정규식이다) 정규식 사용을 최소로 하고 단일 함수로 감싸 요소를 가져올 것이다.




위로


요소 페처 만들기

함 수를 사용하여 RegExp 로직을 감싸는 것은 인터페이스에서("그 요소를 달라") 요소를 가져오는(RegExp를 사용하여) 실제 구현을 추상화하므로 말이 된다. 연습으로 DOM을 사용하여 이 함수를 다시 짜려는 독자도 있을 것이다.

어떤 문서나 피드에서 특정 XML 요소를 가져오기 위해 다음 함수를 접근 가능한 PHP 파일에 넣는다. Listing 5를 보자.


Listing 5. XML 문서에서 요소 찾아오는 PHP 함수
                    
function get_elements($xml, $element,$multiple)
{
if ($multiple) {
/* Return ALL matches of this element in the $xml provided.
* Results will be returned as an array or arrays
*/ if ($multiple) {
$item = preg_match_all("#<$element(|[^>]*)>(.*)</$element>#msU",
$xml,
$matches,PREG_PATTERN_ORDER);

/* Trim whitespace. This could've been done in the RegExp, */
/* but you can also use PHP's trim() function for that. */
for ($i = 0;
$i < count ($matches[2]);
$i++)
{
$matches[2][$i] = trim ($matches[2][$i]);
} /* end for */
}
else
{
$item = preg_match("/<$element(|[^>]*)>(.*)<\/$element>/msU",
$xml,
$matches);
$matches[2] = trim($matches[2]);
}

/*
* When you get here, $matches is either an array of arrays, or a
* single array, in the following format:
*
* [0] => Entire pattern matched
* [1] => "", or attributes of this element (if any) (| [^>]*)
* [2] => Element content (corresponding to (.*)
*
* You thus choose to return [2] = Element contents, or array of
* matched elements' contents.
*/
return ($matches[2]); /* Element content */
}

보면 알 수 있듯이 여기서 어려운 점은 올바른 정규식만 만드는 것이다. 이 경우 정규식은 #<$element(| [^>]*)>(.*)</$element>#msU다.

실제 RegExp는 임의 문자에 의해(대체로 /를 사용하지만 정규식 자체에 /가 필요하므로 #를 선택하는 것이 좋다) 묶인다. 이를 표 2처럼 나눌 수 있다.


표 2. 요소 RegExp 분해
RegExp 부분
<$element요소를 여는 태그—요소 이름. 여기서 <은 말 그대로 더 작은(<)이며 $element는 PHP에 의해 삽입될 것이다.
(|[^>]*)어떤 것이든 >으로 끝난다.
>요소보다 큰(>) 것으로 끝난다.
(.*)요소 내용
<\/$element>요소를 끝내는 태그

식을 따르는 것은 표 3처럼 행동 변경자를 따르는 것이다.


표 3. 요소 RegExp 변경자 설명
변경자
M다중행 매칭. 아니라면 "\n"은 행을 끝냄
S"\n"을 포함, 문자를 매치하기 위해 "."를 설정
U"ungreedy" 설정. 기본 매칭이 "greedy"(위 정규식에서 ".*"로 요소의 닫는 태그와 실제로 매치할 수 있다)고 각 매치에 요소 하나만 원하기 때문에 필요하다.

이제 이 기능을 전체 애플리이션에 포함시키자.




위로


모두 함께 모으기

이제 RSS 피드를 파싱해 데이터를 얻는 것은 쉬워진다. Listing 6처럼 호출을 get_elements()로 둘러싼다.


Listing 6. 자식 노드와 값으로 특정 요소를 찾아오는 PHP 함수
                    
function get_specific_element($feed, $child, $value)
{
$items = get_elements($feed, "item",true);
if (!$items) { echo "What are you feeding me? No items here!\n";
return(false);}
for ($i = 0 ; $i < count ($items);$i++){
/* to get child elements, simply call on parent element,
* with child name as argument
*/

$val = (get_elements($items[$i],"$child",false));
if ($val == trim($value)) {return ($items[$i]); } ;
}
return(false);
}

그리고 이 함수를 호출하려면 Listing 7만 사용하면 된다.


Listing 7. PHP를 사용하여 RSS 데이터베이스 처리하기
                    

$feed = get_channel ($feed_url);
$desired_child = /* Whatever, obtain from user */;
$desired_value = /* Whatever, obtain from user */;
$elem = get_specific_element($feed,
$desired_child,
$desired_value);

/* Have some fun with this element: */
$title = (get_elements($elem,"title",false));
$description = (get_elements($elem,"description",false));
/* do something with title and description */
...
/* get zero or more connections (axons) this element has ..*/
$axons = (get_elements($elem,"mesh:axon",true));

간단히 말하자면 찾고 있는 특정 값을 사용하여 특정 아이템 요소를 찾을 것이다. 여기서 제목과 설명을 끌어낼 수 있고 축색돌기의 폼이라면 추가 정보로 가는 링크를 끌어낼 수도 있다.

RDF 와 RSS 모두에서 채널에 각각 <title>과 <description>이 있는 개별 <item> 요소를 가지고 있음을 상기하자. 그리고 이것이 DOM/SAX와는 다른 RegExp 처리 방식의 주요 장점이라 하겠다. 즉, RegExp는 텍스트와 매치되고 문서 구조와 상관이 없기 때문에 <item> 요소가 <channel>의 자식 요소든 이것과 분리되든 상관이 없다는 것이다.




위로


요소 찾아오기

데 이터베이스를 정의하고 파서 함수를 만들었으니 이제 즐길 차례다. 관계를 살피고 스프링필드(Springfield)의 약속, 사람과 장소를 찾을 뿐만 아니라 사람들 간의 연관과 링크를 따라가볼 수 있다. 로컬 피드로 작업할 것이기 때문에 다음 함수를 사용하여 로컬 파일의 모든 RSS 내용을 취합할 수 있다. Listing 8을 보자.


Listing 8. RSS 데이터베이스를 메모리로 읽기
                    
function get_feed($url)
{
/* open the feed locally */
$fp = fopen ($url, "r");

$content = fread($fp, filesize($url));

return ($content);
}

그리고 이를 Listing 9처럼 사용한다.


Listing 9. RSS 데이터베이스를 메모리로 읽기(계속)
                    
$contacts_feed = get_feed ("simpsons_contacts.xml");
$engagements_feed = get_feed ("simpsons_engagements.xml");
$places_feed = get_feed ("simpsons_places.xml");

메모리에 피드가 있으니 이제 실제 처리할 사항들을 살펴보자.




위로


전통적 룩업

전통적(Classic)이 라는 것은 저장소의 요소를 살펴보는 옛 방법을 말한다. 전통적으로 SQL에서 SELECT statement FROM some_table WHERE some condition 같은 것이 그것이다. 같은 기능을 흉내낼 수 없다면 쓸모 없는 데이터베이스가 될 것이다.

예를 들어 Listing 10의 코드를 가지고 여기서 SELECT * from ENGAGEMENTS로 해야 할 것이다.


Listing 10. SELECT 문 흉내내기
                    

$engs = get_elements($engagements_feed, "item",true);

foreach ($engs as $eng)
{
$title = (get_elements($eng,"title",false));

echo ("Got Engagement: $title\n");
}

참석자와 함께 모든 약속 목록을 갖고 싶다면 무엇을 해야 하는가? SQL에서는 복잡한 JOIN을 하겠지만 여기서는 간단히 축색돌기를 따르면 된다. Listing 11을 보자.


Listing 11. JOIN된 SELECT 문 흉내내기
                    
$engs = get_elements($engagements_feed, "item",true);

foreach ($engs as $eng)
{

$title = (get_elements($eng,"title",false));

echo ("Got Engagement: $title\n");

$axons = (get_elements($eng,"mesh:axon",true));

foreach ($axons as $ax)
{
if (strstr($ax, "Simpsons:/People")) {
/* Lookup this person */
$part = get_specific_element($contacts_feed,
"guid",
$ax);

if (!$part) { echo ($ax . " Not found\n");}
else {

$title = (get_elements($part,"title",false));
echo ("Participant: $title\n");
}
}
}

이 샘플은 http://www.hisown.com/rss/lookuptest.php에서 받을 수 있다.

임무를 완수했다. 이제 테이블 기반 데이터베이스로 할 수 있는 일은 뭐든 할 수 있다. 하지만 개선할 수는 없을까?




위로


샘플 결합

예전에 만든 질의에는 새로울 것 없었고 결국 어느 관계형 데이터베이스 테이블이든 질의를 수행할 수 있었다. 하지만 더 나아가 이제 새로운 타입의 질의인 결합적 질의(아이템이 가져야 하는 것은 비슷함)를 사용할 수 있다. SQL과 테이블에서 이를 행하는 것은 불가능하진 않지만 매우 힘든 작업이다. 하지만 새 결합적 포맷으로 행하는 것은 간단하다. Listing 12를 보자.


Listing 12. 결합적 질의
                    
$contacts_feed = get_feed ("simpsons_contacts.xml");
$contacts = get_elements($contacts_feed,"item",true);
$common_axons = Array();
foreach ($contacts as $contact)
{
$title = get_elements($contact,"title",false);
echo ("Got contact: $title<BR/>\n");
$axons = (get_elements($contact,"mesh:axon",true));
foreach ($axons as $ax)
{
/* Lookup these axons in the $common_axons */
$cax_count = count ($common_axons);
for($cax_no = 0;
$cax_no < $cax_count;
$cax_no++)
{
if ($common_axons[$cax_no] == $ax)
{
echo ("Bingo! Commonality found: $ax\n");
exit(0);
}
}
/* Add anyway */
$common_axons [count($common_axons)] = $ax;
}
} /* end foreach*/

그리고 예상대로 결과는 Listing 13에서 볼 수 있다.


Listing 13. 결과
                    
Got contact: Homer Jay Simpson
Got contact: Charles Montgomery_Burns
Bingo! Commonality found: Simpsons:/Places/Springfield_Nuclear_Power_Plant

첨부된 샘플은 http://www.hisown.com/rss/commontest.php에서 얻을 수 있다.This sample is attached, and available at

그 래프 이론(Graph Theory)에서 보자면 지금까지 한 것은 너비우선탐색(Breadth First Search, BFS)과 매우 비슷하다. 이는 정말 빙산의 일각일 뿐이다. 한 단계 아래로 갔을 뿐이고 축색돌기는 일정 방향이다. 진정한 결합은 깊이와 양방향 링크를 이용한다. 또한 특정 검색이나 그 이상에 사용할 수 있는 링크 타입도 무시했다. 이것은 정보 처리와 검색, 그리고 클러스터링같은 그래프 이론의 계산에 관한 문제와 같은 다양한 분야에서 매우 유용하다. 여기서 시도할 수 있는 검색의 또 다른 타입은 깊이우선탐색(Depth First Search)으로 이는 형제 노드보다 자식 노드 결합을 재귀적으로 따른다. 더 자세한 정보는 컴퓨터 과학 교과서의 알고리듬 부분을 참조하기 바란다(참고자료의 링크를 보자).

가 끔 결과에서 최소 파싱만을 수행하고 이를 XML 폼으로 남기고자 할 때가 있다. 이는 특히 웹 서비스에서 유용하다. 이제 이를 추가 비용 없이 수행하는 방법에 대해 다뤄 보겠다. 사실 결과 그대로 남겨두는 게 더 간단하다. XML 조각을 쉽게 재조립하여 유효한 새 문서로 만들 수 있다.




위로


--다음페이지--

최종 문서를 모아보자

사용자가 데이터를 사용할 수 없다면 데이터로는 아무것도 할 수 없다. 본 절에서는 반환되는 로 XML 데이터를 살피고 XSL을 사용하여 이를 HTML로 변환할 것이다.

로(raw) XML로 결과 내기

Listing 8에서 봤듯이 RSS '데이터베이스'는 임의의 RSS 채널을 로드하기 위해 get_url() 함수를 사용할 것이다. 예제는 RSS로부터 요소를 분석한 것을 보여주고 원하는 특정 세부사항을 보여줬을 뿐이다. 그러나 언젠가 제대로 된(well-formed) XML의 한 부분이었던 분리시킨 요소 덕분에 쉽게 이 장점을 얻을 수 있다. 그러므로 그 자체로 XML이 될 결과에 이를 끼워넣을 수 있다. 이를 통해 RSS를 포함하여 원하는 어떤 문법에서든 피드 취합자에서 맞춤 XML 문서를 만들 수 있다. 이렇게 되면 RSS를 지원하는 브라우저나 리더를 통해 피드 자체를 자동으로 구독할 수 있다.

첫 번째 예제의 흉내낸 join을 살짝 고쳐 참석자 제목 대신 요소 자체를 출력할 수 있다. 이를 위해서는 간략한 수정 세 가지만 하면 된다.

  1. 텍스트("Got Engagement ... " or "Participant...")를 출력하는 대신 아이템 자체를 echo한다. echo ("<item>...</item>\n");.
  2. 이 문서를 XML 문서로 선언한다(Listing 14).


    Listing 14. 문서를 XML 문서로 선언하기
                                
    header("Content-Type: text/xml");
    echo ('<?xml version="1.0"?>');

  3. 요소를 한 컨테이너 요소에 싸고 이름공간을 선언한다(Listing 15).


    Listing 15. 하나의 컨테이너 요소에 요소 싸기
                                
    echo ('<rss xmlns:xics="blah" xmlns:mesh="blahblah"
    xmlns:xvcf="boo">');
    echo ("<channel><title>Results</title>");
    ...
    ...
    echo ("</channel></rss> ");

스스로 해 보려면 http://hisown.com/rss/lookuptestxml.php를 방문하자. 결과는 완벽한 XML로 웹 서비스나 RSS 피드로 사용되도록 남겨두거나 좀 더 조작할 수 있다(이는 곧 다루겠다).




위로


사용자에게 내용 보여주기 — XSL

위 에서 봤듯 결과를 로(raw) XML로 출력하는 작은 RSS 데이터베이스는 기본적으로 웹 서비스다. 그리고 나서 이 XML을 XML/HTTP나 SOAP로 감쌀(encapsulate) 수 있다. 문제는 이 XML이 사람이 사용하기에 편리하지 않다는 것이다. 독자는 실제 아이템 제목과 설명(가능하다면)을 원하지, 누가/언제/어디서 발행 같은 메타데이터 전부를 원하는 게 아니다. 대다수의 리더는 이런 세부사항을 잘 감추고 실제로 아이템 제목과 설명만 보여준다. 앞에서 취한 방식은 데이터를 걸러 원하는 필드만 보이게끔 하는 것이었다. 이는 쉽게 할 수 있으나 XML 구조와 메타데이터의 장점을 놓치게 된다.

깔 끔한 XML 구조를 무너뜨리지 않고 프레젠테이션 레이어를 커스터마이즈하려면 어떻게 해야 할까? 다행히 XML은 XSLT라는 해결책을 가지고 있다. 필자의 이전 튜토리얼인 "XSLT를 사용하여 오픈오피스의 편집기능 확장하기 (한글)"의 "XSLT 복습" 부분에서 이미 다루었으니 여기서 XSLT에 대해 다시 소개하기보다는 참고자료의 링크를 읽어보기 바란다.

이제 실제 스타일시트를 만들어보자.




위로


맞춤 XML 스타일시트 만들기

XSLT 에 대해 알고 있다면(또는 "XSLT 복습"을 읽어봤다면) 지금쯤 XSLT 구문이 복잡하다는 것을 알고 (제대로 된) XML의 하위타입이기에 갖는 모든 제한들 때문에 고통받고 있을 것이다. 여기에 더해 XSLT 고유의 문법이 강제된 구문은 변수와 흐름 제어를 위한 주요 구성이 제한되고 복잡하기 때문에 다른 대안을 찾고자 할 것이다. 가장 일반적인 대안은 자바나 자바스크립트 같은 언어에서 DOM 처리다. 하지만 로 XML 폼에서 실제 결과를 두는 동안 프레젠테이션만을 렌더링하려는 목적에는 XSL이 가장 완벽하다.

이 경우 기본 피드를 위해 간단하면서도 효과적인 XSL 템플릿을 사용하여 피드를 사람이 읽을 수 있는 포맷으로 바꿀 것이다.

사용하는 XSL은 Listing 16과 같다.


Listing 16. XSLT
                    
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mesh="http://www.hisown.com/NameSpaces/Mesh/20071203"
xmlns:xvcf="http://www.hisown.com/NameSpaces/vcf/20071024">
<xsl:template match="/">
<HTML>
<BODY>
<xsl:for-each select="//item">
Item: <xsl:value-of select="./title" />
<BR/><xsl:for-each select="./image">
<IMG title="{./title}"
src="{./url}" width="{./width}" height="{./height}"/>
<BR/>
</xsl:for-each>
</xsl:for-each>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>

XSL을 문서에 묶으려면 <?xml-stylesheet?> 지시를 문서 지정자 바로 뒤에 삽입한다. Listing 17을 보자.


Listing 17. <?xml-stylesheet?> 지시 삽입하기
                    
..
echo ('<?xml version="1.0" ?>');
if ($_REQUEST['xsl'])
{
echo ('<?xml-stylesheet type="text/xsl" href="lookuptest.xsl" ?>');
}

다 끝났다! 인자를 추가하여 샘플 php로 이를 시도하자. http://hisown.com/rss/lookuptestxml.php?xsl=sure.

스 타일시트를 XML 결과에 추가하면 브라우저는 이를 어디서 찾고 찾아와야 하는지 알게 됐다. 이처럼 간단하고 효과적이다. XSL이 아이템의 이미지 요소를 분석하고 이를 HTML 이미지 요소로 렌더했기 때문에 그림이 질의 결과에 보인다. 더 복잡한 XSL은 실제로 그래프나 로드맵을 그려 요소 간의 연결을 보여주고 결합을 강조한다.




위로


--다음페이지--

요약

다음 단계

본 튜토리얼은 RSS에 대해 다루며 관계형 데이터베이스 포맷에서 정통적이진 않지만 혁신적인 방법으로 이를 사용하는 방법을 보여줬다. RSS 2.0의 핵심 스키마를 사용하지만 이를 확장하여 임의의 아이템의 어떤 타입이든 저장한다. 각 아이템은 guid에 의해 유일하게 식별됐다. 맞춤 이름공간으로 아이템 간의 링크를 만들 수 있다.

이것으로 RSS로 열리는 많은 가능성의 첫 발을 뗐다. 웹 사이트가 있는가? 내용을 발행하는가? 급속도로 사용자가 늘고 있는 RSS를 사용하자. 대안적 결과 메커니즘으로 RSS를 채택하는 모든 웹 사이트, 블로그, 데이터베이스로 시맨틱 웹의 비전에 더 가까이 다가갈 수 있고 지능적 취합자(특정 키워드로 사용자의 정보를 취합하고 관심을 갖는 것뿐 아니라 실제 행동으로 옮기는)가 될 수 있다.

기사의 원문보기


--다음페이지--

RSS를 사용하여 결합적 데이터베이스 만들기











다운로드 하십시오

설명이름크기다운로드 방식
튜토리얼 예제 코드x-rssdatabase-tut.zip12KBHTTP
다운로드 방식에 대한 정보

참고자료

교육
  • RSS 1.0 명세: XML 기반의 웹 내용과 메타데이터 배급 포맷인 Atom에 대해 읽어보자.

  • RSS 2.0 명세: 웹 내용 배급 포맷과 XML 방언에 대해 더 읽어보자. 모든 RSS 파일은 W3C 웹사이트에 발행된 것처럼 XML 1.0 명세를 따라야 한다.

  • RSS 2.0과 Atom: RSS 2.0과 Atom 1.0 배급 언어의 차이를 비교해보자.

  • Introduction to Syndication, (RSS) Really Simple Syndication (Vincent Lauria, developerWorks, 2006년 3월): RSS가 인기있는 이유와 장점이 무엇인지를 포함하여 RSS, Atom, 피드 리더에 대해 더 배워보자. 어떤 피드 리더가 사용 가능하고 나에게 맞는 것은 어떤 것인지 배워보자.

  • RSS(파일 포맷): RSS 파일 포맷의 역사와 차이점에 대한 자세한 내용을 위키백과에서 찾아 읽어보자.

  • The future of the Web is Semantic (Naveen Balani, developerWorks, 2005년 10월): 시맨틱 웹 기술의 기초에 대해 알아보고 이를 온톨로지 기반 개발로 활용할 수 있는 방법에 대해 알아보자.

  • XSLT를 사용하여 오픈오피스의 편집기능 확장하기 (한글) (Jonathan Levin, 한국 developerWorks, 2007년 11월): 이 튜토리얼을 통해 오픈오피스의 가져오기/내보내기 필터를 사용해 평범한 문서라도 XML 데이터를 어떻게 열 수 있는지 배워보자.

  • XSLT: Working with XML and HTML (Khun Yee Fung, Addison-Wesley, 2000년 12월): XSLT에 관련된 참고자료와 튜토리얼을 이해해보자.

  • XSLT Functions: w3school.com에서 풍부한 참고자료를 확인해보자.

  • IBM XML certification: IBM이 인증하는 XML 개발자가 되는 방법과 이와 관련된 기술에 대한 정보를 얻을 수 있다.

  • XML 기술 자료: developerWorks XML 존에서 기술 관련 글들과 팁, 튜토리얼, 표준, IBM 레드북 등을 찾을 수 있다.

  • developerWorks 기술 행사와 웹 캐스트: 이 세션들을 통해 최신 기술을 습득하자.

  • developerWorks XML 존: XML의 모든 것을 알아보자.

  • The technology bookstore: 기술과 관련된 책들을 찾아보자.


제품 및 기술 얻기
  • OpenOffice.org: 제품을 다운로드하고 이와 관련된 모든 정보를 찾아보자.

  • IBM 시험판 소프트웨어: developerWorks에서 직접 다운로드할 수 있는 시험판 소프트웨어로 다음 개발 프로젝트를 만들어보자.


토론

필자소개


Jonathan Levin은 리눅스와 윈도우용 로우레벨 프로토콜 및 장치 드라이버를 비롯해 XML/XSLT에서 ajax까지 광범위한 주제를 가르치는 강사이자 컨설턴트다. Jonathan Levin은 제이드(JADE, http://jade.hisown.com) 라는 경량 웹-데스크톱 환경을 설계, 개발했다. 제이드는 엔터프라이즈급 이메일, 캘린더링, RSS, 완전한 원격 파일 시스템 기능을 제공한다. 프론트엔드는 자바스크립트로, 백엔드는 PHP로 짰고 XML과 XSLT를 광범위하게 사용한다.