본문 바로가기

.주제별/Java

Java) DataSource 란...

## DataSource란..
    (참고 : http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/datasource.html )

    일단, "DataSource"는 자바에서 Data souce들을 표현하는 객체를 의미한다.

    data source란 말은, 데이터를 저장하는 기능을 의미하는데,
    규모가 큰 회사의 데이타베이스처럼 복잡할수도 있고, row/column등으로 표현되는 파일일 수도 있다.
    또한 원격서버에 있을수도 있고, 로컬 데스크탑에 있을 수도 있다.

    어플리케이션은 Connection을 맺어, data source에 접근하는데,
    이때 DataSource 객체는, DataSource 의 인스턴스가 나타내는 특정 data source에 대해 연결을 맺는
    "Factory"로 취급된다.

    DataSource 객체를 사용하는것이 , DriverManager보다 선호되는 경향이 있다.

    기능은 대부분 비슷하지만 다른점을 찾아보면..
    DriverManger와 달리, DataSource 객체는, 'data source'를 기술하고, 규정하고 있는
    property를 갖는다는 것이다.
   
    또한 JNDI와 작업이 된다는 것과, 어플리케이션과 별도로 생성/삭제/운용이 된다.

    Driver 업체는, JDBC 2.0이나 3.0의 한 부분으로,
    DataSource 인터페이스의 기본적인 구성을 갖는 클래스를 제공한다.

    어떤 시스템 관리자가, JNDI naming 서비스에 DataSource Object를 등록하는지,
    또 어떤 어플리케이션이 JNDI에 등록된 DataSource Object를 사용하여,
    data source와 연결을 맺는지 살펴보자.

    JNDI Naming service에 DataSource 객체를 등록하는 것이, DriverManager보다 좋은 점은?

    첫번째 장점은..
       어플리케이션 입장에서, 하드코딩된 Driver 정보들을 필요로 하지 않는다.
       개발자는 단순히, data source의 논리적 이름만을 선택하여,
       이를 JNDI naming 서비스에 등록만 하면 되는것이다.
      
       어플리케이션은 이런 '논리적 이름'을 사용하기만 하면 되고,
       JNDI는 이름과 매칭되는 DataSource 객체들을 제공하기만 하면 된다.
    두번째 장점은..
       DataSource 을 통해서, Connection Pooling / 분산 Transaction과 같은 기능들을 구현 할 수 있다.
        Connection Pooling이란, Connection이 요청될때마다 매번 물리적인 Connection을 생성하기 보다,
        기존의 커넥션을 동적으로 재사용하여 성능을 향상 시키는 기술이다.

    1) Properties

        DataSource 객체는 db server 위치/ db server 이름/ network protocol등의 속성등을 지니고 있다.
        DataSource 속성들은, JavaBeans Design Pattern을 따른다.
        여러 DB업체들이, 동일한 DataSource 구현이 가능하게끔,
        JDBC 2.0 API는 이 속성들의 표준 Set들을 명시하고 잇다.

        예를들어서
        Property             | Type
        -----------------------------
        databaseName    | String
        dataSourceName | String
        .....

        DataSource  객체는 위에서 보인 Property만을 사용하라는 제한은 두지 않는다.
        업체에서 자신들의 속성을 추가할 수도 있다.

        다음은 get/ set 메서드를 통해서 속성을 사용하는 예제이다.

            ds.setServerName("my_database_server");
            String serverName = ds.getServerName();

    2) Using JNDI

        JNDI는, 어플리케이션이 네트워크상의 원격 서버를 찾고, 액세스하는 방법을 제공한다.

        일단 DataSource 객체가 생성이 되고, JNDI Naming 서비스에 등록이 되면,
        어플리케이션은 JNDI API을 통하여, DataSource 객체에 접근 할 수가 있다.
        (이 DataSource 객체는 data source에 연결하는데 사용된다)

    3) Creating & Registering a DataSource Object

        DataSource 객체는 Java Application와는 별도로, 생성/소멸/운영이 된다.
       

        한가지 유념할 것은,
        DataSource 객체는, 개발자 또는 시스템 관리자를 통해서 생성/소멸/운영이 되는것이지

        일반 서비스 사용자에 의해 되는 것은 아니다.

            //Create "DataSource Object"
            VendorDataSource vds = new VendorDataSource( );
            vds.setServerName("my_database_server");
            vds.setDatabaseName("my_database");
            vds.setDescription("the data source for inventory and personnel");

            /*
            * JNDI API을 통해서, vds을 JNDI naming service 에 등록한다.
            */
            //InitalContext() 을 호출하여, JNDI naming context을 참조하고 있는 Java Object "ctx"을 생성함
            Context ctx = new IntialContext( );
            // data source "vds"를, logical name "jdbc/AcmeDB" 와 연결함
            ctx.bind("jdbc/AcmeDB", vds);
 

    4) Connecting to a Data Source

        위에서, DataSource 객체 "vds"는, property를 설정 한 후, logical name "AcmeDB"로 바운드 되었다.

        다음은 이 AcmeDB라는 Logical NameA을 사용하여,
        vds가 나타내고 있는 Database에 어떻게 연결하는지 살펴보자.


            //JNDI을 통하여, AcmeDB에 대한 DataSource 객체를 얻어온다. 
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
            //ds는 (위에서) vds가 참조하고 있는 data source와 같은 것을 가리킴.

            //db id와 passwd을 주고 연결을 함.
            Connection con = ds.getConnection("genius", "abracadabra");
            con.setAutoCommit(false);
            PreparedStatement pstmt = con.prepareStatement(
                                        "SELECT NAME, TITLE FROM PERSONNEL WHERE DEPT = ?");
            ....
            (statement 처리 구절).
            ....
            con.close();



    5) DataSource Implementations

        DataSource 인터페이스는 3가지 타입의 Connection을 제공한다.

        다음은 DataSource 인터페이스를 구현하는 일반적인 3가지 타입이다.

        * Basic DataSource class
        * DataSource class implemented to provide connection pooling
        * DataSource class implemented to provide distributed transactions

    6) Loggin & Tracing

    7) Advantages of Using JNDI
        DriverManager 보다, JNDI naming 서비스에 등록된 DataSource 객체를 사용하여,
        data source 에 연결하는 장점이 있다.

        첫째는 "Portability"이다.
            DriverManager에서, JDBC driver class 이름(보통 Vendor을 지칭하는)이 Application 코드에
            포함되어 잇어, 어플리케이션이 특정 업체에 종속된 결과를 부른다.

        둘째는, "Maintanence"이다.
            만약 data source에 대한 필요한 정보가 변경 된 경우,
            단지 DataSource의 관련된 Property만 변경하면 된다.

            모든 어플리케이션에서 data source에 연결할 필요가 없는 것이다.
            예를들어, DB 서버가 바뀌어서 다른 Port Number을 쓴다고 가정하자.
            이때 DB Name과 Port Number만 바뀌면 되는것이다.