개인 프로젝트에서 사용할 RSS Reader가 필요해서 "직접 만들어볼까?" 하고 잠시 고민을 하다가 "너 그만큼 실력 안되잖아?"라는 자아의 소리를 듣고 인터넷을 뒤졌습니다. [Open Source RSS & RDF Tools in Java]라는 아름다운 사이트를 발견했고 그 중에서 Rome이라는 놈이 예쁘다는걸 알게되었습니다. rome-1.0.jar를 받아서 lib에 추가를 하니 필요한 lib가 하나 더 있더군요. 바로 jdom인데 jdom-1.1.1.zip을 받아서 lib에 추가를 해줬습니다. 그랬더니 정상적으로 실행이 되었고 티스토리, 다음, 네이버 블로그에서는 Feed를 정상적으로 읽어 왔습니다.

package rtong.rss;

import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

public class RssReaderTest {
    private static String url ="http://feeds.feedburner.com/rtong";

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        
        URL feedUrl = new URL(url);
        SyndFeedInput input = new SyndFeedInput();
        SyndFeed syndFeed = input.build(new XmlReader(feedUrl));
        
        /*RSS*/
        System.out.println("### getFeedType [" + syndFeed.getFeedType() +"]");
        System.out.println("### getLanguage [" + syndFeed.getLanguage() +"]");
        System.out.println("### getTitle [" + syndFeed.getTitle() +"]");
        System.out.println("### getPublishedDate [" + syndFeed.getPublishedDate() +"]");

        List<SyndEntry> entries = syndFeed.getEntries();        
        SyndEntry entry = null;
        
        /*발행정보*/
        for(int i=0, j=entries.size(); i<j ; i++) {
            entry = entries.get(i);
            System.out.println("### getTitle [" + entry.getTitle() +"]");
            System.out.println("### getUri [" + entry.getUri() +"]");
            System.out.println("### getDescription [" + entry.getDescription().getValue() +"]");
            System.out.println("### getPublishedDate[" + entry.getPublishedDate().getTime() +"]");

            /*카테고리*/
            StringBuffer cate = new StringBuffer();
            if(entry.getCategories()!=null && entry.getCategories().size()>0){
             for(int ii=0,jj=entry.getCategories().size(); ii<jj; ii++){
             SyndCategoryImpl ss = (SyndCategoryImpl)entry.getCategories().get(ii);
             cate.append(CommonUtils.replace(ss.getName(), " ", "") ).append(",");
             }
            }
            System.out.println("### category [" + cate.toString() +"]");
        }        
    }
}

오픈소스를 이용하니 이렇게 간단하게 끝납니다. 근데 이걸 미련스럽게 혼자서 처음부터 다 만들려고 했다면 내년까지 RSS 읽어오는 부분을 하고있을 것 같네요.(그래도 버그 있고.. 호환성 문제 생기고 그러겠죠...) 세상의 모든 오픈소스에 감사합니다 

우선 위 소스 정도면 제가 원하는 정보를 다 가지고 옵니다. 하지만 사소한 문제가 하나 있습니다. description(발행한 글 본문)을 가져올때 본문의 태그까지 모조리 가져오는데 제게 필요한건 태그가 포함된 본문 전체가 아니라 텍스트만 필요하기 때문입니다. 해서 "태그 빼고 글자만"이라고 검색을 해보니 PHP에는 strip_tags라는 함수가 있는 것 같더군요. 해서 이리 저리 검색을 해보니 복잡하게 구현된 것도 있었지만 제가 원하는 결과물은 나오지 않았습니다. 그러다 구글링을 통해 놀라온 소스를 발견했지요. @@ 단 일곱줄로 제가 원하는 기능을 구현해 놓은 겁니다. (replaceAll 안의 정규식은 무슨 의미인지 모르겠네요.)

public static String stripTags(String text) {
if (text != null) {
return text.replaceAll("\\<.*?>","").trim();
} else {
return "";
}
}

위 전체 소스에서 entry.getDescription().getValue()를 stripTags(entry.getDescription().getValue())로만 해주면 태그는 빼고 사용자가 직접 입력한 내용만 추출됩니다. 오늘은 위 내용을 DB화 하는 부분을 구현하면 되겠습니다. 혹시 문제가 있는 부분이 발견되면 말씀해주세요 ^^;;




  1. BlogIcon 비케이 소울 2010.11.12 12:56 신고

    직접 rss리더를 제작하신건가요???? 잘 모르겠지만, 대단하십니다...

    • BlogIcon 알통 2010.11.12 15:09 신고

      대단하긴요, 제가 코딩한건 실제10줄인데요 ㅋㅋ

  2. BlogIcon 에이군 2011.02.20 22:14

    안녕하세요
    올려주신 글의 소스를 참조하여 약간 수정하여 제 블로그에 http://blog.naver.com/pdc222 글을 작성했습니다. 허락없이 올린점 양해 부탁 드립니다. ^^;;

    (throws IllegalArgumentException, FeedException, IOException 와
    CommonUtils 제거)

  3. 공대생 2013.03.31 18:08

    안녕하세요, 졸업작품 준비중인 공대생입니다. 글 잘 읽었습니다. 저도 RSS리더기를 만들어야하는데,자바가 처음이라서 오픈소스의 코드를 그대로 붙여넣고, 라이브러리를 추가해도 제대로 작동을 안합니다. 죄송하지만 혹시 추가적인 사항에 대한 팁을 얻을 수 있을까요?