JNDI는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고(look up) 하기 위한 자바 API .

자바애플리케이션을 외부 디렉터리 서비스에 연결( 데이터베이스 , LDAP 서버)

자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고

JNDI (Java Naming and Directory Interface)는 Java 프로그래밍 언어로 작성된 애플리케이션에 이름 지정 및 디렉토리 기능을 제공합니다. 특정 이름 지정 또는 디렉터리 서비스 구현과 독립적으로 설계되었습니다. 따라서 새로운 서비스, 새로운 서비스, 이미 배포 된 서비스 등 다양한 서비스에 공통된 방식으로 액세스 할 수 있습니다.

JNDI 아키텍처는 API (Application Programming Interface)와 SPI (Service Provider Interface)로 구성됩니다. Java 애플리케이션은이 API를 사용하여 다양한 이름 지정 및 디렉토리 서비스에 액세스합니다. SPI는 다양한 이름 지정 및 디렉토리 서비스를 투명하게 플러그인 할 수 있도록하여 JNDI 기술의 API를 사용하는 Java 애플리케이션이 서비스에 액세스 할 수 있도록합니다.

Concepts :

컴퓨팅 시스템의 기본 기능은 이름 지정 서비스

이름을 개체와 연결하고 이름을 기반으로 개체를 찾는 수단

모든 컴퓨터ㅇ 프로그램이나 시스템을 사용할 때 개체 또는 다른 개체의 이름을 지정한다.

컴퓨터의 파일에 엑세스 하려면 해당 이름을 제공하야한다.

예를들어 인터넷 도메인 이름 시스템(DNS) 는 컴퓨터 이름 IP를 ip 주소에 매핑한다.

예시 : www.morriskim.com ==> 192.168.58.29

파일 시스템은 프로그램이 파일 내용에 엑세스 하는데 사용할 수 있는 파일 참조에 파일이름을 매핑한다.

두 가지에는 인터넷상의 개체 이름 지정부터 로컬 파일 시스템의 파일 이름지정에 이르기 까지 이름 지정서비스가 존재하는 광범위한 규모를 보여준다.

예시 : c:\bin\exec.bat

Naming system에서 개체를 조회하려면 개체 이름을 제공하게 되는데

이름 지정 시스템은 이름이 따라야하는 구문을 결정한다.

명명규칙이라고 하는데, 이름의 포현은 이름의 구성 요소를 표시하는 구성요소 구분으로 기호로 구성됨

명명 시스템 구성 요소 분리 기호 이름
unix "/" /usr/hello
DNS "." morris.com
LDAP " , " 또는 " =. ". Cn = Rosana Lee

Context

모든 컨텍스트에는 연관된 명명 규칙이 존제함

하위 컨텍스트에 바인딩 된 컨텍스트의 몇 가지 예입니다.

이처럼 Java 프로그래밍 언어를 사용해서 작성된 애플리케이션에 이름 지정 및 디렉토리 기능을 제공하는 API

Architecture

JNDI 아키텍쳐는 API DHK SPI (SERVICE PROVIDER INTERFACE) 로 구성된다.

JNDI 아키텍처

Java 어플리케이션은 JNDI API를 사용하여 이름 지정 및 디렉토리 서비스에 접근한다. SPI를 사용하면 다양한 이름 지정 및 디렉토리 서비스를 플러그인으로 할수 있으므로 JNDI API를 사용하는 Java 애플리케이션이 서비스에 엑세스 할 수 있다.

JNDI 는 Java SE 플랫폼에 포함되어 있습니다. JNDI를 사용하려면 JNDI 클래스와 하나 이상의 서비스 공급자가 있어야한다.

  • LDAP ( Lightweight Directory Access Protocol)
  • CORBA ( Common Object Request Broker Architecture), COS( Common Object Services) 이름 서비스
  • JAVA RMI
  • DNS (도메인 이름 서비스)

JNDI 5개 패키지로 나뉨

  • avax.naming
  • javax.naming.directory
  • javax.naming.ldap
  • javax.naming.event
  • javax.naming.spi

Tutorial

JNDI를 사용하여 네임 스페이스 업데이트를 위한 읽거 및 이름 지정 작업을 할 수 있다.

구성 하는 방법 :

이름 지정, 또는 디렉터리 서비스에 대한 작업을 수행하기 전에 네임 스페이스의 시작점인 초기 컨텍스트를 획득 해야합니다.

이름 지정 및 디렉터리 서비스에 대한 모든 방법이 일부 컨텍스트에 상대적으로 수행 되기 때문에 초기 컨텍스트를 얻으려면 아래의 단계를 거쳐야한다.

  1. 엑세스 하려는 서비스의 제공업체 선택
  2. 초기 컨텍스트에 필요한 구성 지정
  3. InitialContext 생성자 호출

1단계 서비스 공급자 선택

환경 들을 Hashtable을 만들고 여기에 서비스 공급자 클래스의 이름을 추가, 초기 컨텍스트에 사용할 서비스 공급자 지정하기

LDAP서비스를 사용하는 경우에는

Hashtable <String, Object> env = new Hashtable <String, Object> ();
env.put (Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory");

파일 서비스를 지정하려면

Hashtable <String, Object> env = new Hashtable> String, Object> ();
env.put (Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.fscontext.RefFSContextFactory")

2단계 초키 컨텍스트의 정보 지정


package javax.naming.Context 를 보면 아래를 보면 Context에서는 미리 서비스 공급자를 설정하도록 설정이 이미 들어가있다.

아래의 getInitialContext 메서드를 보면 getInitialContext를 에 hashTable을

env.put (Context.PROVIDER_URL, "ldap : //ldap.wiz.com : 389");
env.put (Context.SECURITY_PRINCIPAL, "joeuser");
env.put (Context.SECURITY_CREDENTIALS, "joepassword");

아래를 보면 Java.naming Context 안에는 아래와 같은 메서드들이 이미 설정 되어있다.

3단계 초기 컨텍스트 생성

이전에 설정한 파일을 InitialContext를 생성자로 전달해서 생성

그러면 추후부터는 Context Object에 대한 참조가 있으므로 이름 지정 서비스에 접근이 가능하다.


사용방법

Naming Interface

JNDI 이름에 대한 구성요소 이름과 구문을 관리할수 있는 기능

 try {
            Name objectName = new CompositeName("java:comp/env/jdbc");
            Enumeration<String> elements = objectName.getAll();
            while(elements.hasMoreElements()){
                System.out.println(elements.nextElement());
            }
            objectName.add("AddComposition");
            objectName.get(1);

            System.out.println(objectName.get(objectName.size()-1));
        } catch (
            InvalidNameException e) {
            e.printStackTrace();
        }

/ 는 하위 컨텍스트의 구분 기호

출력 내용

java:comp
env
jdbc
AddComposition

Context Interface

컨텍스트에는 이름 지정 및 디렉터리 서비스에 대한 속성도 포함이 됨

Spring의 SimpleNamingContextBuilder NamingManager는 JNDI 공급자를 생성한 다음 NamingManager를 사용하여 빌더를 실행함

JNDI가 어떤것인지에 대해 알아보는 것만 알아보는 내용이었으므로 이후 세부적인 내용은 아래의 자세한 내용은 아래의 블로그를 참고하시면됩니다.

https://epthffh.tistory.com/entry/Spring%EC%97%90%EC%84%9C-JNDI%EC%84%A4%EC%A0%95hikaricp

참고 :

https://docs.oracle.com/javase/tutorial/jndi/index.html

https://docs.oracle.com/javase/tutorial/jndi/overview/index.html

https://www.baeldung.com/jndi

'ProgramLanguage > Java' 카테고리의 다른 글

JVM 메모리 구조 (1)  (0) 2020.03.22
Java8- Default 메서드(Abstract, Interface)  (0) 2020.03.18
JVM 튜닝  (0) 2020.02.10
Lambda_Expression(2)  (0) 2020.01.25
객체 지향 설계 5원칙 - SOLID  (0) 2019.12.26

+ Recent posts