[java] JNDI의 목적은 무엇입니까

가능한 경우 예제를 통해 JNDI 사용을 어떻게 실현할 수 있습니까?



답변

JNDI는 Java 이름 지정 및 디렉토리 인터페이스입니다. 응용 프로그램 개발자 와 응용 프로그램 배포자 의 문제를 분리하는 데 사용됩니다 . 데이터베이스에 의존하는 애플리케이션을 작성할 때 해당 데이터베이스에 연결하기위한 사용자 이름이나 암호에 대해 걱정할 필요가 없습니다. JNDI를 사용하면 개발자가 데이터베이스에 이름을 지정하고 배포자에게 해당 이름을 데이터베이스의 실제 인스턴스에 매핑 할 수 있습니다.

예를 들어 Java EE 컨테이너에서 실행되는 코드를 작성하는 경우 다음을 작성하여 JNDI 이름이 “Database”인 데이터 소스를 확보 할 수 있습니다.


DataSource dataSource = null;
try
{
    Context context = new InitialContext();
    dataSource = (DataSource) context.lookup("Database");
}
catch (NamingException e)
{
    // Couldn't find the data source: give up
}

여기에는 데이터베이스 드라이버, 사용자 이름 또는 암호에 대한 내용이 없습니다. 그것은 컨테이너 내부에 구성됩니다.

JNDI는 데이터베이스 (JDBC)로 제한되지 않습니다. 모든 종류의 서비스에 이름을 부여 할 수 있습니다. 자세한 내용은 Oracle의 자습서를 확인해야합니다 .


답변

JNDI는 .NET Framework 를 사용하여 구성 정보를 구성 하고 서비스검색하고 수신 하는 매우 강력한 메커니즘입니다 EventContext. JNDI에서 JNDI 서비스 제공자가 지원한다고 가정하면 모든 객체 ( DataSources 뿐만 아니라 ) 를 조회하고 수신 할 수 있습니다 .

물론 유일한 문제는 실제로 JNDI 서비스 제공 업체가 있다는 것입니다. 이것의 가장 좋은 점은 자신 만의 롤링이 놀랍도록 쉽다는 것입니다. 결국 모든 Java 인스턴스XMLJavaBeans XMLEncoderXMLDecoder : 당신은 응용 프로그램 서버 내에서 실행에 의존 할 필요가 없습니다!

그렇다면 이것이 구성 파일을 갖는 것의 차이점은 무엇입니까? 모든 애플리케이션 이 동일한 위치 에서 구성을 가져올 수 있기 때문에 훨씬 더 깔끔 할 수 있습니다 . 구성 정보 (예 : 데이터베이스 위치)를 공유해야하는 경우 JNDI에서 한 번 정의 할 수 있습니다 . 데이터베이스 서버를 이동했다고 가정합니다. 위치가 포함 된 gazillion 구성 파일을 기억할 필요가 없습니다. JNDI라는 한 곳으로 이동합니다.


답변

JNDI는 디렉토리 및 이름 지정 서비스에 액세스하는 데 사용되는 API입니다 (즉, 이름이 객체와 연결되는 수단). 이름과 개체의 연결을 바인딩이라고합니다.

이름 지정 서비스의 기본 예는 컴퓨터 이름을 IP 주소에 매핑하는 DNS입니다.

JNDI를 사용하여 애플리케이션은 모든 유형의 명명 된 Java 객체를 저장하고 검색 할 수 있습니다.

Java 컨텍스트 내에서 환경 특정 변수를 하드 코딩하지 않으려는 구성 파일에서 사용할 수 있습니다.

봄 예 :

Spring 컨텍스트 파일

<bean id="WSClientConfig" class="com.example.BaseClientConfigImpl">
<property name="protocol">
    <jee:jndi-lookup jndi-name="java:comp/env/protocol" />
</property>
<property name="endpoint">
    <jee:jndi-lookup jndi-name="java:comp/env/endpoint" />
</property>
<property name="requestPath">
<jee:jndi-lookup jndi-name="java:comp/env/requestPath" />
</property>

Tomcat 컨텍스트 파일

<Environment name="protocol" type="java.lang.String" value="https://"/>
<Environment name="endpoint" type="java.lang.String" value="172.0.0.1"/>
<Environment name="requestPath" type="java.lang.String" value="/path/to/service"/>


답변

JNDI를 사용하면 리소스 구성을 이름 으로 단순화 할 수 있습니다 . 따라서 편의 / 보안 등을 위해 많은 세부 정보 그룹 을 1로 묶습니다. (추상 레이어라고도 함)

실현하기 :
Jndi Context Interface의 사전 정의 된 필드에 해당하는 속성 목록을 설정합니다. (이러한 속성은 jndi 실행에 대한 설정을 지정하지만 * 검색 이름은 아님)

Properties props = new Properties();
//field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial
    //field Context.PROVIDER_URL => property name java.naming.provider.url
props.load(new FileInputStream("*properties file*")); //prop file in this case

Context ctx = new InitialContext(props);
    Object o = ctx.lookup("*name of resource*");

이상적으로는 조직에서 LDAP 디렉토리, DNS 등을 유지하기위한 특수 기능이 존재합니다 (따라서 통합 된 단일 매핑 세트 서비스를 모두 제공하여 불일치를 줄임).

JNDI 서비스 공급자 목록 :
https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm


답변