JAXR (JAVA API FOR XML REGISTRIES)

Java EE 2005/05/18 16:18 Posted by Sun

JAXR(Java API for XML Registries)은 인터넷을 통해 표준 비즈니스 레지스트리에 액세스할 수 있는 편리한 방법을 제공한다. 비즈니스 레지스트리에는 기업이 잠재 기업 파트너가 제공하는 서비스를 검색하고 사용할 수 있게 해주는 정보가 담겨 있다. 일반적으로, 기업은 레지스트리로 등록을 하거나 상호작용할 만한 다른 기업을 검색하기 위해 레지스트리를 이용한다. Java Web Services Developer Pack 1.5에서 제공하고 J2EE 1.4 튜토리얼에도 기술되어 있는 간단한 JAXR 예제에 기초한 이 테크팁은 자바 클라이언트 애플리케이션이 어떻게 JAXR API를 이용하여 인터넷 상의 비즈니스 레지스트리에 액세스할 수 있는지를 보여준다.

비즈니스 레지스트리는 완벽한 전용 XML 레지스트리로, 동적 및 소결합 B2B 상호작용을 가능케 하는 중립적인 제3자 인프라이다. 이 상호작용들은 일반적으로 다음 두 가지 표준 중 하나를 따른다.

  • OASIS(Organization for the Advancement of Structured Information Standards)와 U.N./CEFACT(United Nations Centre for the Facilitation of Procedures and Practices in Administration, Commerce and Transport)가 후원하는 ebXML 레지스트리 및 리포지토리 표준
  • 벤더 컨소시엄에서 개발중인 UDDI(Universal Description, Discovery, and Integration) 프로젝트

레지스트리 제공자는 이들 표준 중 한 가지를 준수하는 비즈니스 레지스트리의 구현을 제공하는 엔티티이다.

JAXR 아키텍처

JAXR은 B2B 상호작용의 어느 쪽에서도 사용할 수 있으며, JAXR API는 다음 두 개의 엔티티로 이루어진다.

  • JAXR 클라이언트. 이는 JAXR 제공자를 통해 비즈니스 레지스트리에 액세스하기 위해 JAXR API를 사용하는 클라이언트 애플리케이션이다.
  • JAXR 제공자. 이는 공통의 스펙을 기반으로 하는 하나 이상의 레지스트리 제공자에 대한 액세스를 제공하는 JAXR API의 서버 측 구현이다.

JAXR 클라이언트는 JAXR API 내의 특수 인터페이스를 사용하여 JAXR 제공자에 액세스하고, JAXR 제공자는 레지스트리와 통신하게 된다.

JAXR provider communicates with a registry

Java Web Services Developer Pack 1.5에서 제공하는 최신의 JAXR 레퍼런스 구현(JAXR 1.0.7)에는 ebXML가 아닌 UDDI 레지스트리만을 위한 JAXR 제공자가 포함되어 있다는 점에 유의하기 바란다. UDDI에 관한 자세한 내용은 OASIS UDDI를 참조하기 바란다.

JAXR 사양에 따르면 제공자는 반드시 두 개의 패키지로 키 인터페이스를 구현하도록 되어 있다.

  • javax.xml.registry: 이는 API 인터페이스와 레지스트리 액세스 인터페이스를 정의하는 클래스로 이루어진다.
  • javax.xml.registry.infomodel: 이는 JAXR를 위한 정보 모델을 정의하는 인터페이스로 이루지며, 이 인터페이스는 레지스트리 내에 상주하는 오브젝트의 타입과 그것들이 서로간에 관계하는 방식을 정의한다. 이 패키지의 기본 인터페이스는 RegistryObject 인터페이스이다. 서브인터페이스에는 Organization, Service, ServiceBinding 등이 있다.

javax.xml.registry 패키지가 특히 중요한 이유는 다음과 같은 여러 가지 유용한 클라이언트 인터페이스를 포함하고 있기 때문이다.

  • Connection: 이 인터페이스는 레지스트리 제공자와 연결된 클라이언트 세션을 나타낸다. 클라이언트가 레지스트리를 사용하려면 반드시 JAXR 제공자와 커넥션을 생성해야 한다.
  • RegistryService: 클라이언트는 연결로부터 RegistryService 오브젝트를 획득한다. RegistryService 오브젝트는 클라이언트가 레지스트리에 액세스하기 위해 사용하는 인터페이스 BusinessQueryManager, BusinessLifeCycleManager 등을 획득할 수 있게 해준다.
  • BusinessQueryManager: 이 인터페이스를 구현하는 오브젝트는 클라이언트가 javax.xml.registry.infomodel 인터페이스와 일치하는 정보를 레지스트리에서 검색할 수 있게 해준다.
  • BusinessLifeCycleManager: 이 인터페이스를 구현하는 오브젝트는 클라이언트가 레지스트리 내의 정보를 수정하거나 삭제할 수 있게 해준다.

JAXR 커넥션 만들기

JAXR 클라이언트는 처음에 추상 클래스 ConnectionFactory의 인스턴스를 생성한다.

   import javax.xml.registry.*;
   ...
   ConnectionFactory connFactory = 
    ConnectionFactory.newInstance();

다음으로, 클라이언트는 레지스트리의 URL을 지정하는 일련의 속성을 생성한다. 예를 들어, 다음 코드는 IBM 테스트 레지스트리에 대한 질의 서비스와 출판 서비스의 URL을 제공한다.

   Properties props = new Properties();
   props.setProperty("javax.xml.registry.queryManagerURL",
       "http://uddi.ibm.com/testregistry/inquiryapi");
   props.setProperty("javax.xml.registry.lifeCycleManagerURL",
       "https://uddi.ibm.com/testregistry/publishapi"); 

필요에 따라(가령 방화벽 뒤에 있는 경우) 클라이언트가 실행되는 네트워크에 대한 프록시 호스트 및 포트 정보를 지정할 수 있다. 질의의 경우, 클라이언트는 HTTP 프록시 호스트 및 포트만을 지정해야 할 수도 있으며, 업데이트의 경우에는 일반적으로 HTTPS 프록시 호스트 및 포트 또한 지정해야 한다.

   props.setProperty("com.sun.xml.registry.http.proxyHost", 
     "myhost.mydomain");
   props.setProperty("com.sun.xml.registry.http.proxyPort", 
     "8080");
   props.setProperty("com.sun.xml.registry.https.proxyHost", 
     "myhost.mydomain");
   props.setProperty("com.sun.xml.registry.https.proxyPort", 
     "8080");

그런 다음 클라이언트는 커넥션 팩토리(connection factory)에 대한 속성을 설정하고 커넥션을 생성한다.

   connFactory.setProperties(props);
   Connection connection = connFactory.createConnection(); 

커넥션을 생성한 후 클라이언트는 커넥션을 이용하여 RegistryService 오브젝트를 획득한다. 그런 다음 RegistryService를 이용하여 적절한 질의 인터페이스를 구현하는 오브젝트를 획득한다.

   RegistryService rs = connection.getRegistryService();
   BusinessQueryManager bqm = rs.getBusinessQueryManager();
   BusinessLifeCycleManager blcm = 
       rs.getBusinessLifeCycleManager();

클라이언트가 레지스트리에 데이터를 읽고 쓸 필요가 있는 경우에는 RegistryService 오브젝트로부터 BusinessQueryManager 오브젝트와 BusinessLifeCycleManager 오브젝트를 모두 획득해야한다. 클라이언트가 간단한 질의만을 수행하는 경우에는 일반적으로 BusinessQueryManager 오브젝트만 필요하다.

레지스트리 쿼리

BusinessQueryManager 인터페이스는 클라이언트가 데이터를 검색할 수 있게 해주는 여러 가지 메소드를 지원하는데, 이 메소드들은 대부분 메소드 인자에 지정된 일련의 기준을 충족하는 BulkResponse(오브젝트의 집합)를 리턴한다. 다음은 메소드들 중에서 가장 유용한 것들이다.

  • findOrganizations: 이 메소드는 지정된 기준(흔히 분류 스키마(classification scheme) 내의 이름 패턴 또는 분류)을 충족하는 조직체(organization)의 목록을 리턴한다.
       public BulkResponse findOrganizations(
                                     Collection findQualifiers,
                                     Collection namePatterns,
                                     Collection classifications,
                                     Collection specifications, 
                                     Collection externalIdentifiers,
                                     Collection externalLinks)
                              throws JAXRException
    
  • findServices: 이 메소드는 지정된 조직체가 제공하는 일련의 서비스를 리턴한다.
       public BulkResponse findServices(Key orgKey,
                                        Collection findQualifiers,
                                        Collection namePatterns,
                                        Collection classifications,
                                        Collection specifications)
                                 throws JAXRException
    
  • findServiceBindings: 이 메소드는 지정된 서비스에 의해 지원되는 서비스 바인딩(서비스에 액세스하는 방법에 관한 정보)을 리턴한다.
       public BulkResponse findServiceBindings(Key serviceKey,
                                          Collection findQualifiers,
                                          Collection classifications,
                                          Collection specifications)
                                   throws JAXRException
    

이름으로 조직체를 검색하기 위해서는 찾기 수식어와 이름 패턴의 조합을 이용한다. findOrganizations() 메소드는 findQualifier 오브젝트 집합을 1차 인자로, namePattern 오브젝트의 집합을 2차 인자로 선택한다. 클라이언트는 퍼센트 부호(%)를 이용하여 조직체 이름 내의 어느 곳에서나 질의 문자열이 발견될 수 있음을 명시한다. 예를 들어, 다음의 코드 단편은 이름에 qString에 포함된 문자가 들어 있는 조직체에 대하여 대소문자를 구분하는 검색을 수행한다.

   ArrayList qualifiers = new ArrayList();
   qualifiers.add(FindQualifier.CASE_SENSITIVE_MATCH);
   qualifiers.add(FindQualifier.SORT_BY_NAME_DESC);

   ArrayList names = new ArrayList();
   names.add("%" + qString + "%");

   BulkResponse response =
     bqm.findOrganizations(
             qualifiers, names, null, null, null, null);

   Collection orgs = response.getCollection(); 

분류를 이용해 조직체를 찾을 수도 있다. 이를 위해서는 특정한 분류 스키마 내에서 분류를 설정한 다음 이 분류를 findOrganizations() 메소드에 대한 인자로 지정해야 한다. 다음의 코드 단편은 North American Industry Classification System (NAICS) 분류법 내의 특정 분류에 일치하는 모든 조직체를 찾는다.

   ClassificationScheme cScheme =
     bqm.findClassificationSchemeByName(null,
       "ntis-gov:naics");
   Classification classification =
     blcm.createClassification(cScheme,
       "Snack and Nonalcoholic Beverage Bars", "722213");
   Collection classifications = new ArrayList();
   classifications.add(classification);
   
   BulkResponse response = bqm.findOrganizations(null,
     null, classifications, null, null, null);
   Collection orgs = response.getCollection(); 

클라이언트가 조직체를 찾아낸 후에는 해당 조직체의 서비스를 찾을 수 있다. 비즈니스 서비스를 호출하는 방법은 몇 가지가 있을 수 있는데, 각 호출은 UDDI에서 바인딩 템플릿에 의해 기술된다. ServiceBinding 인스턴스는 UDDI 바인딩 템플릿에 매핑하는 RegistryObjects로, 서비스 호출 방법에 관한 기술 정보를 나타낸다.

   Iterator orgIter = orgs.iterator();

   while (orgIter.hasNext()) {

     Organization org = (Organization) orgIter.next();

     Collection services = org.getServices();

     Iterator svcIter = services.iterator();
     while (svcIter.hasNext()) {

       Service svc = (Service) svcIter.next();
       Collection serviceBindings = 
         svc.getServiceBindings();

       Iterator sbIter = serviceBindings.iterator();
        while (sbIter.hasNext()) {
         ServiceBinding sb = 
           (ServiceBinding) sbIter.next();
       }

     }
   } 

이 시점에서 원시 코드는 반드시 문제의 레지스트리 타입에 대한 표준을 따라야 한다. 따라서 UDDI 예제를 계속하려면 개발자가 ServiceBinding에 대한 tModel 정보에 액세스하고 이를 이용하여 서비스 호출 방법에 관한 정확한 정보를 획득할 수 있어야 한다.

좀 자세한 내용은 다음을 참조하기 바란다.

  • JAXR: JAXR page
  • UDDI: UDDI.orgregistry finder page 참조. 레지스트리 파인더 페이지에 "Inquiry API"와 ‘"Publish API" 로 기재된 서버들은 성공적인 JAXR 커넥션을 수행하기 위해 원시 코드 내의 속성 파일에 입력할 URL들이다. UDDI 서버를 호스팅하는 회사에 등록하여 사용자 이름과 비밀번호를 받아야 할 수도 있다. 이 사이트는 tModel과 같은 로-레벨 UDDI 웹 서비스 구성소에 관한 정보를 얻는 데도 유용하다.
  • EbXML: the EbXML Page.

Sample Code

이 테크 팁을 위한 예제 코드는 JAXR를 이용하여 이름이 "%USA%"의 패턴과 일치하는 조직체에 대한 레지스트리를 조회합니다.
예제 코드를 구동하려면,

  1. 이 테크 팁을 위한 샘플 아카이브를 다운로드합니다.
  2. JWSDP 1.5를 다운로드하여 설치합니다.
  3. 예제 아카이브를 다운로드한 디렉토리로 이동합니다. 다음과 같이 예제 아카이브가 담긴 JAR 파일의 압축을 풉니다.
         jar xvf ttmar2005jaxr.jar 
    
  4. 각자의 CLASSPATH 환경 변수에 다음 JWSDP 1.5 라이브러리를 추가합니다. 위치는 기본 디렉터리를 기준으로 부여됩니다(jwsdp-1.5)
          jaxr/lib/jaxr-api.jar
          jaxr/lib/jaxr-impl.jar
    
          jaxp/lib/jaxp-api.jar      
          jaxp/lib/endorsed/xercesImpl.jar
          jaxp/lib/endorsed/xalan.jar
          jaxp/lib/endorsed/dom.jar
          jaxp/lib/endorsed/sax.jar
    
          jwsdp-shared/lib/mail.jar
          jwsdp-shared/lib/activation.jar
          jwsdp-shared/lib/jaas.jar
          jwsdp-shared/lib/commons-logging.jar
    
          saaj/lib/saaj-api.jar
          saaj/lib/saaj-impl.jar
    
          jaxb/lib/jaxb-api.jar
          jaxb/lib/jaxb-impl.jar
          jaxb/lib/jaxb-libs.jar
          jaxb/lib/jaxb-xjc.jar
    
  5. BusinessQueryTest.java 파일을 컴파일합니다.
  6. 방화벽이 작동중인 경우에는 반드시 원시 코드 내에 해당 프록시 정보를 입력해야 합니다. 그렇지 않으면 JAXR API가 외부 서버에 연결할 수 없게 됩니다.
  7. BusinessQueryTest를 구동합니다.
          java BusinessQueryTest
    
    다음과 같이 시작되는 결과가 표시되어야 합니다.
        Successfully queried the registry for organization matching
        the name pattern: "%USA%"
        Results found: 3
    
        Organization Name: USA-Works
        Organization Key: 8cd1668c-64fa-4aa5-a053-bd0be4bd53f5
        Organization Description: Liberty and Freedom
             Service Name: Federal Government Service
             Service Key: 056b2905-3999-4912-89de-fe79cbfedea0
             Service Description: Services of the Federal Government

"Java EE" 카테고리의 다른 글

2005/05/18 16:18 2005/05/18 16:18

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/295

댓글을 달아 주세요

  1. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 05:28
[로그인][오픈아이디란?]

◀ Prev 1  ... 521 522 523 524 525 526 527 528 529  ... 626  Next ▶