JNDI 개요, Part 1 : 이름 지정 서비스 소개

도서관에 가본 적이 있고 경험을 기억할 수있는 분들은 도서관 책을 찾는 과정을 떠 올릴 것입니다. 골동품 측과 연락하지 않는다면이 상황은 낯설게 보일 것입니다. 하지만 가끔은 진짜 오프라인 책을 찾기 위해 지역 도서관으로 돌아 다닙니다. 도서관은 수천 가지로 가득 차 있습니다. 먼지가 많고 목재 펄프와 소 가죽으로 만들어졌지만 그 자체로 매력적입니다. 어떤 경우 든, 어떤 사람을 찾아야한다는 충동이 닥치면 도서관 통로를 샅샅이 뒤 지거나 카드 목록으로 돌아가는 순진한 과정을 피하고 있습니다.

TEXTBOX : TEXTBOX_HEAD : JNDI 개요 : 전체 시리즈 읽기!

  • 1 부. 이름 지정 서비스 소개
  • Part 2. JNDI 디렉토리 서비스를 사용하여 분산 애플리케이션을 더 잘 관리

  • Part 3. JNDI를 사용하여 분산 애플리케이션의 객체 저장

  • 4 부. JNDI 지원 애플리케이션으로 배운 내용을 통합합니다 .END_TEXTBOX

초보자를위한 카드 카탈로그는 책의 이름을 도서관의 해당 위치에 매핑합니다. 먼저 카드 카탈로그로 이동하여 책의 위치를 ​​검색함으로써 상당한 양의 걷기를 절약 할 수 있습니다. (실제로 일부 도서관에서는 카드 카탈로그 대신 컴퓨터를 사용할 수 있도록 허용한다고 들었습니다. 반은 맞습니다. 이제 책에있는 정보를 컴퓨터가 속한 컴퓨터에 넣으면됩니다. ..)

놀랍게도 카드 카탈로그의 개념은 컴퓨팅 세계에서도 매우 편리합니다. 컴퓨팅에서는 이름을 서비스 위치 및 정보와 연결 하는 이름 지정 서비스 라고합니다 . 필요한 리소스를 찾을 수있는 단일 위치에 컴퓨터 프로그램을 제공합니다. 한편 프로그램은 통로를 위아래로 걷는 것과 같은 전자식 작업을 수행하여 시간을 낭비하지 않으며 위치를 논리에 하드 코딩 할 필요도 없습니다.

리소스를 찾는 것은 대규모 엔터프라이즈 환경에서 특히 중요합니다. 여기서 구축하는 애플리케이션은 다른 부서의 다른 그룹이 작성한 애플리케이션에서 제공하는 서비스에 의존 할 수 있습니다. 잘 설계된 이름 지정 인프라는 그러한 프로젝트를 가능하게하며, 하나가 없으면 불가능합니다. 실제로 많은 비즈니스 프로세스 리엔지니어링 노력은 강력한 전사적 이름 지정 및 디렉터리 인프라의 설계 및 구현으로 시작됩니다.

이번 달에는 JNDI (Java Naming and Directory Interface)를 소개합니다. JNDI는 많은 기존 이름 지정 서비스에 공통 분모 인터페이스를 제공합니다. 따라서 JNDI는 기존 기술을 대체하도록 설계되지 않았습니다. 대신 기존 이름 지정 서비스에 대한 공통 인터페이스를 제공합니다. 이러한 서비스 중 일부를 살펴 보겠습니다.

이름 지정 서비스 소개

아래 그림은 일반 이름 지정 서비스의 구성을 보여줍니다.

이름 지정 서비스는 일련의 바인딩을 유지합니다 . 바인딩은 이름을 개체에 연결합니다. 명명 시스템의 모든 개체는 동일한 방식으로 명명됩니다 (즉, 동일한 명명 규칙에 가입 ). 클라이언트는 이름 지정 서비스를 사용하여 이름으로 개체를 찾습니다.

기존의 여러 이름 지정 서비스가 있으며 그 중 몇 가지를 아래에서 설명하겠습니다. 각각 위의 패턴을 따르지만 세부 사항이 다릅니다.

  • COS (Common Object Services) 이름 지정 : CORBA 응용 프로그램의 이름 지정 서비스입니다. 애플리케이션이 CORBA 객체에 대한 참조를 저장하고 액세스 할 수 있도록합니다.

  • DNS (도메인 이름 시스템) : 인터넷의 이름 지정 서비스입니다. 사람들에게 친숙한 이름 (예 : www.etcee.com)을 점선 4 중 표기법 (207.69.175.36)의 컴퓨터 친화적 인 IP (인터넷 프로토콜) 주소로 매핑합니다. 흥미롭게도 DNS는 분산 된 이름 지정 서비스입니다. 즉, 서비스와 기본 데이터베이스가 인터넷의 여러 호스트에 분산되어 있습니다.

  • LDAP (Lightweight Directory Access Protocol) : 미시간 대학교에서 개발했습니다. 이름에서 알 수 있듯이 DAP (Directory Access Protocol)의 경량 버전이며, 이는 네트워크 디렉터리 서비스 표준 인 X.500의 일부입니다. 현재 40 개 이상의 회사가 LDAP를지지합니다.

  • NIS (네트워크 정보 시스템) 및 NIS + : Sun Microsystems에서 개발 한 네트워크 이름 지정 서비스. 두 가지 모두 사용자가 단일 ID와 비밀번호로 모든 호스트의 파일과 애플리케이션에 액세스 할 수 있도록합니다.

일반적인 특징

앞서 언급했듯이 이름 지정 시스템의 주요 기능은 이름을 개체 (또는 경우에 따라 개체에 대한 참조)에 바인딩하는 것입니다. 이름 지정 서비스가 되려면 서비스는 최소한 이름을 개체에 바인딩하고 이름으로 개체를 조회 할 수있는 기능을 제공해야합니다.

많은 이름 지정 시스템은 개체를 직접 저장하지 않습니다. 대신 개체에 대한 참조를 저장합니다. 예를 들어 DNS를 고려하십시오. 주소 207.69.175.36은 컴퓨터 자체가 아니라 인터넷상의 컴퓨터 위치를 나타냅니다.

JNDI는 이러한 모든 공통 기능을 지원하는 인터페이스를 제공합니다. 이 기사의 뒷부분에서이 인터페이스를 설명하겠습니다.

그들의 차이점

JNDI는 이러한 차이점을 해결하는 실행 가능한 추상화를 제공해야하므로 기존 이름 지정 서비스의 차이점을 이해하는 것도 중요합니다.

기능적 차이를 제외하고 가장 눈에 띄는 차이점은 각 이름 지정 서비스에서 이름을 지정해야하는 방식, 즉 이름 지정 규칙입니다. 몇 가지 예가 문제를 설명해야합니다.

DNS에서 이름은 점 ( ".")으로 구분 된 구성 요소로 만들어집니다. 그들은 오른쪽에서 왼쪽으로 읽습니다. "www.etcee.com"이라는 이름은 "etcee.com"도메인에서 "www"라는 시스템의 이름을 지정합니다. 마찬가지로 "etcee.com"이라는 이름은 최상위 도메인 "com"에서 도메인 "etcee"를 명명합니다.

LDAP에서는 상황이 약간 더 복잡합니다. 이름은 쉼표 ( ",")로 구분 된 구성 요소로 만들어집니다. DNS 이름과 마찬가지로 오른쪽에서 왼쪽으로 읽습니다. 그러나 LDAP 이름의 구성 요소는 이름 / 값 쌍으로 지정해야합니다. "cn = Todd Sundsted, o = ComFrame, c = US"라는 이름은 "o = ComFrame, c = US"조직에서 "cn = Todd Sundsted"라는 사람의 이름을 지정합니다. 마찬가지로 "o = ComFrame, c = US"라는 이름은 "c = US"국가에서 "o = ComFrame"조직의 이름을 지정합니다.

위의 예에서 볼 수 있듯이 이름 지정 서비스의 이름 지정 규칙만으로도 JNDI에 기본 이름 지정 서비스의 풍미를 상당량 도입 할 수 있습니다. 이것은 구현 독립적 인 인터페이스가 가져야하는 기능이 아닙니다.

JNDI는 Name클래스와 하위 클래스 및 도우미 클래스 를 사용하여이 문제를 해결합니다 . 이 Name클래스는 순서가 지정된 하위 이름 시퀀스로 구성된 이름을 나타내며 기본 이름 지정 서비스와 독립적 인 이름 작업을위한 메서드를 제공합니다.

JNDI 이름 지정 살펴보기

위에서 언급했듯이 JNDI는 구현이 아니라 인터페이스 라는 점을 기억하는 것이 중요합니다 . 이 사실에는 몇 가지 단점이 있습니다. 기존 이름 지정 서비스 (예 : LDAP 서비스)에 액세스해야하며 JNDI를 사용하려면 작동 방식에 대해 이해해야합니다. 반면에 JNDI는 기존의 이름 지정 서비스가 영향력을 행사하는 기존 컴퓨팅 환경에 원활하게 통합 될 수 있습니다.

JNDI 이름 지정은 작은 클래스 세트와 소수의 작업을 중심으로합니다. 그들을 살펴 보자.

컨텍스트 및 InitialContext

Context인터페이스는 JNDI에서 중심적인 역할을한다. 컨텍스트는 모두 동일한 명명 규칙을 공유하는 명명 서비스 내의 바인딩 집합을 나타냅니다. Context객체는 객체에 이름을 바인딩 이름을 변경 개체에 대한 개체에서 이름을 바인드 해제 및 바인딩을 나열하는 방법을 제공한다.

일부 이름 지정 서비스는 하위 컨텍스트 기능도 제공합니다. 파일 시스템의 디렉토리와 매우 유사하게 하위 컨텍스트는 컨텍스트 내의 컨텍스트입니다. 이 계층 구조는 더 나은 정보 구성을 허용합니다. 하위 컨텍스트를 지원하는 이름 지정 서비스의 경우 Context클래스는 하위 컨텍스트를 만들고 제거하는 메서드도 제공합니다.

JNDI는 컨텍스트와 관련된 모든 이름 지정 작업을 수행합니다. 시작할 위치를 찾는 데 도움이되도록 JNDI 사양은 InitialContext클래스를 정의합니다 . 이 클래스는 사용중인 이름 지정 서비스의 유형을 정의하는 속성과 보안을 제공하는 이름 지정 서비스의 경우 연결할 때 사용할 ID 및 암호로 인스턴스화됩니다.

RMI Naming클래스에 익숙한 사용자에게는 Context아래에 설명 된 인터페이스에서 제공하는 많은 메소드 가 익숙해 보일 것입니다. Context의 메서드를 살펴 보겠습니다 .

  • void bind(String stringName, Object object): 개체에 이름을 바인딩합니다. 이름은 다른 개체에 바인딩되어서는 안됩니다. 모든 중간 컨텍스트가 이미 존재해야합니다.

  • void rebind(String stringName, Object object): 개체에 이름을 바인딩합니다. 모든 중간 컨텍스트가 이미 존재해야합니다.

  • Object lookup(String stringName): 지정된 객체를 반환합니다.

  • void unbind(String stringName): Unbinds the specified object.

The Context interface also provides methods for renaming and listing bindings.

  • void rename(String stringOldName, String stringNewName): Changes the name to which an object is bound.
  • NamingEnumeration listBindings(String stringName): Returns an enumeration containing the names bound to the specified context, along with the objects and the class names of the objects bound to them.

  • NamingEnumeration list(String stringName): Returns an enumeration containing the names bound to the specified context, along with the class names of the objects bound to them.

Each of these methods has a sibling that takes a Name object instead of a String object. A Name object represents a generic name. The Name class allows a program to manipulate names without having to know as much about the specific naming service in use.

The example

The example below illustrates how to connect to a naming service, list all of the bindings, or list a specific binding. It uses the filesystem service provider, which is one of the reference JNDI service-provider implementations provided by Sun. The filesystem service provider makes the filesystem look like a naming service (which it is, in many ways -- filenames like /foo/bar/baz are names and are bound to objects like files and directories). I selected it because everyone has access to a filesystem (as opposed to, say, an LDAP server).

import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Binding; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import java.util.Hashtable; public class Main { public static void main(String [] rgstring) { try { // Create the initial context. The environment // information specifies the JNDI provider to use // and the initial URL to use (in our case, a // directory in URL form -- file:///...). Hashtable hashtableEnvironment = new Hashtable(); hashtableEnvironment.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory" ); hashtableEnvironment.put( Context.PROVIDER_URL, rgstring[0] ); Context context = new InitialContext(hashtableEnvironment); // If you provide no other command line arguments, // list all of the names in the specified context and // the objects they are bound to. if (rgstring.length == 1) { NamingEnumeration namingenumeration = context.listBindings(""); while (namingenumeration.hasMore()) { Binding binding = (Binding)namingenumeration.next(); System.out.println( binding.getName() + " " + binding.getObject() ); } } // Otherwise, list the names and bindings for the // specified arguments. else { for (int i = 1; i < rgstring.length; i++) { Object object = context.lookup(rgstring[i]); System.out.println( rgstring[i] + " " + object ); } } context.close(); } catch (NamingException namingexception) { namingexception.printStackTrace(); } } } 

The program in the listing above first creates an initial context from the specified JNDI provider (in this case, Sun's filesystem provider) and a URL specifying a local directory. If no additional command-line arguments are specified, the program lists the objects and names of every entity in the specified directory. Otherwise, it lists the objects and names of only those items specified on the command line.

Conclusion

You should now have both an understanding of and an appreciation for naming services in general and JNDI in particular. In distributed environments, they are valuable tools for locating information and resources. JNDI makes it possible to work with a variety of naming services without having to master a multitude of APIs. Next month, we'll take a look at the other half of JNDI -- its directory functions.

Todd Sundsted는 편리한 데스크탑 모델에서 컴퓨터를 사용할 수있게 된 이후로 프로그램을 작성해 왔습니다. 원래는 C ++로 분산 애플리케이션을 구축하는 데 관심이 있었지만 Todd는 Java 프로그래밍 언어로 옮겨가는 것이 분명한 선택이었습니다. 글을 쓰는 것 외에도 Todd는 ComFrame Software에서 Java 아키텍트로도 일합니다.

이 주제에 대해 더 알아보기

  • 이 기사의 전체 소스 코드를 zip 형식으로 다운로드하십시오.

    //images.techhive.com/downloads/idge/imported/article/jvw/2000/01/jw-01-howto.zip

  • JNDI의 모든 것

    //java.sun.com/products/jndi/

  • JNDI 문서

    //java.sun.com/products/jndi/docs.html

  • 현재 이용 가능한 서비스 제공 업체

    //java.sun.com/products/jndi/serviceproviders.html

  • 이전 방법 Java 열의 전체 목록

    //www.javaworld.com/javaworld/topicalindex/jw-ti-howto.html

이 이야기, "JNDI 개요, Part 1 : 이름 지정 서비스 소개"는 원래 JavaWorld에서 출판되었습니다.