JNDI 란 무엇입니까? 기본 사용법은 무엇입니까? 언제 사용됩니까?


답변:


241

JNDI 란 무엇입니까?

Java 이름 지정 및 디렉토리 인터페이스를 나타냅니다 .

기본 사용법은 무엇입니까?

JNDI를 통해 분산 응용 프로그램은 추상적이고 리소스에 독립적 인 방식으로 서비스를 조회 할 수 있습니다.

언제 사용 되나요?

가장 일반적인 사용 사례는 Java EE 애플리케이션 서버에서 데이터베이스 연결 풀을 설정하는 것입니다. 해당 서버에 배치 된 모든 애플리케이션은 연결에 java:comp/env/FooBarPool대한 세부 사항을 몰라도 JNDI 이름 을 사용하여 필요한 연결에 액세스 할 수 있습니다 .

여기에는 몇 가지 장점이 있습니다.

  1. 앱이 devl->int->test->prod환경에서 이동하는 배포 순서가있는 경우 각 환경에서 동일한 JNDI 이름을 사용하고 사용중인 실제 데이터베이스를 숨길 수 있습니다. 환경간에 마이그레이션 할 때 응용 프로그램을 변경할 필요가 없습니다.
  2. 프로덕션 데이터베이스에 액세스하기위한 자격 증명을 알아야하는 사람의 수를 최소화 할 수 있습니다. JNDI를 사용하는 경우 Java EE 앱 서버 만 알아야합니다.

9
그래서 이것은 기본적으로 jdbc 연결 정보가있는 속성 파일을 갖는 것보다 안전한 대안입니까?
grinch

4
@ grinch : 본질적으로 그렇습니다. 더 안전하고 표준화되어 배포가 더 쉬워집니다 (속성 파일의 이름 등을 추측 할 필요 없음).
sleske

그렇다면 환경 변수와 JNDI를 사용하는 것의 차이점은 무엇입니까? 비슷한 개념입니까?
skryvets

100

JNDI 란 무엇입니까?

JNDI ( Java Naming and Directory Interface TM )는 Java TM 프로그래밍 언어를 사용하여 작성된 애플리케이션에 이름 지정 및 디렉토리 기능을 제공하는 API (Application Programming Interface)입니다 . 특정 디렉토리 서비스 구현과 독립적으로 정의됩니다. 따라서 다양한 디렉토리 (신규, 신흥 및 이미 배포 된)에 공통된 방식으로 액세스 할 수 있습니다.

기본 사용법은 무엇입니까?

그것의 대부분은 위의 답변에서 다루어 지지만 위의 내용이 더 이해되도록 여기에 아키텍처를 제공하고 싶습니다.

여기에 이미지 설명을 입력하십시오

JNDI를 사용하려면 JNDI 클래스와 하나 이상의 서비스 제공자가 있어야합니다. Java 2 SDK, v1.3에는 다음 이름 지정 / 디렉토리 서비스에 대한 세 개의 서비스 제공자가 포함되어 있습니다.

  1. LDAP (Lightweight Directory Access Protocol)
  2. CORBA (Common Object Request Broker) 아키텍처 공통 오브젝트 서비스 (COS) 이름 서비스
  3. Java 원격 메소드 호출 (RMI) 레지스트리

따라서 기본적으로 개체를 만들고 디렉터리 서비스에 등록하면 나중에 조회하고 작업을 수행 할 수 있습니다.


30

layman의 용어로 JNDI는 기본적으로 다음과 같은 내부 / 외부 리소스 인스턴스를 얻을 수있는 인터페이스입니다.

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

또는 JCA 자원 어댑터에 의해 정의 된 다른 유형. 내부 또는 외부 액세스를 작성할 수있는 구문을 제공합니다. 즉 (이 경우 comp / env는 구성 요소 / 환경, 다른 많은 구문이있는 곳을 의미합니다) :

jndiContext.lookup("java:comp/env/persistence/customerDB");

1
이것은 그림의 일부일뿐입니다. JNDI를 사용하면 Java 객체를 조회 할 수 있습니다. 이러한 객체는 DataSource와 같은 리소스이거나 java.lang.String구성 정보에 대한 일반 정보 일 수 있습니다.
sleske

3
@ sleske 나는 당신이 자신의 대답을 제안합니다.
Ced

14

JNDI 개요

JNDI는 Java 기술로 지정된 API로 Java 프로그래밍 언어로 작성된 응용 프로그램에 이름 지정 및 디렉토리 기능을 제공합니다. 특히 Java 객체 모델을 사용하는 Java 플랫폼 용으로 설계되었습니다. Java 기술 기반 애플리케이션은 JNDI를 사용하여 모든 유형의 이름 지정된 Java 오브젝트를 저장하고 검색 할 수 있습니다. 또한 JNDI는 속성을 객체와 연관시키고 속성을 사용하여 객체를 검색하는 등의 표준 디렉토리 작업을 수행하는 방법을 제공합니다.

JNDI는 특정 이름 지정 또는 디렉토리 서비스 구현과 독립적으로 정의됩니다. 애플리케이션이 공통 API를 사용하여 여러 가지 이름 지정 및 디렉토리 서비스에 액세스 할 수 있습니다. 다른 이름 지정 및 디렉토리 서비스 제공자를이 공통 API 뒤에 완벽하게 연결할 수 있습니다. 이를 통해 Java 기술 기반 애플리케이션은 LDAP, NDS, DNS 및 NIS (YP)와 같은 다양한 기존 이름 지정 및 디렉토리 서비스의 정보를 활용할 수있을뿐만 아니라 애플리케이션이 레거시 소프트웨어 및 시스템과 공존 할 수 있습니다.

JNDI를 도구로 사용하면 Java의 오브젝트 모델을 활용할뿐만 아니라 배치 된 환경과 잘 통합 된 강력하고 이식 가능한 새로운 애플리케이션을 빌드 할 수 있습니다.

참고


9

JNDI 란 무엇입니까?

JNDI는 Java Naming and Directory Interface의 약어입니다. J2EE에는 표준으로 제공됩니다.

기본 사용법은 무엇입니까?

이 API를 사용하면 객체, 장치, 이름 지정 파일 및 디렉토리 서비스와 같은 여러 유형의 데이터에 액세스 할 수 있습니다. EJB가 원격 객체를 찾기 위해 사용합니다. JNDI는 DNS, NDS, LDAP, CORBA 및 RMI와 같은 기존 서비스에 액세스하기위한 공통 인터페이스를 제공하도록 설계되었습니다.

언제 사용 되나요?

JNDI를 사용하여 네임 스페이스 업데이트를위한 읽기 조작 및 조작을 포함하여 이름 지정 조작을 수행 할 수 있습니다. 다음 작업이 여기 에 설명되어 있습니다 .


7

이름 지정 서비스는 이름을 오브젝트와 연관시키고 주어진 이름을 기반으로 오브젝트를 찾습니다 (RMI 레지스트리는 이름 지정 서비스의 좋은 예입니다.) JNDI는 LDAP, DNS와 같은 많은 기존 이름 지정 서비스에 대한 공통 인터페이스를 제공합니다.

JNDI가 없으면 원격 자원의 위치 또는 액세스 정보는 응용 프로그램에서 하드 코딩되거나 구성에서 사용 가능해야합니다. 이 정보를 유지 관리하는 것은 매우 지루하고 오류가 발생하기 쉽습니다.


3

공식 문서 가 왜 그렇게 무시되어 세부 사항을 세 심하게 정교하게 설명 했는지 궁금합니다 .

그러나 사례를 이해하려면 duffymo의 답변을 참조하십시오 .

JNDI ( Java Naming and Directory Interface TM )는 Java TM 프로그래밍 언어를 사용하여 작성된 애플리케이션에 이름 지정 및 디렉토리 기능을 제공하는 API (Application Programming Interface)입니다 . 특정 디렉토리 서비스 구현과 독립적으로 정의됩니다. 따라서 새로운 디렉토리, 새로운 디렉토리 및 이미 배치 된 다양한 디렉토리에 공통된 방식으로 액세스 할 수 있습니다.

그리고 그 아키텍처

여기에 이미지 설명을 입력하십시오

그리고 일반적으로 당신이 그것을 사용하는 방법 .


5
I am just curious why the official docs are so ignored which elaborate the details meticulously already그들은 일반 사람들이 이해할 수있는 충분한 방법으로 설명하지 않았기 때문에?
skryvets

1

애플리케이션 개발자가 데이터베이스의 사용자 이름과 비밀번호를 몰라도 JNDI를 사용하여 데이터베이스를 구성하는 방법을 설명하는 한 가지 예를 사용합니다.

1) JBoss 서버의 standalone-full.xml 에 데이터 소스를 구성했습니다 . 또한 풀 세부 정보도 구성 할 수 있습니다.

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

여기에 이미지 설명을 입력하십시오

이제이 jndi-name 및 관련 데이터 소스 객체를 application.application에서 사용할 수 있습니다.

2) JndiDataSourceLookup 클래스를 사용하여이 데이터 소스 개체를 검색 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

스프링은 jndi-name을 제공 한 후 데이터 소스 bean을 인스턴스화합니다.

이제 환경이나 요구 사항에 따라 풀 크기, 사용자 이름 또는 암호를 변경할 수 있지만 응용 프로그램에는 영향을 미치지 않습니다.

참고 : encryptedSecurityDomain, 우리는 JBoss 서버에서 별도로 구성해야합니다.

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

이것은 사용 사례 중 하나입니다. 그것이 명확하기를 바랍니다.


0

나에게 가장 좋은 설명은 여기에 있습니다.

JNDI 란 무엇인가

디렉토리 서비스, 즉 객체 가있는 서비스 매핑 이름 (문자열), 원격 객체 또는 간단한 데이터 에 대한 액세스를 제공하는 API 입니다. 이것을 바인딩이라고합니다. 바인딩 세트를 컨텍스트라고합니다 . 애플리케이션은 JNDI 인터페이스를 사용하여 자원에 액세스합니다.

간단히 말하면 웹의 리소스를 나타내는 String 키와 Object 값이있는 해시 맵과 같습니다.

JNDI가 해결하는 문제

JNDI가 없으면 원격 자원의 위치 또는 액세스 정보는 응용 프로그램에서 하드 코딩되거나 구성에서 사용 가능해야합니다. 이 정보를 유지 관리하는 것은 매우 지루하고 오류가 발생하기 쉽습니다.

예를 들어 다른 IP 주소를 사용하여 다른 서버로 리소스를 재배치 한 경우이 리소스를 사용하는 모든 응용 프로그램은이 새로운 정보로 업데이트되어야합니다. JNDI에서는 필요하지 않습니다. 해당 자원 바인딩 만 업데이트해야합니다. 애플리케이션은 여전히 ​​이름으로 액세스 할 수 있으며 재배치가 투명합니다.

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