'자바자격증'에 해당되는 글 3건

  1. 2008.01.21 SCJD-6.리모트 인터페이스

확장 데이타베이스 MovieDatabase는 기본적으로 로컬에서만 사용할 수 있는 데이타베이스

입니다. 여기서는 이를 네트워크에서 사용할 수 있도록 다시 한번 확장하고자 합니다.

로컬 서비스 받고 있는 있는 객체로부터 네트워크 기반 서비스를 받고자 한다면 가장

간명한 방법은 RMI를 이용하는 것입니다.

Socket을 이용하여 네트워크 기반 서비스로 확장할 수 있지만 ,이 경우는 네트워크 관리를

전담하는 네트워크 클라이언트와 네트워크 서버를 별도로 만들어야 합니다.

정보를 주고 받아 처리하는 비즈니스 로직외에 네트워크에서 정보를 주고 받는 수단을

여러분이 별도로 제공해야 합니다.

 

RMI를 이용하여 로컬 서비스 객체를 네트워크 서비스 객체로 확장하는 간명한 방법은

로컬 서비스 객체를(MovieDatabase객체) 리모트 인터페이스와  클래스로 분리해

생각합니다.

로컬 서비스 객체(MovieDatabase객체)가 제공하는 모든 서비스를 네트워크 서비스 객체

역시 제공해야하므로 리모트 인터페이스에는 로컬 서비스 객체가 가지고 있는 모든 public

메소드를 갖고 있어야 합니다.

그래야 로컬에서 사용할 수 있는 메소드를 모두 네트워크에서도 사용할 수 있으니까요.

그리고 RMI 프로토콜에 따라 모든 리모트 인터페이스는 RemoteException throws

하도록 메소드의 내용을 선언해야합니다.

 

리모트 인터페이스

리모트 인터페이스는 로컬 데이타베이스 객체에 대한 네트워크 확장을 의미합니다.

앞으로 네트워크에서 데이타베이스 객체의 서비스를 받고자 한다면 반드시 리모트

인터페이스를 이용해야만 합니다.

 

package network;

 

import java.rmi.*;

import java.io.IOException;

import java.util.*;

import movie.*;

 

/**

 * 이 인터페이스는 기본적인 데이타베이스 기능인 레코드 검색,추가,삭제,수정등의

 * 서비스를 네트워크 기반으로 제공합니다.

 *

 * @author djkim

 * @version 1.0

 * @since 2003.05

 */

public interface NetworkMovieDatabase extends Remote {

 

             /**

             * 네트워크 데이타베이스 서버가 위치한 곳의 데이타베이스 파일 dbname을 엽니다.

             *           

             * @param String dbname   네트워크 데이타베이스의 데이타베이스 파일이름

             * @exception IOException 네트워크 데이타베이스 서버가 데이타베이스 파일을

             *                        열지 못했을 때

             * @exception RemoteException

             */

    public void open(String dbname) throws IOException,RemoteException;

 

   /**

    * 리모트 데이타베이스를 닫습니다.

    * 리모트 데이타베이스를 닫은 후에는 리모트 데이타베이스로 정보를 읽거나 쓸수

* 없습니다.

    *

    * @exception RemoteException;

    */

    public void close() throws RemoteException;

 

    /**

     * 리모트 데이타베이스 레코드의 칼럼 정보, 칼럼 정보는 칼럼 이름과 칼럼 길이

     * 입니다.

     *

     * @return Field[] 리모트 데이타베이스 레코드의 칼럼 정보

              * @exception RemoteException    

     */               

    public Field [] getFields() throws RemoteException;

 

    /**

     * 리모트 데이타베이스에 존재하는 레코드의 갯수를 구합니다.

     *

     * @return int 리모트 데이타베이스에 존재하는 레코드의 갯수

              * @exception RemoteException

     */

    public int getRecordCount() throws RemoteException;

 

   /**

    * 리모트 데이타베이스로부터 recno번째 레코드를 구해냅니다.

    * 레코드는 1번부터 시작합니다.

    *

    * @param  recno recno번째 레코드

    * @return Record  recno번째 존재하는 레코드

    * @exception DatabaseException 범위를 벗어난 레코드를 지정하는 경우

    *                   recno번째 레코드가 리모트 데이타베이스에 없거나 삭제된 경우

    *                   데이타베이스로 읽기,쓰기가 안될때 등

             * @exception RemoteException

    */

    public Record getRecord(int recno) throws DatabaseException ,RemoteException;

 

   /*

    * key값을 가진 레코드를 리모트 데이타베이스로 부터찾아냅니다.

    * 레코드를 리모트 데이타베이스로부터 찾지 못할 경우 null을 리턴합니다.

    * 레코드의 key값은 레코드가 가지는 여러개의 칼럼중에

    * 첫번째 칼럼이 레코드의 key입니다.

    *

    * @exception DatabaseException 리모트 데이타베이스로 읽기,쓰기가 안될때등

    * @return Record key값을 가진 레코드, key값을 가지는 레코드가 없을 경우 null

    * @param key 레코드의 key

             * @exception RemoteException

    */

    public Record find(String key) throws DatabaseException ,RemoteException;

 

             /**

             * query에 따라 리모트 데이타베이스를 검색하여 조건에 맞는 레코드를 리턴합니다.

             * 조건에 맞는 레코드가 리모트 데이타베이스에 없다면 null을 리턴합니다.

             * qeury comma로 분리된 name=value,name=value형태입니다.

             * 예를 들어 query가 제목=반지의제왕,극장=명보극장 이라면 명보극장에서

             * 상영하는 제목이 반지의제왕인 레코드들을 검색합니다.

             *

             * @return List 검색조건에 맞는 레코드들

             * @param query  레코드 검색조건, comma로 분리된 name=value형태의 반복입니다.

             * @exception DatabaseException 리모트 데이타베이스 파일을 읽을 수 없을때

             * @exception RemoteException

    */

    public List finds(String query) throws DatabaseException, RemoteException;

 

   /**

    * 리모트 데이타베이스에 한 레코드를 추가합니다.

    *

    * @param record 리모트 데이타베이스에 추가할 레코드

    * @exception DatabaseException 리모트 데이터베이스로 부터 읽기 쓰기가 안될때등

             * @exception RemoteException

    */

    public void add(Record record) throws DatabaseException ,RemoteException;

 

   /**

    * 리모트 데이타베이스에 존재하는 Record객체를 수정합니다.

    *

    * @param Record record 수정하고 싶은 레코드

    * @exception DatabaseException 리모트 데이타베이스에 읽기, 쓰기가 안될때 등

             * @exception RemoteException

    */

    public void modify(Record record) throws DatabaseException,RemoteException;

 

   /**

    * 리모트 데이타베이스의  key에 해당되는 특정 레코드를 삭제표시합니다.

    *

    * @param String key 특정 레코드의 키값

    * @exception DatabaseException 리모트 데이타베이스로 읽기쓰기가 안될때등

             * @exception RemoteException;

    */

    public void delete(String key) throws DatabaseException ,RemoteException;

   

    /**

    * 이 리모트메소드는 지정한 레코드(영화)에 대해 하나 이상의 표를 예매합니다.

    * 이 리모트메소드는 다중 thread 환경에서 사용되므로 locking기능을 반드시

    * 포함해야만 합니다. 조건에 맞는 영화표가 없을 경우는 적절한 메세지를 포함한

    * DatabaseException throw 합니다.

    * @param int recno : 예약하고자 하는 영화에 대한 레코드 번호 (레코드 위치)

    * @param int seats : 예약하고자 하는 영화표 갯수

    * @exception DatabaseException 예약하고자 하는 영화표가 부족할때

             * @exception RemoteException

    */

    public void book(int recno,int seats) throws DatabaseException,RemoteException ;

}

예제  18 - 11 NetworkMovieDatabase.java

NetworkMovieDatabase 인터페이스는 로컬 서비스 객체인 MovieDatabase가 가지고

있는 모든 public 메소드를 선언했습니다.

MovieDatabase가 제공하는 public 메소드를 네트워크에서도 NetworkMovieDatabase

인터페이스를 이용하면 호출할 수 있을 것입니다.

Posted by
,