JNDI의 목적은 무엇입니까


답변:


109

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의 자습서를 확인해야합니다 .


10
이 그림의 예에서 JNDI는 구성 xml 파일이나 속성 파일에 데이터베이스 이름을 배치 한 다음 거기서 읽는 것과 어떻게 다릅니 까?
Ajay

11
첫째, 구성 파일에 일반 텍스트로 암호를 저장해야합니다. 둘째, 동일한 데이터베이스를 가리키는 여러 앱이 있고 데이터베이스 구성 변경에 대한 내용이있는 경우 여러 위치에서 구성을 업데이트해야합니다.
Simon Nickerson 2009-08-29

1
음, JNDI가 여기서 어떻게 도움이됩니까?
Ajay

1
여기에는 J2EE 컨텍스트에서든 JavaSE 컨텍스트에서든 JNDI에 대해 알아야 할 모든 것이 포함되어야합니다. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico

5
@SimonNickerson 안녕하세요!. JNDI에 대해 배우고 있습니다. 이것은 좋은 대답이지만 "JNDI의 사용법을 어떻게 알 수 있습니까?"라는 질문을 발견하면 미완성 된 것 같습니다. 개발자의 관점에서 실현을 설명했습니다. 배포자의 관점은 어떻습니까?
lxknvlk

31

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

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

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


이것은 가장 둥근 설명입니다. 감사합니다. oxbow_lakes! Btw, 제안한대로 Java 인스턴스가 인코딩 된 코드 포인터가 있습니까?
로한 쿠마

13

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"/>

3

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.