RSS 강좌 - RSSWriter Class 제작 및 활용
작성자 손상모 작성일 2004.11.17 15:51:58
첨부파일 rsswriter.zip(2.4KB)

운영하고 있는 사이트에 RSS 서비스( http://www.ihelpers.co.kr/rss.php?q=all ) 를 제공하는 방법에 대하여 설명하도록 하겠습니다. 앞의 강좌를 본 분들이라면 RSS 서비스에 대한 기술적인 부분은 큰 어려움이 없이 쉽게 구현이 가능할 것입니다.

PHP,ASP 등과 같은 Script를 사용하여 HTML 구문을 작성하는 것과 동일한 방법으로, RSS 규약에 맞는 구문을 출력하는 프로그램을 개발하여 URL를 배포하는 것이 RSS 서비스 제공의 전부입니다. 그 만큼 RSS 서비스 제공은 상당히 간단합니다.

그러나 해당 강좌는 RSSWriter Class를 직접 작성하고, 클래스를 이용하여 개발하여  RSS 규약에 대한 이해를 좀 더 돕고자 합니다.

1. RSSWriter Class 만들기
코드가 좀 길지만 대부분이 set 메서드이니 조금만 시간을 투자하면 금방 이해하실 수 있을 것입니다.

Class 구현에서 가장 중점을 둔 부분은 RSS 중에서 Optional Element를 배열변수로 선언하여 Class 사용자가 Optional Element를 좀 더 유연하게 처리할 수 있도록 한 부분입니다.

function setChannelOptionalElements($ChannelOptionalElements){
  $this->$ChannelOptionalElements = $ChannelOptionalElements;
}
Optional Channel Element,Item Element 등과 같은 Element 에 대한 처리를 위와 같이 배열변수로 선언하고 값을 배열 형태로 직접 대입하는 방법과 setLanguage,setCopyright 등과 같은 함수를 사용하여 개별적으로 값을 대입하는 두가지 방법을 제공하였습니다. 코드가 아래와 같이 길어지게 된 것도 RSS에서 사용하는 모든 Element에 대한 개별적인 Set 메서드를 제공하였기 때문입니다.

<?
/*///////////////////////////////////////////////////////////////

 프로그램명 : RSSWriter.class
 버전  : 0.9
 작성자  : 손상모
 최초작성일 : 2004.10.20

 *** 설명 ***

 RSS(Real Simple Syndication,Rich Site Summary) Writer

 1. RSS 2.0 Specification 지원

 *** 변경 내역 ***

/////////////////////////////////////////////////////////////////*/

class RSSWriter {
 var $charset = "euc-kr";
 var $title;
 var $link;
 var $description;
 var $ChannelOptionalElements = array();
 var $items = array();

 function RSSWriter($title,$link,$description = null,$ChannelOptionalElements = array()){
  $this->setChannel($title,$link,$description);
  $this->setChannelOptionalElements($ChannelOptionalElements);
 }

 function setCharset($charset){
  $this->charset = $charset;
 }

 function setChannel($title,$link,$description = ""){
  $this->title  = $title;
  $this->link   = $link;
  $this->description = $description;
 }

 function setChannelOptionalElements($ChannelOptionalElements){
  $this->$ChannelOptionalElements = $ChannelOptionalElements;
 }

 function setTitle($title){
  $this->title = htmlspecialchars($title);
 }

 function setLink($link){
  $this->link = htmlspecialchars($link);
 }

 function setDescription($description){
  $this->description = htmlspecialchars($description);
 }

 function setLanguage($language){
  $this->ChannelOptionalElements["language"] = $language;
 }

 function setCopyright($copyright){
  $this->ChannelOptionalElements["copyright"] = $copyright;
 }

 function setManagingEditor($managingEditor){
  $this->ChannelOptionalElements["managingEditor"] = $managingEditor;
 }

 function setWebmaster($webMaster){
  $this->ChannelOptionalElements["webMaster"] = $webMaster;
 }

 // date format YYYY-MM-DD HH:mm:ss 또는 YYYY-MM-DD (예 : 2000-11-01 00:00:00)
 function setPubDate($pubDate){
  $this->ChannelOptionalElements["pubDate"]
   = sprintf("%s GMT",gmdate("M, d Y H:i:s",$this->GetTimeStamp($pubDate)));
 }


 // date format YYYY-MM-DD HH:mm:ss 또는 YYYY-MM-DD (예 : 2000-11-01 00:00:00)
 function setLastBuildDate($lastBuildDate){
  $this->ChannelOptionalElements["lastBuildDate"]
   = sprintf("%s GMT",gmdate("M, d Y H:i:s",$this->GetTimeStamp($lastBuildDate)));
 }

 function setCategory($category){
  $this->ChannelOptionalElements["category"] = $category;
 }

 function setGenerator($generator){
  $this->ChannelOptionalElements["generator"] = $generator;
 }

 function setDocs($docs){
  $this->ChannelOptionalElements["docs"] = $docs;
 }

 function setCloud($cloud){
  $this->ChannelOptionalElements["cloud"] = $cloud;
 }

 function setTtl($ttl){
  $this->ChannelOptionalElements["ttl"] = $ttl;
 }

 function setImage($image){
  $this->ChannelOptionalElements["image"] = $image;
 }

 function setRating($rating){
  $this->ChannelOptionalElements["rating"] = $rating;
 }

 function setTextInput($textInput){
  $this->ChannelOptionalElements["textInput"] = $textInput;
 }

 function setSkipHours($skipHours){
  $this->ChannelOptionalElements["skipHours"] = $skipHours;
 }

 function setSkipDays($skipDays){
  $this->ChannelOptionalElements["skipDays"] = $skipDays;
 }

 function setItem($title,$link,$description ="",$author = "",$pubDate ="",$category ="",
   $guid ="",$source ="",$comments ="",$enclosure =""){
  $item = array();
  $item["title"]  = $title;
  $item["link"]  = $link;
  $item["description"] = $description;
  $item["author"]  = $author;
  $item["pubDate"] = sprintf("%s GMT",gmdate("M, d Y H:i:s",$this->GetTimeStamp($pubDate)));
  $item["category"] = $category;
  $item["guid"]  = $guid;
  $item["source"]  = $source;
  $item["comments"] = $comments;
  $item["enclosure"] = $enclosure;

  $this->addItem($item);
 }

 function addItem($item){
  array_push($this->items,$item);
 }

 function println(){
  header("Content-type: text/xml");
  printf("<?xml version="1.0" encoding="%s" ?> ",$this->charset);
  print("<rss version="2.0"> ");

  $this->printChannel();

  print("</rss> ");
 }

 function printChannel(){
  print("<channel> ");
  printf("<title>%s</title> ",$this->title);
  printf("<link>%s</link> ",$this->link);
  printf("<description>%s</description> ",$this->description);

  while (list($name,$value) = each ($this->ChannelOptionalElements)) {
   printf("<%s>%s</%s> ",$name,$value,$name);
  }
 

  $this->printItems();

  print("</channel> ");
 }

 function printItems(){
  foreach($this->items as $item){
   print("<item> ");
   while (list($name,$value) = each($item)) {
    if(!empty($item[$name])){
     $value = htmlspecialchars($value);
     printf("<%s>%s</%s> ",$name,$value,$name);
    }
   }
   print("</item> ");
  }
 }

 function GetTimeStamp($date)
 {
  /* 인자 형식처리
  YYYY-MM-DD
  YYYY-MM-DD HH:mm:ss
  */
  if (strlen($DATE) == 10) {
   $time = mktime(0,0,0,(int)substr($date,5,2),(int)substr($date,8,2),(int)substr($date,0,4));
  } else {
   $time = mktime((int)substr($date,11,2),(int)substr($date,14,2),
   (int)substr($date,17,2),(int)substr($date,5,2),(int)substr($date,8,2),(int)substr($date,0,4));
  }
  return $time;
 }

}

[ RSSWriter.class.php 코드 ]

2. RSSWriter Class을 이용한 Sample 코드
아래의 샘플코드들은 소스코드를 다운로드 받아 PHP가 실행 가능한 디렉토리에 압출을 풀어 설치하신 후에 웹브라우저에서 XML 구문을 확인하거나 RSS Aggregator(Reader)를 통하여 직접 확인하시면 됩니다.

$rss = new RSSWriter("아이헬퍼스","http://www.ihelpers.co.kr","eBiz Total Solution");

위 코드에서 보는 것처럼 생성자에서 Required Channel Element를 Parameter로 입력하도록 하였으며, Item에 해당하는 배열은 addItem 함수를 사용하여 배열에 저장한 후에 println 함수로 출력 처리하였습니다.

demosimple.php 와 demoarray.php의 두 샘플코드는 RSSWriter Class 이용에 대한 각기 다른 사용 예이니 참고하여 주십시요.

<?
require "RSSWriter.class.php";

$rss = new RSSWriter("아이헬퍼스","http://www.ihelpers.co.kr","eBiz Total Solution");
$rss->setLanguage("ko-KO");
$rss->setLastBuildDate("2004-10-10");
$rss->setWebMaster("smson@ihelpers.co.kr");

$item = array(
	"title"		=> "구글",
	"link"		=> "http://www.google.co.kr",	
	"description"	=> "구글 검색엔진"
);

$rss->addItem($item);

$item = array(
	"title"		=> "야후",
	"link"		=> "http://www.yahoo.co.kr",	
	"description"	=> "야후검색엔진"
);

$rss->addItem($item);

$rss->println();
?>

[ demosimple.php 코드 ]

<?
require "RSSWriter.class.php";

$rows =array(
	array("구글","http://www.google.co.kr","검색엔진","2003-10-21 01:00:00"),
	array("야후","http://www.yahoo.co.kr","검색엔진","2003-07-10"),
	array("네이버","http://www.naver.com","검색엔진","2003-07-10")
);

$rss = new RSSWriter("아이헬퍼스","http://www.ihelpers.co.kr","아이헬퍼스");
$rss->setLanguage("ko-KO");
$rss->setLastBuildDate("2004-10-21 01:40:00");
$rss->setWebMaster("smson@ihelpers.co.kr");

foreach($rows as $row){
	$rss->setItem($row[0],$row[1],$row[2],"",$row[3]);
}

$rss->println();
?>

[ demoarray.php 코드 ]

3. 아이헬퍼스의 RSS 서비스
다음은 현재 아이헬퍼스에서 제공하는 RSS 서비스 ( http://www.ihelpers.co.kr/rss.php?q=all )의 코드중 일부분입니다. DB 정보를 RSS로 제공하는 예로 보시면 도움이 될 것입니다.

function cmp ($a, $b) {
	return strcmp($b["REGI_DATE"],$a["REGI_DATE"]);
}
현재 사용하고 있는 MySQL 버전이 Union기능을 제공하지 않기에(MySQL의 Union 기능은 4.x 부터 제공됨 ) Table 단위로 자료를 모와 usort 함수를 사용하여 날짜순으로 정리하여, 자료의 최대 출력 개수를 10개로 제한하고 등록일로 부터 14일 이전의 자료만 조회 하도록 작성하였습니다.

<?

require "./lib/web_lib.php";
require "./lib/jmrss/RSSWriter.class.php";

function cmp ($a, $b) {
	return strcmp($b["REGI_DATE"],$a["REGI_DATE"]);
}

$LIST_CNT = 10;
$DAY_INTERVAL = 14;

///////////////////////////////////////////////

// Database 연결
$conn = mysql_connect($HOSTNAME, $ID, $PWD);
mysql_select_db($DATABASE,$conn);

... 생략 ...

//////////////////////////////////////////// 프로그램(강좌)
$sql = "
	SELECT IDX,TYPE,SUBJECT,NAME,REGI_DATE
	FROM LEC_T WHERE REGI_DATE > DATE_SUB(NOW(),INTERVAL $DAY_INTERVAL DAY)
	ORDER BY GIDX DESC,LOC LIMIT 0,$LIST_CNT
";
$result = mysql_query($sql,$conn) or die ("SQL Error : ". mysql_error());

while($row = mysql_fetch_array($result)){
	array_push($nrows,array(
		IDX => $row["IDX"],
		TYPE => "강좌",
		NAME => $row["NAME"],
		SUBJECT => $row["SUBJECT"],
		REGI_DATE => $row["REGI_DATE"],
		LINK	=> sprintf("http://www.ihelpers.co.kr/programming/lec.php?
					CMD=view&TYPE=1&IDX=%d",$row["IDX"])
	));
}

//////////////////////////////////////////// 프로그램(Tip&Tech)
$sql = "
	SELECT IDX,TYPE,SUBJECT,NAME,REGI_DATE
	FROM TIPNTECH_T WHERE REGI_DATE > DATE_SUB(NOW(),INTERVAL $DAY_INTERVAL DAY)
	ORDER BY GIDX DESC,LOC LIMIT 0,$LIST_CNT
";
$result = mysql_query($sql,$conn) or die ("SQL Error : ". mysql_error());

while($row = mysql_fetch_array($result)){
	array_push($nrows,array(
		IDX => $row["IDX"],
		TYPE => "Tip&Tech",
		NAME => $row["NAME"],
		SUBJECT => $row["SUBJECT"],
		REGI_DATE => $row["REGI_DATE"],
		LINK	=> sprintf("http://www.ihelpers.co.kr/programming/tipntech.php?
					CMD=view&TYPE=0&IDX=%d",$row["IDX"])
	));
}

... 생략 ...


// 날짜순으로 내림차순으로 정열하기
usort($nrows,"cmp");

// RSS 출력
$rss = new RSSWriter("아이헬퍼스","http://www.ihelpers.co.kr","아이헬퍼스");
$rss->setLanguage("ko");
$rss->setLastBuildDate($nrows[0]["REGI_DATE"]);
$rss->setWebMaster("smson@ihelpers.co.kr");

$cnt = 1;
foreach($nrows as $nrow){
	if($cnt > $LIST_CNT) break;

	$author = $nrow["NAME"];
	//$content = cutString($nrow["CONTENT"],512);
	$content = "";

	$rss->setItem($nrow["SUBJECT"],$nrow["LINK"],$content,
					$author,$nrow["REGI_DATE"],$nrow["TYPE"]);
	$cnt++;
}
$rss->println();

mysql_close($conn);
?>

[ demoarray.php 코드 ]

4. 웹사이트에 RSS 서비스 배포
RSS 서비스를 개발하였다면 이젠 사이트를 통하여 URL 정보를 배포하시면 됩니다. RSS의 경우는 아래와 같은 일반적인 서비스 표현의 방법이 있으니, 서비스 사용자가 제공 서비스를 쉽게 인식할 수 있도록 보편적인 방식에서 크게 벗어나지 않는 방법으로 배포하십시요.

,, RSS Feed,XML ...

<a type="application/rss+xml" href="rss.php">XML</a>
5. 소스코드

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