Digester Digester란?

황제낙엽 2008.05.07 10:32 조회 수 : 73 추천:114

sitelink1 http://commons.apache.org/digester 
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

 설명1 :  

 

digester는 XML파일로 저장된 정보를 java 객체에 매핑해 주는 API입니다. 하지만 그 반대기능은 되지 않습니다.

보통은 XML파일을 parsing할때 SAX와 DOM을 이용하였지만 DOM은 성능이 좀 느리고, SAX는 DOM보다는 빠르지만 코드가 난잡해 집니다.

digester는 SAX기반이지만 pattern 매칭으로 아주 쉽고 빠르게 XML 파일을 parsing합니다

원래 digester는 struts의 struts-config.xml 정보를 로딩하기위해 개발되어 struts의 한 부분이었는데 독립적으로 commons project로 분리되었습니다.


 설명2 :  

 

 

자바에서 xml을 파싱하는 데에는 여러 방법이 있다.  가장 원시적인 방법으로는 sax나 dom을 이용하는 방법이 있겠고, 거기에서 조금 편하게 jdom 또는 dom4j를 사용하기도 한다(더 원시적으로 직접 입력 스트림을 직접 파싱할 수도 있겠다 -_-;).  고수준의 방법으로 JAXB나 기타 등등의 여러 xml - java  object binding api도 있다.  java binding api가 사용하기에는 가장 간편하지만 딱 입맛에 맞게 사용하기에는 쉽지 않다.  더구나 이들 api들은 묵직한 감이 있어 간단히 사용하기에는 부담스럽기도 하다.  보통 사용하는데에는 sax - jdom 수준에서 조금 편한 정도가 괜찮은 것 같은데 jakarta commons digest가 딱 그 정도인 듯 싶다.

digester는 xml을 읽어서 자바 객체를 만드는 데 쓴다. 자바 객체를 xml로 저장하는 데는 이용할 수 없다.  digester 설명에는 "XML-to-Java-Object mapping utility"라고 되어 있는데 object mapping(또는 binding)이라는 개념으로 이해하고자 하면 사용 방법을 익히기가 어렵다.  sax와 같이 event-driven 식으로 동작한다고 보면 사용 방법을 쉽게 이해할 수 있다.

digester는 xml element에 따라 동작할 rule을 지정하는 방식으로 사용한다.  이 rule은 미리 만들어진 것들도 많아 이것들을 등록하기 위한 많은 메서드가 있다.  따라서 처음 보기에 혼란스러운데 이 모든 것이 각각의 특별한 rule을 등록하는 거라 이해하면 된다.

rule은 org.apache.commons.digester.Rule 클래스를 확장한 클래스인데, begin, body, end 메서드가 있어서 각각 xml element에 진입할 때, element 내용을 읽을 때, element를 닫을 때 호출된다. 또한 digester에는 하나의 스택이 있어 이 Rule 클래스에서스택 조작(push, pop, peek)을 할 수 있다.  Rule들은 객체를 생성하거나 스택으로부터 가져와서 xml attriubte 또는 text element의 값을 가지고 객체의 메서드를 호출하고, 그 객체를 스택에 push하는 등의 방법으로 동작한다.  xml 엘리먼트를 지정하는 문법(?)만 알고 Rule의 동작 원리만 이해하면 digester의 동작은 쉽게 이해할 수 있다.

설정 파일을 xml로 저장하고 이를 읽어 들이는 경우 같이 sax, dom4j, jdom 등으로 처리하기에는 번거롭고 JAXB와 같은 binding api를 쓰기에는 부담스러울 때 간단히 digester를 쓰면 좋다.