7 시나리오 - xrath.com 에서 번역됨

목차 | 전의 항목 | 다음의 항목 | JNDI API

## 7. 시나리오

> 여기에서는, JNDI 로 유효하게 된 기능을 나타내기 위해서(때문에), 어플리케이션의 시나리오를 몇개인가 가리킵니다.

- 이후의 예에 따라 어플리케이션을 작성할 필요는 없습니다. 많은 경우, 문제의 해결에는 복수의 방법이 있습니다. JNDI 는, 유연하게 설계되고 있습니다.

### 7.1 사용자 인증

> 시큐리티 보호된 시스템에서는, 액세스 하는 컴퓨터, 네트워크, 서비스에의 인증을 취득할 필요가 있습니다. 예를 들어, UNIX 에 로그인할 때는, 패스워드를 입력할 필요가 있습니다. 또, SSL 를 사용할 때는, X. 509 증명서를 건네줄 필요가 있습니다. 이러한 인증 정보는, 디렉토리내의 각 사용자가 관련지을 수 있었던 속성으로서 포함됩니다. 인증을 실시하는 시스템에서는, 사용자가 입력한 정보를 사용해, 사용자의 속성 (패스워드등)을 룩 올라가 인증을 검증합니다.

> >     DirContext ctx = new InitialDirContext();
> >     Attribute attr = ctx.getAttributes(userName). get("password");
> >     String password = (String) attr.get();

### 7.2 전자 메일

> 전자 메일 시스템에서는, 사용자와 전자메일 주소의 맵을 행하기 위한 디렉토리 서비스를 사용할 수 있습니다. 전자 메일의 사용자는, 이 기능을 사용해 특정의 사용자의 전자메일 주소를 검색할 수 있습니다. 이 조작은, 전화를 걸 때 전화번호부로 특정의 전화번호를 검색하는 것으로 닮았습니다. 예를 들어, 같은 부서내의 「John Smith」에 메일을 송신하는 경우는, 메일 어플리케이션의 「검색」위젯를 사용해, 그 디렉토리에서 「John Smith」를 검색합니다. 이 위젯에 의해, 5 개(살)의 「John Smith」엔트리가 돌려주어집니다. 그 중에서, 동일 직장의 건물에 있는 엔트리를 선택해, 그 엔트리에 관련지을 수 있었던 전자메일 주소 속성을 사용합니다.

> >     NamingEnumeration matches = deptCtx.search("user", new BasicAttributes("name", "John Smith"));
> >     // use matches to construct a selectable list for end-user
> >     while (matches.hasMore()) {
> >         SearchResult item = (SearchResult) matches.next();
> >         Attributes info = item.getAttributes();
> >         /* display attributes */
> >         ...
> >     }

> 이 디렉토리를 사용해, 개인 주소장을 설정할 수도 있습니다. 예를 들어, 「John Smith」의 전자메일 주소를 한 번 특정하면(자), 메일을 송신할 때마다 디렉토리를 반복해 검색하지 않게 할 수가 있습니다. 디렉토리내에, 빈번하게 사용하는 엔트리를 관리하기 위한 개인용 서브 트리를 작성합니다. 많은 경우, 기존의 엔트리에의 링크를 작성합니다.

### 7.3 데이타베이스

> 데이타베이스 어플리케이션으로부터, 디렉토리를 사용해 데이터 베이스 서버-를 검색할 수가 있습니다. 예를 들어, 재무 어플리케이션에서는, JDBC 를 사용하고 있는 주식시세 서버로부터 주식시세를 취득할 필요가 있습니다. 이 재무 어플리케이션으로, 몇개의 속성 (그 시장의 범위 및 시세의 갱신 빈도등)을 지정해 주식시세 서버를 선택할 수가 있습니다. 이 어플리케이션에 의해, 이러한 속성과 일치하는 시세 서버가 디렉토리에서 검색됩니다. 다음에, 선택된 시세 서버의 「위치」속성 (JDBC URL)이 취득되어 그 서버에 접속됩니다.

>     NamingEnumeration matches = 	ctx.search("service/stockQuotes",
>     		                        "(&(market=NASDAQ)(updateFreqency<=300)) ", searchctls);
>     while (matches.hasMore()) {
>     	   SearchResult item = (SearchResult) matches.next();
>     	   Attribute location = item.getAttributes(). get("location");
>        ...
>     }

### 7.4 브라우즈

> 사용자에게 이름의 입력을 요구하는 대화형 어플리케이션에서는, 이름 공간 브라우저를 사용할 수 있으면(자) 입력이 용이하게 됩니다. 이름 공간 브라우저는, 어플리케이션에 짜넣어 그 어플리케이션용으로 조정할 수도 있습니다만, 일반적으로의 Web 브라우저등으로 해서 범용적으로 사용할 수도 있습니다.

> 단순한 JNDI 브라우저의 경우는, 스텝 마다 기본명을 표시하면서 이름 공간을 참조할 수가 있습니다. 각 `Context` 의 이름에 「*」을 표시해, 다음으로 이동할 수 있는 장소를 나타내고 있습니다. 1

>     // Start at the top -- the initial context.
>     Context ctx = new InitialContext();
>     while (ctx ! = null) { 		// display one level
>         NamingEnumeration 	items = ctx.list();
>         while (items.hasMoreElements()) {
>             NameClassPair item = (NameClassPair) items.next();
>             if (isContext(item.getClassName())) {
>                 System.out.print("*");
>             } else {
>                 System.out.print(" ");
>             }
>             System.out.println(" " + item.getName());
>         }
>         // Take the next step down into the namespace.
>         String target = input.readLine();
>         try {
>             ctx = (Context) ctx.lookup(target);
>         } catch (NamingException e) {
>             // handle error
>         } catch (ClassCastException e) {
>             // not a context; cannot traverse
>         }
>     }

### 7.5 네트워크 인쇄

> 인쇄 서비스에서는, 사용자가 네트워크내에서 프린터를 용이하게 특정해 선택할 수 있는 것이 중요합니다. 인쇄를 하는 어플리케이션 또는 그 어플리케이션이 실행되고 있는 머신은, 새로운 프린터가 네트워크에 추가될 때마다 설정할 필요가 없게 하지 않으면 안됩니다. 프린터에의 네트워크 액세스의 스코프에는, 워크그룹으로부터 글로벌까지 다양한 것이 있습니다. 인쇄 서비스에서는, 이 기능을 제공할 경우에 디렉토리가 사용됩니다.

> 프린터는,`Printer` 인터페이스로 표현됩니다. 이 인터페이스의 메소드의 1 개에,`print()` 가 있습니다. 이 메소드에서는, 지정된 `InputStream` 로부터 데이터가 읽어내집니다. 읽어내진 데이터는,`Printer` 의 인스턴스로 표현되는 프린터상에 출력됩니다.

> >     interface Printer {
> >     	void print(InputStream data) throws PrinterException;
> >     	...
> >     }

> 사용자는, 논리 프린터명을 사용해, 명시적으로 또는 디폴트 설정으로부터 프린터를 선택합니다. 예를 들어, 모든 어플리케이션에 대해서 디폴트 프린터를 지정했을 경우, 이 설정은, 다른 프린터를 명시적으로 지정했을 때에만 오버라이드(override) 됩니다. 인쇄 요구를 받아들인 어플리케이션에서는, 그 프린터명을 받아, 디렉토리 서비스내에서 룩 올라갑니다. 이 결과,`Printer` 인터페이스를 구현하고 있는 객체를 받습니다.

>     void myAppPrint(String printerName, String fileName) throws IOException {
>         try {
>             DirContext ctx = new InitialDirContext();
>             Printer prt = (Printer) ctx.lookup(printerName);
>             prt.print(new FileInputStream(fileName));
>         } catch (NamingException e){
>             System.err.println("Could not locate printer: " + e);
>         } catch (ClassCastException e) {
>             System.err.println(printerName + "does not name a printer");
>         }
>     }

#### 7.5. 1 프린터의 브라우즈와 검색

> 명시적으로 이름을 지정해 프린터를 선택하지 않고, 프린터를 특정하는 방법이 있습니다. 디렉토리를 사용하면, 사용 가능한 다양한 프린터를 표시하거나 (브라우즈 기능), 특정의 속성을 가지는 프린터를 검색하거나 할 수가 있습니다. 예를 들어, 디렉토리에 대해서, Mountain View 캠퍼스의 5 번 빌딩의 2 층에 있는 모든 프린터의 일람표시, 또는 600dpi 의 해상도를 가지는 모든 칼라 레이저 프린터의 검색을 요구할 수 있습니다. 어플리케이션으로부터 보면(자), 일람표시 및 검색 조작을 사용했을 경우에서도,`lookup()` 와 같이,`Printer` 객체를 돌려주는 기능이 제공됩니다. `Printer` 객체는, 어플리케이션으로부터 인쇄 요구를 송신할 경우에 사용할 수 있습니다.

1. 이 예로 사용되고 있는 isContext() 메소드는, JNDI 에는 짜넣어지고 있지 않습니다. 이 메소드는, 어플리케이션에 의해 제공되는 메소드입니다.

목차 | 전의 항목 | 다음의 항목

Copyright ©1997-1999 Sun Microsystems, Inc. All Rights Reserved.