메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

XML 데이터베이스 외부에서 XML 문서 쿼리하기

XQuery를 사용하여 Maven 프로젝트를 분석하는 방법을 배우자.

Adriaan de Jonge, Kỹ sư phần mềm, 自由职业者
Adriaan de Jonge là chuyên gia phát triển phần mềm hiện đang làm việc cho chính phủ Hà Lan, xử lý một vài dự án với các vai trò khác nhau. Adriaan đã viết các bài viết liên quan đến XML cho developerWorks của IBM và Amazon

요약:  Java로 XML을 처리하려면 일반적으로 많은 코드가 필요하며 오버헤드도 많이 발생합니다. XQuery를 사용하면 XML 데이터베이스 외부에 XML을 저장하는 경우에도 더 적은 코드로 더 많은 작업을 수행할 수 있습니다. Java 기술과 XQuery를 사용하여 XML 기반 Maven POM 파일에서 숨겨진 정보를 추출하는 방법을 배웁니다.

원문 게재일:  2010 년 7 월 13 일 번역 게재일:   2010 년 12 월 31 일
난이도:  초급 원문:  보기 PDF:  A4 and Letter (54KB | 14 pages)Get Adobe® Reader®
페이지뷰:  2460 회
의견:  


자주 사용하는 약어

  • API: Application Programming Interface
  • HTTP: Hypertext Transfer Protocol
  • POM: Project Object Model
  • SQL: Structured Query Language
  • URL: Uniform Resource Locator
  • W3C: World Wide Web Consortium
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations

대부분의 XML 데이터는 일반적으로 XML 데이터베이스에 저장되지 않는다. XQuery는 데이터베이스 쿼리 기능으로 잘 알려져 있지만 XQuery를 효과적으로 사용하기 위한 데이터베이스를 필요로 하지 않는다. 또한, XQuery를 사용하여 다양한 비XML 스토리지 매체에 있는 XML 문서를 조사하고 분석할 수 있다.

예를 들면, Java 개발자는 POM(Maven Project Object Model) 파일을 사용하여 프로젝트를 빌드하고 의존성을 관리한다. Maven은 의존성 관리를 전문으로 하는 Java 빌드 도구라고 할 수 있으며 Maven 웹 사이트에서 정의한 바와 같이 "소프트웨어 프로젝트 관리 및 이해 도구"라고 할 수도 있다. 일반적으로 Maven은 Maven POM 파일에 있는 정보를 사용하는 프로그램일 뿐이다. 그러나 POM 파일은 XML 형식으로 되어 있기 때문에 XQuery를 사용하면 이 파일을 쉽게 읽어서 자체적으로 분석할 수 있다. "아직도 Log4J 이전 버전을 사용하고 있는 프로젝트가 얼마나 많을까?"라고 질문할 수도 있다.

XQuery 사용

XQuery와 관련하여 일반적으로 잘못 생각하고 있는 점은 XQuery를 기본 XML 데이터베이스의 SQL 버전이라고 생각한다는 점이다. XQuery의 기능에 이러한 특성이 있긴 하지만 XQuery는 XML 데이터베이스를 사용할 필요가 없는 완전한 프로그래밍 언어이다.

함수형 프로그래밍

Java 커뮤니티에는 함수형 언어와 관련된 많은 이야기가 있다. 얼리어답터들은 Clojure, Scala 및 F#을 시험하고 있다. XQuery는 함수형 언어이지만 함수형 언어를 애호가들이 언제나 이 사실을 인식하는 것은 아니다.

2007년 이후로 XQuery는 공식 W3C 권장사항이었으며 널리 지원되었다. IBM® DB2®, Oracle 및 Microsoft® SQL Server®와 같은 기존의 데이터베이스는 모두 XML을 처리하기 위해 XQuery를 지원한다. eXist 및 MarkLogic Server와 같은 기본 XML 데이터베이스는 XQuery에 매우 적합한 데이터베이스라고 할 수 있다. 또한, 소규모의 상업용, 오픈 소스 및 학술용 XQuery 구현의 대부분을 인터넷에서 얻을 수 있으며 일부는 기본 XML 데이터베이스에 번들되어 있기도 하다. 이밖에 데이터베이스와는 관련이 없는 독립형 XQuery 프로세서가 있다.

독립형 구현

잘 알려진 독립형 XQuery 프로세서는 Saxonica의 오픈 소스판인 Saxon-HE(Saxon Home Edition)이다. 이 프로세서는 XSLT 버전 2.0과 XPath 버전 2.0을 지원하며 성능에 최적화되어 있다. 이 기사에서는 Saxon을 사용하여 데이터베이스 환경 외부에서 XQuery를 사용하는 방법을 설명한다.

저장된 위치와 관계없이 모든 XML 문서를 XQuery를 사용하여 처리할 수 있다. 대부분의 XML 문서는 로컬 파일 시스템에 저장하거나 기존의 관계형 데이터베이스에 BLOB(Binary Large Object)으로 저장한다. 더구나 원시 XML 데이터베이스 외부에서 XQuery를 사용하지 않는 것은 낭비이다.

게다가 XQuery로 처리할 데이터의 형식이 XML일 필요도 없다. 예를 들어, 확장 함수를 사용하여 비XML 데이터를 검색하는 경우, 효과적인 방법으로 XML 결과물을 생성하려면 XQuery를 사용하는 것이 좋다. 다음 쿼리는 데이터베이스를 필요로 하지 않는 가장 간단하고 가능성 있는 XQuery 쿼리 중 하나이다.

<sum>{2+3}</sum>

이 쿼리의 결과는 다음과 같다.

<sum>5</sum>

XQuery와 관련된 또 다른 오해로는 XQuery가 FLWOR(let, where, order by, return) 표현식을 필요로 한다는 점이다. 이 점은 SQL이 SELECT-FROM-WHERE 표현식을 필요로 한다고 잘못 생각하는 것과 마찬가지이다. FLWOR 표현식이 기능이 우수하고 다양한 쿼리에서 사용되지만 이 표현식을 사용하지 않아도 많은 작업을 수행할 수 있다. 또한, 올바른 모든 XPath 2.0 표현식은 올바른 XQuery 1.0 표현식이기도 하다. XQuery는 언어의 기능을 강화하여 대규모 조작이 가능하도록 하는 반면에 XPath는 그 자체로는 코드 한 줄 정도의 소규모 쿼리와 표현에 매우 적합하다.

예제 실행하기

XQuery 코드를 실행하는 방법은 다양하다. XML 데이터베이스에서의 가능성은 제품마다 다양하다. XML 데이터베이스 외부에서 명령행 프로그램을 사용하거나 Java 코드 몇 줄을 작성하여 XQuery를 호출할 수 있다.

XQuery API for Java(XQJ—Java Specification Request [JSR] 225)는 XQuery 코드를 호출하는 데 필요한 표준 Java API이다. Listing 1에는 XQJ를 사용하여 예제를 실행하는 간단한 방법이 표시되어 있다.

예제는 HTTP 서블릿에서 취한 메소드 호출로 구성된다. 먼저, XQuery 프로세서에 연결을 설정한다. Java 클래스와 동일한 패키지에서 자원으로 클래스 경로에 포함된 텍스트 파일(simple.xqy)에서 XQuery를 읽는다. 쿼리를 실행한 다음, 루프를 사용하여 결과 세트(하나의 결과만 포함되어야 함)를 처리하고 이 결과를 해당 서블릿의 OutputStream에 쓴다.


Listing 1. XQJ API를 사용하여 XQuery 코드 실행하기

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, 
        IOException {
    try {
        XQDataSource dataSource = new SaxonXQDataSource();
        XQConnection connection = dataSource.getConnection();
        InputStream inputStream = 
            this.getClass().getResourceAsStream("simple.xqy");
        XQPreparedExpression expression =
            connection.prepareExpression(inputStream);
        XQResultSequence result = expression.executeQuery();
        while (result.next()) {
            result.writeItem(response.getOutputStream(), null);
        }
    } catch (XQException e) {
        throw new ServletException(e);
    }
}

XQJ와 JDBC(Java Database Connectivity)는 사용 방법이 거의 비슷하다. 데이터베이스에 연결하고 쿼리를 준비하여 쿼리를 실행한 다음, 그 결과를 읽는다. 이러한 방식은 XML 데이터베이스를 쿼리하는 데 매우 적합하다. 또한, 결과를 읽는 데 필요한 API는 XQuery 코드를 Java 코드에 통합할 수 있게 도와준다.

XML 데이터베이스 대신 Saxon XQuery 프로세서를 사용하면 XQJ 이름 지정이 약간 잘못된다. Saxon을 사용하는 경우에는 사실상 연결을 작성하지 않는다. 그 대신 프로세서를 호출한다. Listing 2에는 Saxon API를 사용하여 XQuery 코드를 호출하는 다양한 방법이 표시되어 있다.


Listing 2. Saxon을 사용하여 XQuery 코드 실행하기

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, 
        IOException {
    try {
        Processor processor = new Processor(false);
        XQueryCompiler compiler = processor.newXQueryCompiler();
        Serializer serializer = new Serializer();
        serializer.setOutputStream(response.getOutputStream());
        InputStream inputStream = 
            this.getClass().getResourceAsStream("simple.xqy");
        XQueryExecutable executable = compiler.compile(inputStream);
        XQueryEvaluator evaluator = executable.load();
        evaluator.setDestination(serializer);
        evaluator.run();
    } catch (SaxonApiException e) {
        throw new ServletException(e);
    }
}

Saxon API를 이용하면 다수의 프로세서를 비교적 간단하게 XML 파이프라인에 연결할 수 있다. 이러한 프로세서는 다른 XQuery 구현이 될 수 있지만 또한, XSLT나 Java 코드가 될 수도 있다.

이 기사에 있는 예제의 경우에는 두 API가 모두 제대로 작동한다. 일반적으로 프로그램이 Java 코드에 많이 의존하는 경우에는 다른 XQuery 구현에 대한 이식성과 구문 때문에 XQJ를 사용한다. 이와는 반대로 프로그램에서 XQuery나 XSLT와 같은 XML 기술을 많이 사용하고 Java 코드는 일부만 사용하는 경우에는 특정 Saxon API를 사용한다.


XQuery와 Maven POM 파일

XML 데이터베이스 외부에 존재하는 XML에 대한 좋은 사례로는 Maven POM 파일을 들 수 있다. 대부분의 경우에 POM 파일을 실제로 읽는 도구는 Maven이 유일하다. XML 기반 POM 파일의 가능성을 생각해 보면, 이 파일은 개방되어 있고 어떤 플랫폼에서도 읽을 수 있으며 사용하지 않는 많은 소프트웨어 프로젝트 정보를 포함하고 있다. 그리고 아직 Maven 외부에서는 이 파일을 거의 사용하지 않고 있다.

이러한 상황은 쉽게 바뀔 수 있다. XQuery를 사용하면 단 몇 줄의 코드만으로 Maven POM 파일에서 가치 있는 정보를 검색할 수 있다. 그렇지만 이렇게 하기 전에 Maven POM 파일에 어떤 정보가 숨겨져 있는지 잠시 생각해 보도록 하자. 일상적인 개발 과정에서 처리할 유지보수 문제는 어떤 것인가? Maven POM 파일을 XQuery로 분석하는 것이 이러한 문제를 해결하는 데 어떻게 도움을 주나?

기본적인 종속성 검색하기

회사에 다수의 소프트웨어 프로젝트가 있는 경우에는 어느 정도 일정하게 라이브러리를 사용하는 것이 현명하다. 프로젝트에서 사용하고 있는 Log4J 버전을 예로 들 수 있다. Listing 3과 같은 하나의 POM 파일을 쿼리하여 확인해 보자.


Listing 3. Log4J 버전 판별하기

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $doc := doc("http://krank.googlecode.com/svn/trunk/pom.xml")
return <results>{$doc//m:dependency[m:artifactId eq 'log4j']/m:version/text()}</results>

이 쿼리의 결과는 다음과 같다.

<results>1.2.131.2.13</results>

참고: 이 POM 파일은 공개적으로 사용할 수 있기 때문에 Google Code에서 임의로 가져왔다. 그러나 이 파일은 이 기사가 나간 이후에 변경되거나 없어질 수 있다. 다른 예제가 필요한 경우에는 Google Code에서 pom.xml 파일을 검색하여 이 POM 파일을 쉽게 수정할 수 있다.

적어도 이 기사를 쓰는 현재, 쿼리를 실행하면 두 가지 버전의 텍스트가 나란히 표시된다. 이러한 특정 POM 파일의 내용을 알면 이 결과가 논리적이라는 점을 이해할 수 있다. 두 가지 종속성 선언은 Log4J를 참조하며 하나는 코드에 해당하고 다른 하나는 플러그인에 해당한다.

별도의 요소에서 버전을 작성하면 버전을 구분하기가 훨씬 더 수월하다. 예를 들면, 단순한 for 구문을 사용할 수 있다(Listing 4 참조).


Listing 4. 별도의 요소에서 버전 작성하기

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $doc := doc("http://krank.googlecode.com/svn/trunk/pom.xml")
let $versions := $doc//m:dependency[m:artifactId eq 'log4j']/m:version/text()
return <results>
{
    for $version in $versions
    return <version>{$version}</version>
}
</results>

이 쿼리의 결과는 다음과 같다.

<results>
   <version>1.2.13</version>
   <version>1.2.13</version>
</results>

이 결과에는 같은 버전 번호가 반복해서 표시되었으므로 엄밀히 말해서 이 결과는 질문에 대한 답변이 될 수 없다. 질문은 "프로젝트에서 사용하고 있는 Log4J의 버전 번호는 무엇인가?"였다. 첫 번째 <version> 요소가 표시되고 나면 버전 1.2.13이 사용되었다는 점은 이미 분명하다. 두 번째 <version> 요소는 버전이 다른 경우에만 표시되어야 한다.

Listing 5에서와 같이 distinct-values() 함수를 사용하여 이 종속성을 쉽게 수정할 수 있다.


Listing 5. version 요소의 중복 제거하기

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $doc := doc("http://krank.googlecode.com/svn/trunk/pom.xml")
let $versions := distinct-values($doc//m:dependency[m:artifactId eq 'log4j']/m:version)
return <results>
{
    for $version in $versions
    return <version>{$version}</version>
}
</results>

이 쿼리의 결과는 다음과 같다.

<results>
   <version>1.2.13</version>
</results>

다음 단계에서는 하나의 문서 대신 문서 세트를 쿼리한다. 이렇게 하려면 Listing 6을 약간 변형해야 한다.


Listing 6. 한 번에 다수의 Maven POM 쿼리하기

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $docs :=  (doc("http://q4e.googlecode.com/svn/trunk/pom.xml"),
               doc("http://gmaps4jsf.googlecode.com/svn/trunk/pom.xml"),
               doc("http://java-twitter.googlecode.com/svn/trunk/pom.xml"),
               doc("http://xmlzen.googlecode.com/svn/trunk/pom.xml"),
               doc("http://krank.googlecode.com/svn/trunk/pom.xml"))
let $versions := distinct-values($docs//m:dependency[m:artifactId eq 'log4j']/m:version)
return <results>
{
    for $version in $versions
    return <version>{$version}</version>
}
</results>

이 쿼리의 결과는 다음과 같다.

<results>
   <version>1.2.14</version>
   <version>1.2.13</version>
</results>

별도로 for 루프를 사용할 것으로 예상했을 수도 있다. 이 예제에서는 문서를 로드한 다음 쿼리할 수 있는 시퀀스에 삽입한다. XQuery 구현에 따라서는 메모리 사용 면에서 이러한 구성이 효과적이지 못할 수도 있다. 성능과 자원 사용 문제는 이 기사의 마지막 부분에서 살펴본다.

또 다른 질문은 이러한 모든 문서 참조를 XQuery 코드에 하드 코딩할 것인지 여부이다. 물론 이러한 URL을 XML 파일에 삽입하여 쿼리의 입력으로 전달할 수도 있지만 그것은 개인적 취향일 뿐이다.

자세한 정보 검색하기

지금은 쿼리 결과에 모든 프로젝트에서 사용하는 Log4J 버전만 표시된다. 어떤 프로젝트에서 어떤 버전을 사용하는지는 표시되지 않는다. Log4J 종속성을 쿼리하고 나면 같은 문서에서 <name> 요소를 검색하는 작업은 매우 간단하다. Listing 7에서와 같이 XPath ancestor 축을 이용하면 해당 문서의 상위 문서를 검색할 수 있다.


Listing 7. 쿼리 결과에 프로젝트 이름 추가하기

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $docs :=  (doc("http://q4e.googlecode.com/svn/trunk/pom.xml"),
               doc("http://gmaps4jsf.googlecode.com/svn/trunk/pom.xml"),
               doc("http://java-twitter.googlecode.com/svn/trunk/pom.xml"),
               doc("http://xmlzen.googlecode.com/svn/trunk/pom.xml"),
               doc("http://krank.googlecode.com/svn/trunk/pom.xml"))
return <results>
{
    for $doc in $docs//m:dependency[m:artifactId eq 'log4j']
    let $name := $doc/ancestor::m:project/m:name/text()
    let $version := $doc/m:version/text()
    return
        <result>
            <project-name>{$name}</project-name>
            <version>{$version}</version>
        </result>
}
</results>

이 쿼리의 결과는 다음과 같다.

<results>
   <result>
      <project-name>XML Zen</project-name>
      <version>1.2.14</version>
   </result>
   <result>
      <project-name>Crank :: ROOT</project-name>
      <version>1.2.13</version>
   </result>
   <result>
      <project-name>Crank :: ROOT</project-name>
      <version>1.2.13</version>
   </result>
</results>

그렇지만 중복된 결과가 반복되는 문제가 있다. 이 쿼리에는 distinct-values() 함수가 포함되어 있지 않으므로 이러한 결과는 당연하다. 그리고 이 함수를 이용하면 중복 문제를 수정할 수 있었다. 그런데 왜 이 함수를 제거했을까?

distinct-values() 함수는 XML 요소 대신 텍스트 값을 리턴한다. 텍스트 값을 대상으로 ancestor를 쿼리하는 것은 불가능하다. 다시 중복 문제를 해결하려면 Listing 8과 같이 쿼리를 약간 변경해야 한다.


Listing 8. 버전 중복 문제 다시 제거하기

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $docs :=  (doc("http://q4e.googlecode.com/svn/trunk/pom.xml"),
               doc("http://gmaps4jsf.googlecode.com/svn/trunk/pom.xml"),
               doc("http://java-twitter.googlecode.com/svn/trunk/pom.xml"),
               doc("http://xmlzen.googlecode.com/svn/trunk/pom.xml"),
               doc("http://krank.googlecode.com/svn/trunk/pom.xml"))
let $artifactId := 'log4j'
return <results>
{
     for $doc in $docs[//m:artifactId = $artifactId]
     let $name := $doc/m:project/m:name/text()
     return
         <result>
             <project-name>{$name}</project-name>
             {
                 let $versions := distinct-values($doc//m:dependency[m:artifactId
                 	eq $artifactId]/m:version)     
                 for $version in $versions
                 return <version library="{$artifactId}">{$version}</version>
             }
         </result>
}
</results>

이 쿼리의 결과는 다음과 같다.

<results>
   <result>
      <project-name>XML Zen</project-name>
      <version library="log4j">1.2.14</version>
   </result>
   <result>
      <project-name>Crank :: ROOT</project-name>
      <version library="log4j">1.2.13</version>
   </result>
</results>

등호(=)와 eq 연산자 간의 차이에 주의한다. eq 연산자는 원자값을 비교하는 데만 사용할 수 있다. 이 연산자를 항목의 시퀀스를 비교하는 데 사용하면 코드를 실행할 때 오류가 발생한다. 등호(=)는 시퀀스를 비교할 때 사용할 수 있다. eq 연산자를 사용하게 되면 오류가 발생할 가능성이 언제나 있으며 이 연산자가 원자적 값을 처리한다고 확신할 경우에만 사용해야 한다는 점을 기억해야 한다.

마지막 예제에서는 for 루프와 변수 $artifactId를 추가했다. 이 추가 변수는 결과가 중복되지 않도록 하기 위해 사용하며 결과적으로 다음 단계에서는 다른 방식으로 대체된다. 추가로 for 루프를 사용하는 데 대해서는 아무런 규칙이 없다. 그러나 가능하면 코드를 간결하게 해야하는 위치에는 for 루프를 사용하지 않는 것이 좋다.

어떤 경우에는 하나의 for 루프를 추가로 사용하여 다양한 효과를 거둘 수 있다. 예를 들어, 쿼리 결과에 JUnit의 버전을 추가하고 싶다고 하자. 이러한 작업은 코드를 약간만 변경하면 된다(Listing 9 참조).


Listing 9. 사용 중인 JUnit 버전 판별

declare namespace m = "http://maven.apache.org/POM/4.0.0";
let $docs :=  (doc("http://q4e.googlecode.com/svn/trunk/pom.xml"),
               doc("http://gmaps4jsf.googlecode.com/svn/trunk/pom.xml"),
               doc("http://java-twitter.googlecode.com/svn/trunk/pom.xml"),
               doc("http://xmlzen.googlecode.com/svn/trunk/pom.xml"),
               doc("http://krank.googlecode.com/svn/trunk/pom.xml"))
let $artifactIds := ('log4j', 'junit')
return <results>
{
     for $doc in $docs[//m:artifactId = $artifactIds]
     let $name := $doc/m:project/m:name/text()
     return
         <result>
             <project-name>{$name}</project-name>
             {
                 for $artifactId in $artifactIds
                     let $versions := distinct-values($doc//m:dependency[m:artifactId
                     	eq $artifactId]/m:version)     
                     for $version in $versions
                     return <version library="{$artifactId}">{$version}</version>
             }
         </result>
}
</results>

이 쿼리의 결과는 다음과 같다.

<results>
   <result>
      <project-name>GMaps4JSF Project</project-name>
      <version library="junit">3.8.1</version>
   </result>
   <result>
      <project-name>java-twitter</project-name>
      <version library="junit">4.5</version>
   </result>
   <result>
      <project-name>XML Zen</project-name>
      <version library="log4j">1.2.14</version>
      <version library="junit">4.6</version>
   </result>
   <result>
      <project-name>Crank :: ROOT</project-name>
      <version library="log4j">1.2.13</version>
   </result>
</results>

성능 관련 고려사항

이 기사에서는 XQuery를 사용하는 경우에는 기본 XML 데이터베이스가 필요하지 않다는 점을 설명했다. 그렇지만 목적이 다른 경우에는 주의해야 한다. Maven 분석은 부수적으로만 수행하는 것이다. 쿼리를 처리하는 데 1분 정도 시간이 걸리더라도 기꺼이 기다릴 수 있을 것이다.

쿼리에 있는 Maven 문서의 수가 증가함에 따라 모든 문서를 한 번에 메모리로 로드하는 데 문제가 생길 수 있다. 우수한 XQuery 구현이라면 메모리 문제를 피할 수 있다. 예를 들면, 직접 doc() 함수를 여러 번 호출하는 대신 $docs 변수를 URL 참조가 포함된 작은 XML 스니핏으로 바꾸는 것을 고려할 수도 있다. for 루프 내에서 doc() 함수를 호출하면 전체 메모리 사용량을 줄일 수 있다. 이런 경우에는 XML 데이터베이스가 특별히 요청한 요소만을 로드하기 때문에 XML 데이터베이스를 사용하는 것이 유용하다.

프로덕션 환경에서 사용할 솔루션을 작성할 경우에는 직접 외부 URL에서 데이터를 자주 검색하는 것이 좋지 않을 수도 있다. 그 대신 백그라운드 프로세스를 통해 데이터를 주기적으로 로컬 저장소로 복사하는 것이 좋다. 로컬 저장소가 XML 데이터베이스면 데이터베이스 인덱스로 인해 XQuery 처리가 훨씬 더 빨라진다.


결론

Maven POM 파일에 숨겨진 데이터를 분석하는 다수의 XQuery 쿼리를 살펴보았다. 요구사항이 더욱 세밀해지면 쿼리의 복잡도가 서서히 증가한다. 그럼에도 결과적으로 XQuery 코드는 간결하게 유지되며 다른 언어를 사용하여 XML을 처리할 때 발생하는 오버헤드가 생기지 않는다.

이 기사에서는 대부분의 Java 개발자들이 익숙하다는 점 때문에 Maven을 사용했으며 대부분의 Maven 파일을 XML 데이터베이스에 저장하지 않았다. 매우 다양한 목적으로 XQuery를 사용할 수 있다. Java 도메인 내에서 Spring 구성이나 배치 디스크립터를 생각해 보도록 하자. Java 도메인 외부에는 무궁무진한 가능성이 열려 있다.



다운로드 하십시오

설명이름크기다운로드 방식
Sample files for this articlemaven-xquery-src-v2.zip1952KBHTTP

다운로드 방식에 대한 정보


참고자료

교육

제품 및 기술 얻기

토론

필자소개

Adriaan de Jonge là chuyên gia phát triển phần mềm hiện đang làm việc cho chính phủ Hà Lan, xử lý một vài dự án với các vai trò khác nhau. Adriaan đã viết các bài viết liên quan đến XML cho developerWorks của IBM và Amazon

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, 오픈 소스
ArticleID=605636
ArticleTitle=XML 데이터베이스 외부에서 XML 문서 쿼리하기
publish-date=07132010
author1-email=adriaandejonge@gmail.com
author1-email-cc=dwxed@us.ibm.com

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.