JNDI를 사용하는 애플리케이션 개발

EJB(엔터프라이즈 Bean) 홈 및 데이터 소스와 같은 기타 아티팩트에 대한 참조는 WebSphere® Application Server 네임스페이스에 바인드됩니다. 이러한 오브젝트는 JNDI(Java™ Naming and Directory Interface)를 통해 확보할 수 있습니다. JNDI 작업을 수행하려면 초기 컨텍스트를 가져와야 합니다. 초기 컨텍스트를 사용하여 네임스페이스에 바인드된 오브젝트를 찾아볼 수 있습니다.

이 태스크 정보

이 예에서는 WebSphere Application Server JNDI 컨텍스트 구현에 고유한 기능의 기본 작동이 사용됩니다.

WebSphere Application Server JNDI 컨텍스트 구현에는 특수 기능이 포함되어 있습니다. JNDI 캐싱은 동일한 오브젝트에 대한 반복적인 찾아보기 작업의 성능을 향상시킵니다. 이름 구문 옵션은 이름 구문 선택, 일반 JNDI 클라이언트에 대해 최적화된 기능 및 CosNaming 애플리케이션과의 상호 운용성에 최적화된 기능을 제공합니다. 대부분의 경우 이러한 기능의 기본 작동이 선호 작동입니다. 그러나 종종 특정 상황에서는 작동을 수정해야 합니다.

JNDI 캐싱 및 이름 구문 옵션은 javax.naming.InitialContext 인스턴스와 연관됩니다. 이러한 기능에 옵션을 선택하려면 WebSphere Application Server의 초기 컨텍스트 팩토리에서 인식하는 특성을 설정하십시오. 초기 컨텍스트 팩토리에 표시할 JNDI 캐싱 또는 이름 구문을 설정하려면 다음을 수행하십시오.

프로시저

  1. 옵션: JNDI 캐시 구성

    JNDI 캐싱은 JNDI 찾아보기 조작의 성능을 크게 향상시킬 수 있습니다. 기본적으로 JNDI 캐싱이 사용 가능합니다. 대부분의 상황에서 이 기본값은 바람직한 작동을 가져옵니다. 그러나 특정 상황에서는 다른 JNDI 캐시 옵션을 사용하십시오.

    오브젝트를 검색할 때 로컬에 캐시됩니다. 캐시된 오브젝트의 후속 찾아보기가 로컬로 분석됩니다. 그러나 캐시 내용이 손상될 수 있습니다. 찾는 대부분의 오브젝트가 자주 변경되지 않으므로, 대개 이런 상황은 문제가 되지 않습니다. 상대적으로 자주 변경되는 오브젝트를 찾아야 할 경우 JNDI 캐시 옵션을 변경하십시오.

    JNDI 클라이언트는 여러 특성을 사용하여 캐시 동작을 제어할 수 있습니다.

    특성을 다음과 같이 설정할 수 있습니다.
    • 실제 문자열 값을 입력하여 명령행에서 설정합니다. 예를 들어 다음과 같습니다.
      java -Dcom.ibm.websphere.naming.jndicache.maxentrylife=1440 
    • 원하는 특성 설정 값이 있는 텍스트 파일로서 jndi.properties 이름의 파일을 작성하여 jndi.properties 파일에서 설정합니다. 예를 들어, 다음과 같습니다.
      ...
      com.ibm.websphere.naming.jndicache.cacheobject=none
      ...

      이 기술을 사용하는 경우 jndi.properties 파일의 다른 인스턴스가 클래스 경로에 있을 수 있고 충돌하는 특성 설정이 포함될 수 있음에 유의해야 합니다. 클래스 로더가 jndi.properties 파일을 선택하는 순서에 따라 특성 설정이 결정됩니다. 클래스 경로에서 파일을 찾기 위해 클래스 로더에서 사용하는 순서를 제어하는 방법이 없습니다. WebSphere Application Server는 처음에 com.ibm.websphere.naming.jndicache.cacheobject 특성을 설정하는 jndi.properties 파일을 포함하거나 작성하지 않습니다.

    • com.ibm.websphere.naming.PROPS 파일에 정의된 PROPS.JNDI_CACHE* Java 상수를 사용하여 Java 프로그램 내에서 설정합니다. 상수 정의는 다음과 같습니다.
      public static final String JNDI_CACHE_OBJECT =
       "com.ibm.websphere.naming.jndicache.cacheobject";
      public static final String JNDI_CACHE_OBJECT_NONE      = "none";
      public static final String JNDI_CACHE_OBJECT_POPULATED = "populated";
      public static final String JNDI_CACHE_OBJECT_CLEARED   = "cleared";
      public static final String JNDI_CACHE_OBJECT_DEFAULT   =
       JNDI_CACHE_OBJECT_POPULATED;
      
      public static final String JNDI_CACHE_NAME =
       "com.ibm.websphere.naming.jndicache.cachename";
      public static final String JNDI_CACHE_NAME_DEFAULT = "providerURL";
      
      public static final String JNDI_CACHE_MAX_LIFE =
       "com.ibm.websphere.naming.jndicache.maxcachelife";
      public static final int    JNDI_CACHE_MAX_LIFE_DEFAULT = 0;
      
      public static final String JNDI_CACHE_MAX_ENTRY_LIFE =
       "com.ibm.websphere.naming.jndicache.maxentrylife";
      public static final int    JNDI_CACHE_MAX_ENTRY_LIFE_DEFAULT = 0;

      Java 프로그램의 이전 특성을 사용하려면 특성 설정을 해시 테이블에 추가하고 다음과 같이 InitialContext 생성자로 전달하십시오.

      java.util.Hashtable env = new java.util.Hashtable();
      ...
      
      // Disable caching
      env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); ...
      javax.naming.Context initialContext = new javax.naming.InitialContext(env);

    다음은 원하는 대로 캐시를 작동시키기 위해 JNDI 캐시 특성을 어떻게 사용할 수 있는지를 보여주는 예입니다. 캐시 특성은 InitialContext 오브젝트가 구성될 때 적용됩니다.

    예: 프로그램에서 JNDI 캐시 동작 제어

    import java.util.Hashtable;
    import javax.naming.InitialContext;
    import javax.naming.Context;  
    import com.ibm.websphere.naming.PROPS;
    
    /*****
     Caching discussed in this section pertains to the WebSphere Application Server initial context factory.
     Assume the property, java.naming.factory.initial, is set to
     "com.ibm.websphere.naming.WsnInitialContextFactory" as a java.lang.System property.
    *****/
    
    Hashtable env;
    Context ctx;
    
    // To clear a cache:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_CLEARED);
    ctx = new InitialContext(env);
    
    // To set a cache's maximum cache lifetime to 60 minutes:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_MAX_LIFE, "60");
    ctx = new InitialContext(env);
    
    // To turn caching off:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE);
    ctx = new InitialContext(env);
    
    // To use caching and no caching:
    
    env = new Hashtable();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_POPULATED);
    ctx = new InitialContext(env);
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE);
    Context noCacheCtx = new InitialContext(env);
    
    Object o;
    
    // Use caching to look up home, since the home should rarely change.
    o = ctx.lookup("com/mycom/MyEJBHome");
    // Narrow, etc. ...
    
    
    // Do not use cache if data is volatile.
    o = noCacheCtx.lookup("com/mycom/VolatileObject");
    // ...

    예: JNDI로 JavaMail 세션 찾아보기

    다음 예제는 JavaMail의 자원 찾아보기를 보여 줍니다.

    // Get the initial context as shown previously
    ...
    Session session =
         (Session) initialContext.lookup("java:comp/env/mail/MailSession");
  2. 옵션: 이름 구문을 지정하십시오.

    INS 구문은 CORBA 애플리케이션과 상호운영하는 데 필요한 JNDI 클라이언트용으로 설계되었습니다. 이 구문을 사용하여 JNDI 클라이언트는 CORBA 이름과 적절한 맵핑을 작성할 수 있습니다. INS 구문은 추가 특수 문자로 점(.)이 있는 JNDI 구문과 매우 유사합니다. 점은 이름 컴포넌트에서 ID 필드와 종류 필드를 구분하는 데 사용됩니다. 점은 이스케이프될 때 문자로 해석됩니다. 이름 컴포넌트에는 이스케이프가 아닌 점 하나만 허용됩니다. 비어 있지 않은 ID 필드와 빈 종류 필드로 된 이름 컴포넌트는 ID 필드 값으로만 표시되고, 이스케이프가 아닌 점으로 끝나지 않아야 합니다. 빈 이름 컴포넌트(빈 ID 및 빈 종류 필드)는 이스케이프가 아닌 단일 점으로 표시됩니다. 빈 문자열은 올바른 이름 컴포넌트 표시가 아닙니다.

    JNDI 이름 구문은 기본 구문이며 일반 JNDI 클라이언트에 적합합니다. 이 구문은 특수 문자로 슬래시(/) 및 백슬래시(\)를 포함합니다. 이름에서 컴포넌트는 슬래시로 구분됩니다. 백슬래시는 이스케이프 문자로 사용됩니다. 슬래시는 이스케이프된 경우 문자로 해석됩니다. 즉, 백슬래시 앞에 옵니다. 마찬가지로, 백슬래시도 이스케이프된 경우 문자로 해석됩니다.

    대부분의 WebSphere 애플리케이션은 JNDI를 사용하여 EJB 오브젝트를 찾기 때문에, CORBA 애플리케이션을 통해 바인드된 오브젝트를 찾을 필요가 없습니다. 그러므로, JNDI 이름에 사용되는 기본 이름 구문이 가장 편리합니다. 애플리케이션이 CORBA 애플리케이션에 의해 바인드된 오브젝트를 찾아야 하는 경우, 모든 CORBA CosNaming 이름이 표현될 수 있도록 이름 구문을 변경해야 합니다.

    JNDI 클라이언트는 특성을 설정하여 이름 구문을 설정할 수 있습니다. 새 java.naming.InitialContext 오브젝트 인스턴스화 시 초기 컨텍스트 팩토리에 따라 특성 설정을 적용합니다. 초기 컨텍스트에 대한 JNDI 조작에 지정된 이름은 지정된 이름 구문에 따라 구문 분석됩니다.

    특성을 다음과 같이 설정할 수 있습니다.

    • 명령행에서 실제 문자열 값을 입력하십시오. 예를 들어, 다음과 같습니다.
      java -Dcom.ibm.websphere.naming.name.syntax=ins
    • 원하는 특성 설정 값이 있는 텍스트 파일로서 jndi.properties 이름의 파일을 작성하십시오. 예를 들어, 다음과 같습니다.
      ...
      com.ibm.websphere.naming.name.syntax=ins
      ...

      이 기술을 사용하는 경우 jndi.properties 파일의 다른 인스턴스가 클래스 경로에 있을 수 있고 충돌하는 특성 설정이 포함될 수 있음에 유의해야 합니다. 클래스 로더가 jndi.properties 파일을 선택하는 순서에 따라 특성 설정이 결정됩니다. 클래스 경로에서 파일을 찾기 위해 클래스 로더에서 사용하는 순서를 제어하는 방법이 없습니다. WebSphere Application Server는 처음에 com.ibm.websphere.naming.name.syntax 특성을 설정하는 jndi.properties 파일을 포함하거나 작성하지 않습니다.

    • PROPS.NAME_SYNTAX* Java 상수를 사용하여 Java 프로그램에서 com.ibm.websphere.naming.PROPS 파일에 정의됩니다. 상수 정의는 다음과 같습니다.
      public static final String NAME_SYNTAX =
          "com.ibm.websphere.naming.name.syntax";
      public static final String NAME_SYNTAX_JNDI = "jndi";
      public static final String NAME_SYNTAX_INS  = "ins";

      Java 프로그램의 이전 특성을 사용하려면 특성 설정을 해시 테이블에 추가하고 다음과 같이 InitialContext 생성자로 전달하십시오.

      java.util.Hashtable env = new java.util.Hashtable();
      ...
      env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS); // Set name syntax to INS
      ...
      javax.naming.Context initialContext = new javax.naming.InitialContext(env);

    예: 이름 문자열 구문 분석에 사용되는 구문 설정

    이름 구문 특성은 시스템 특성 또는 jndi.properties 파일에서 해당 매개변수를 통해 InitialContext 생성자로 전달될 수 있습니다. 초기 컨텍스트 및 초기 컨텍스트에서 찾아보는 모든 컨텍스트는 지정된 구문에 기반하여 이름 문자열을 구문 분석합니다.

    다음 예제는 INS 구문에 따라 이름 구문을 초기 컨텍스트 구문 분석 이름 문자열로 설정하는 방법을 보여 줍니다.

    ...
    import java.util.Hashtable;
    import javax.naming.Context;  
    import javax.naming.InitialContext;
    import com.ibm.websphere.naming.PROPS;  // WebSphere naming constants
    ...
       Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.ibm.websphere.naming.WsnInitialContextFactory");
    env.put(Context.PROVIDER_URL, ...);
    env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS);
       Context initialContext = new InitialContext(env);
    // The following name maps to a CORBA name component as follows:
    //    id = "a.name", kind = "in.INS.format"
    // The unescaped dot is used as the delimiter.
    // Escaped dots are interpreted literally.
    java.lang.Object o = initialContext.lookup("a\\.name.in\\.INS\\.format");
    ...

    INS 이름 구문에서는 in.INS.format와 같은 이름에서 임베디드 마침표(.)를 이스케이프할 때 백슬래시 문자(\)를 사용해야 합니다. Java 문자열 리터럴에서는 백슬래시 문자(\)를 이스케이프할 때 백슬래시 문자를 하나 더 사용(\\)해야 합니다.

  3. 옵션: 호스트 이름 표준화를 사용 안함으로 설정

    제공자 URL의 호스트 이름, I/P 주소 및 localhost에 대한 참조는 일반적으로 표준화됩니다. 표준화된 호스트 이름 형식은 호스트 이름의 완전한 형식입니다. 호스트 이름 표준화는 제공자 URL의 참조 형식과 상관없이 지정된 부트스트랩 호스트에 대해 동일한 JNDI 캐시를 사용할 수 있게 하여 시스템 효율성을 향상시킵니다. 예를 들어 호스트 이름 표준화를 사용하면 myhost, myhost.mydomain.comlocalhost 참조가 모두 동일한 호스트를 참조하는 경우 이러한 모든 참조에 대해 동일한 JNDI 캐시를 사용할 수 있습니다.

    표준화된 호스트 이름은 캐시되므로 후속 표준화가 보다 빠르게 실행됩니다. 일부 네트워크 환경에서는 도메인 이름 검색 데이터가 동적으로 변경되어 캐시된 호스트 이름 표준화 데이터가 무효하게 되는 원인이 됩니다. 이러한 환경에서는 호스트 이름 표준화를 사용 안함으로 설정해야 할 수도 있습니다. 호스트 표준화를 사용 안함으로 설정하는 경우 호스트 이름 및 I/P 주소가 원래대로 사용됩니다. localhost에 대한 참조는 일반적으로 루프백 주소, 127.0.0.1에 대해 해석됩니다.

    JNDI 클라이언트는 특성을 설정하여 호스트 이름 표준화를 사용 안함으로 설정할 수 있습니다. 새 java.naming.InitialContext 오브젝트 인스턴스화 시 초기 컨텍스트 팩토리에 따라 특성 설정을 적용합니다.

    다음 기법 중 하나를 사용하여 이 특성을 설정하십시오.
    • 명령행에서 실제 문자열 값을 입력할 수 있습니다. 예를 들어, 다음과 같습니다.
      java -Dcom.ibm.websphere.naming.hostname.normalizer=...none...
    • 원하는 특성 설정값이 있는 텍스트 파일로서 jndi.properties 이름의 파일을 작성할 수 있습니다. 예를 들어, 다음과 같습니다.
      ...
      com.ibm.websphere.naming.hostname.normalizer=...none...
      ...

      이 기술을 사용하는 경우 jndi.properties 파일의 다른 인스턴스가 클래스 경로에 있을 수 있고 충돌하는 특성 설정이 포함될 수 있음에 유의해야 합니다. 클래스 로더가 jndi.properties 파일을 선택하는 순서에 따라 특성 설정이 결정됩니다. 클래스 경로에서 파일을 찾기 위해 클래스 로더에서 사용하는 순서를 제어하는 방법이 없습니다. WebSphere Application Server는 처음에 com.ibm.websphere.naming.hostname.normalizer 특성을 설정하는 jndi.properties 파일을 포함하거나 작성하지 않습니다.

    • Java 프로그램에서 PROPS.HOSTNAME_NORMALIZER* Java 상수를 사용할 수 있습니다. 이러한 Java 상수는 com.ibm.websphere.naming.PROPS 파일에서 정의됩니다. 다음은 이 기술을 사용할 것인지 여부를 지정하는 상수 정의입니다.
      public static final String HOSTNAME_NORMALIZER =
          "com.ibm.websphere.naming.hostname.normalizer";
      public static final String HOSTNAME_NORMALIZER_NONE = "...none...;

      Java 프로그램의 이러한 정의를 사용하려면 특성 설정을 해시 테이블에 추가하고 InitialContext 생성자로 전달하십시오.

      java.util.Hashtable env = new java.util.Hashtable();
      ...
      env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE);
          // Disable hostname normalization
      ...
      javax.naming.Context initialContext = new javax.naming.InitialContext(env);

    예: 호스트 이름 표준화 사용 안함

    시스템 특성 파일 또는 jndi.properties 파일에서 InitialContext 생성자 매개변수를 통해 InitialContext 생성자에 호스트 이름 표준화 프로그램 특성을 전달할 수 있습니다. 초기 컨텍스트 및 해당 초기 컨텍스트에서 찾아보는 이후 컨텍스트는 이 특성 설정을 사용합니다.

    다음 예는 호스트 이름 표준화를 사용 불가능하게 하는 방법을 보여 줍니다.

    ...
    import java.util.Hashtable;
    import javax.naming.Context;  
    import javax.naming.InitialContext;
    import com.ibm.websphere.naming.PROPS;  // WebSphere naming constants
    ...
       Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.ibm.websphere.naming.WsnInitialContextFactory");
    env.put(Context.PROVIDER_URL, ...);
    env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE);
       Context initialContext = new InitialContext(env);
    java.lang.Object o = initialContext.lookup(...);
    ...

주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tnam_develop_naming
파일 이름:tnam_develop_naming.html