- xrath.com 에서 번역됨

[선두의 항목] [전의 항목] [다음의 항목] [마지막 항목]

## 부록 A - 새로운 특징의 요약

주: 이 장의 내용은, Addison Wesley 사부터 Java 시리즈의 1 권으로서 출판된 「JDBCTM API Tutorial and Reference, Second Edition:Universal Data Access for the JavaTM 2 Platform」(ISBN 0-201-43328-1)에 근거해 작성한 것입니다.

이 부록은, JDBC 2.1 코어 API 의 새로운 특징을 요약하고 있습니다.

### A. 1 JDBC 2.1 코어 API 의 변경점의 개요

JDBC 2.1 코어 API 는, JDBC 1.0 API 를 포함해, 한층 더 확장 기능 및 새로운 기능을 추가하고 있습니다. 이러한 추가된 기능에 의해, 범용적인 데이터 액세스와 향상한 퍼포먼스의 제공에 의해, 데이타베이스 컴퓨팅의 최전선에 Java 프로그램 언어를 자리 매김을 합니다.

「하위 호환성의 목표」에 따르고 있으므로, 구버젼의 JDBC API 를 사용하는 어플리케이션은, Java 2 플랫폼을 사용해 문제 없게 실행할 수 있습니다. 그러나, 2.0 의 새로운 특징을 이용하는 어플리케이션은, 그러한 특징을 구현하고 있는 드라이버와 함께 실행하지 않으면 안됩니다.

JDBC 2.1 코어 API 의 새로운 특징은, 새로운 기능의 지원와 SQL3 데이터형의 지원의 2 개에 크게 분류됩니다.

1. 새로운 기능의 지원
   - 스크롤 가능한 결과 세트
   - 배치 갱신
   - 프로그램 가능한 삽입, 삭제, 갱신
   - 그 외
     - 퍼포먼스 힌트
     - 국제화 된 Unicode 문자의 스트림을 위한 문자 스트림
     - `java.math.BigDecimal` 치의 완전한 정밀도
     - `Date`,`Time`,`Timestamp` 치에서의 타임 존의 지원

2. 진보한 데이터형의 지원
   - 새로운 SQL 데이터형 (SQL3 형)
   - Java 프로그램 언어에서의 영속 객체 보존의 강화한 지원

데이터의 검색, 보존, 조작이 편리하게 되어, 게다가 새로운 특징에 의해 JDBC 어플리케이션의 효율이 보다 좋아집니다. 예를 들어, 배치 갱신에 의해 성능이 큰폭으로 향상합니다. 새로운 `Blob`,`Clob`,`Array` 인터페이스에 의해, 어플리케이션은 클라이언트상에 데이터를 실체화할 필요없고, 대량의 데이터를 조작할 수가 있으므로, 전송 시간으로 필요한 메모리 용량의 큰 절약으로 연결됩니다. 또, 페치 사이즈와 페치 방향의 설정을 위한 새로운 메소드에 의해, 프로그래머는 어플리케이션을 미조정해, 보다 효율적인 데이터 검색과 처리를 달성할 수 있습니다.

### A. 2 새로운 기능의 개요

JDBC 2.1 코어 API 는, 중요한 신기능을 추가하고 있습니다. 여기에서는, 각각의 새로운 기능 범위에 대해 간단하게 설명해, 지원하고 있는 API 를 정리합니다.

#### A. 2.1 스크롤 가능한 결과 세트

스크롤 가능한 결과 세트는, 현재의 커서 위치로부터의 상대 위치 또는 지정의 위치에, 커서를 진행시키거나 되돌리거나 할 수 있습니다. 다음의 인터페이스에는, 스크롤 가능한 결과 세트를 지원하는 새로운 메소드가 있습니다.

- ResultSet
  - 커서를 특정의 행 또는 상대 위치로 이동하는 메소드 (전방 또는 후방 이동)
  - 커서의 현재 위치를 확인하는 메소드
  - 결과 세트가 스크롤 가능한가 어떤가를 나타내는 정수
- Connection
  - `Statement`,`PreparedStatement`,`CallableStatement` 객체를 생성하는 메소드의, 스크롤 가능한 결과 세트를 작성하는 새로운 버젼
- DatabaseMetaData
  - DBMS 와 드라이버가 스크롤 가능한 결과 세트를 지원할지 어떨지를 나타내는 메소드

#### A. 2.2 배치 갱신

새로운 배치 갱신 기능에 의해, 갱신을 개별적으로 송신하지 않고 , 데이타베이스에 복수의 갱신을 한 번에 송신해 배치 실행할 수가 있습니다. 다음의 인터페이스에는, 배치 갱신을 지원하는 메소드가 추가되고 있습니다. `BatchUpdateException` 예외는 신규입니다.

- Statement, PreparedStatement, 및 CallableStatement
  - 배치에 갱신의 문장을 추가하는 메소드, 모든 갱신의 문장을 클리어 하는 메소드, 배치를 실행하는 메소드
- DatabaseMetaData
  - DBMS 와 드라이버가 배치 갱신을 지원할지 어떨지를 나타내는 메소드
- BatchUpdateException
  - 배치 갱신으로 에러가 발생했을 때에 발행되는 예외

#### A. 2.3 프로그램적인 갱신

프로그램적인 갱신에 의해, SQL 문은 아니고 JDBC API 를 사용해 갱신을 실시할 수가 있습니다. 다음의 인터페이스에는, 프로그램적인 갱신을 지원하는 새로운 메소드와 정수가 있습니다.

- ResultSet
  - 각 데이터형을 갱신하기 위한 `updateXXX` 메소드
  - 행의 삽입, 삭제, 갱신을 위한 메소드
  - 어느 행이 삽입, 삭제, 갱신되었는지의 여부를 나타내는 메소드
  - 행의 갱신을 캔슬하기 위한 메소드
  - 결과 세트가 갱신 가능한가 어떤가를 나타내는 정수
- DatabaseMetaData
  - 결과 세트에의 변경이 가시인가 어떤가를 나타내는 정수
  - 결과 세트가 삽입, 삭제, 갱신을 검출할지 어떨지를 나타내는 메소드
  - DBMS 와 드라이버가 갱신 가능한 결과 세트를 지원할지 어떨지를 나타내는 메소드

#### A. 2.4 그 외의 새로운 특징

JDBC 2.1 코어 API 에는, 상기 외에, 다양한 새로운 특징이 있습니다. 이 특징을 다음에 정리합니다.

- 성능의 향상 - 새로운 메소드에 의해, 데이타베이스로부터의 행의 검색을 프로그래머가 미조정할 수가 있습니다. 이러한 메소드에는, (1) 한층 더 많은 행이 필요한 때에 데이타베이스로부터 페치 하는 결과 세트행의 수를 지정해, (2) 데이타베이스로부터 행을 페치 할 방향을 지정하는 기능이 있습니다.
  - 현재의 페치 사이즈와 페치 방향의 취득과 설정에 사용하는 `ResultSet` 메소드
  - 결과 세트의 디폴트의 페치 사이즈와 페치 방향을 취득해 설정하는 `Statement`,`PreparedStatement`, 및 `CallableStatement` 메소드. 이 디폴트의 설정은, 쿼리의 실행에 의해 결과 세트가 최초로 작성될 때 그 결과 세트로 설정됩니다.
- 문자 스트림 - 문자 데이터를, 국제화 된 Unicode 문자의 스트림로서 데이타베이스로부터 검색하거나 데이타베이스에 보내거나 할 수가 있는 메소드. 새로운 메소드는, 추천되어 있지 않은 `getUnicodeStream` 와 `setUnicodeStream` 의 2 개의 메소드를 옮겨놓고 있습니다.
  - `ResultSet.getCharacterStream`
  - `CallableStatement.getCharacterStream`
  - `PreparedStatement.setCharacterStream`
- `java.math.BigDecimal` 치의 완전한 정밀도 - `java.math.BigDecimal` 치를 완전한 정밀도로 취급하는, 새로운 버젼의 메소드. 추천되어 있지 않은 버젼과는 달라, 새로운 버젼에서는 정밀도의 지정을 받지 않습니다.
  - `ResultSet.getBigDecimal`
  - `CallableStatement.getBigDecimal`
- 타임 존의 지원 - 파라미터로서 `Calendar` 객체를 받는 새로운 버젼의 메소드. 드라이버에 대해, 일자, 시간, 타임 스탬프의 값을 계산할 때, 디폴트는 아니고 지정된 타임 존을 사용할 수 있습니다.
  - `ResultSet.getDate`
  - `ResultSet.getTime`
  - `ResultSet.getTimestamp`
  - `CallableStatement.getDate`
  - `CallableStatement.getTime`
  - `CallableStatement.getTimestamp`
  - `PreparedStatement.setDate`
  - `PreparedStatement.setTime`
  - `PreparedStatement.setTimestamp`

### A. 3 진화한 데이터형의 지원

JDBC 2.1 코어 API 에는 진화한 데이터형의 지원가 추가되어 단순한 데이터형과 같게 간단하게 진화한 데이터형을 사용할 수 있습니다. 이 지원에는, 본질적으로는 객체인 새로운 SQL 데이터형의 보존, 검색, 갱신의 기능도 포함되므로, 객체 데이타베이스와 RDB의 명확한 구별을 없앨 수가 있습니다. 다음의 4 개의 마디 (「A. 3.1 SQL3 데이터형이란 무엇인가」,「A. 3.2 SQL3 데이터형의 지원의 개요」,「A. 3.3 새로운 SQL3 데이터형의 매핑」,「A. 3.4 SQL locator」)로,JDBC 2.0 코어 API 의 진화한 데이터형의 지원에 대해 설명합니다.

SQL 로 정의되고 있는 객체를 데이타베이스 테이블내의 값으로 해서 보존 가능한 한은 아니고, Java 어플리케이션을 작성하는 프로그래머는, Java 프로그램 언어로 정의되고 있는 객체를 데이타베이스 테이블내의 값으로 해서 보존할 수가 있습니다. 「A. 3.5 Java 객체 보존의 지원」 로, 이 기능에 대해 설명합니다.

드라이버는, 그 드라이버의 DBMS 가 지원하고 있지 않는 기능을 구현하도록(듯이)는, 요구되고 있지 않습니다. 그 때문에, 모든 드라이버가, 여기서 설명하고 있는 기능을 구현할 필요는 없습니다. `getTypeInfo`,`getColumns`,`getUDTs` 등의 `DatabaseMetaData` 메소드를 호출해, 드라이버가 지원하고 있는 데이터형의 정보를 취득할 수가 있습니다.

#### A. 3.1 SQL3 데이터형이란 무엇인가

여기에서는 새로운 SQL3 데이터형에 대해 설명합니다. Java 프로그램 언어의 데이터형에의 이러한 데이터형의 매핑에 대해서는,「A. 3.3 새로운 SQL3 데이터형의 매핑」으로 설명합니다.

SQL3 데이터형은, 다음과 같이 분류됩니다.

- 새로운 편입형 - 큰 객체를 보존하기 위한 데이터형. `CHAR`,`FLOAT`,`DATE` 등의 표준의 편입 데이터형에 추가됩니다.
  - `BLOB` (바이너리 라지 객체)
  - `CLOB` (캐릭터 라지 객체)
- 구축형 - 주어진 기본형을 기본으로 한 데이터형
  - `REF(`구조화형`)` - 지정된 SQL 구조화형에의 참조
  - `ARRAY[n]`: 모두 같은 데이터형의 `n` 개의 요소의 배열
- 사용자 정의형 (UDT) - SQL 커멘드 þ`CREATE TYPE` 에 의해 작성되는 새로운 데이터형
  - 개별형 - 단일의 편입형의 표현에 근거하는 새로운 데이터형
  - 구조화형 - 편입형이나 사용자 정의형등의 복수의 속성을 가지는, 새로운 데이터형
- locator형 - 데이터 베이스 서버-에 속하는 데이터에의 논리 포인터인 데이터형
  - `LOCATOR(구조화형)`
  - `LOCATOR(배열)`
  - `LOCATOR(바이너리 라지 객체)`
  - `LOCATOR(캐릭터 라지 객체)`

#### A. 3.2 SQL3 데이터형의 지원의 개요

JDBC 2.1 코어 API 는, 다음의 새로운 인터페이스, 메소드, 필드에 의해, 새로운 SQL3 데이터형을 지원합니다.

- 새로운 데이터형을 위한 새로운 인터페이스. SQL3 데이터형은, 다음의 새로운 JDBC 2.1 코어 API 인터페이스에 의해 매핑 된다
  - `java.sql.Array`
  - `java.sql.Blob`
  - `java.sql.Clob`
  - `java.sql.Ref`
  - `java.sql.Struct`
- Java 프로그램 언어의 클래스에의 UDT (SQL 구조화형과 개별형)의 매핑의 커스터마이즈를 지원하는, 새로운 인터페이스
  - `SQLData`
  - `SQLInput`
  - `SQLOutput`
- 새로운 SQL3 데이터형을 취득, 보존, 갱신하기 위해서 기존의 인터페이스에 추가된, 새로운 메소드
  - `ResultSet` 인터페이스의 새로운 `getXXX` 메소드. 결과 세트로부터 SQL3 형의 렬치를 취득한다
  - `CallableStatement` 인터페이스의 새로운 `getXXX` 메소드. 출력 파라미터내의 SQL3 형의 값을 취득한다
  - `PreparedStatement` 인터페이스의 새로운 `setXXX` 메소드. SQL3 형의 렬치를 설정한다
  - `ResultSet` 인터페이스의 새로운 `updateXXX` 메소드. 프로그램에 의해 값을 갱신한다
- `DatabaseMetaData` 와 `ResultSetMetaData` 인터페이스의 새로운 메소드. 새로운 데이터형에 관한 메타데이타를 취득한다
- `java.sql.Types` 클래스에 추가된 새로운 필드 (정수). 새로운 데이터형과 영속적인 보존을 지원한다
  - `DISTINCT`
  - `STRUCT`
  - `ARRAY`
  - `BLOB`
  - `CLOB`
  - `REF`
  - `JAVA_OBJECT`

#### A. 3.3 새로운 SQL3 데이터형의 매핑

JDBC 2.1 코어 API 에서는, SQL3 데이터형의 정확한 복제를 시도하는 것이 아니라, 그러한 데이터형을 Java 프로그램 언어의 형태에 매핑 하는 것으로써, 그러한 데이터형의 기능성을 유지해, 사용의 편의를 도모하는 것을 목표로 합니다. 예를 들어, SQL3 에는 「locator형」이라고 불리는 데이터형이 있어, 데이터 베이스 서버-에 보존되고 있는 데이터를 가리키기 위해서(때문에) 클라이언트상에서 사용됩니다. locator에서는 클라이언트 머신상에 데이터를 실체화하지 않아도 데이터를 조작할 수 있으므로, 큰 데이터를 취급하는 경우에 도움이 됩니다. SQL3 에는,`ARRAY`,`BLOB`,`CLOB` 형과 구조화형을 위한 locator가 포함되어 있습니다. JDBC 2.1 코어 API 에는, 이러한 데이터형을 위한 locator가 직접 포함되고는 있지 않습니다 (구조화형을 위한 locator는 전혀 없습니다)가, 드라이버와 DBMS 가 상황에 맞추어 적절한 locator를 사용하도록(듯이) 구현된 인터페이스가 있습니다. 그 결과, JDBC API 를 사용해 SQL 의 `ARRAY`,`BLOB`,`CLOB` 형의 값에 액세스 하는 경우, 개발자는 locator에 대해 생각할 필요는 없습니다. locator의 상세한 것에 대하여는,「A. 3.4 SQL locator」 를 참조해 주세요.

JDBC 2.1 코어 API 에서는, 다음의 SQL3 데이터형은 Java 프로그램 언어의 인터페이스에 매핑 됩니다.

- `ARRAY` - `java.sql.Array` 에 매핑 된다
- `BLOB` - `java.sql.Blob` 에 매핑 된다
- `CLOB` - `java.sql.Clob` 에 매핑 된다
- `REF` - `java.sql.Ref` 에 매핑 된다

- SQL 구조화형 - `java.sql.Struct` 에 매핑 된다

개별형은 단일의 편입형을 기본으로 하고 있기 (위해)때문에, 단순하게 그 편입형에의 표준적인 매핑에 매핑 되어 인터페이스에는 매핑 되지 않습니다. 예를 들어, 다음의 SQL 문은 새로운 데이터형 `MONEY` 를 작성합니다.

>     CREATE TYPE MONEY AS NUMERIC(10, 2)

이 새로운 UDT 는 `java.math.BigDecimal` 에 매핑 되는 데이터형 `NUMERIC` 를 기본으로 하고 있습니다. 그 때문에, 데이터형 `MONEY` 는 `java.math.BigDecimal` 에 매핑 됩니다. 따라서,`MONEY` 형의 값은 `getBigDecimal` 메소드로 취득되어`setBigDecimal` 메소드로 보존되어`updateBigDecimal` 메소드로 갱신됩니다.

#### A. 3.4 SQL locator

SQL `LOCATOR` 는, 데이터 베이스 서버-위의 데이터에의 논리 포인터입니다. 일반적으로, 화상이나 오디오 등, 클라이언트상에 생성하기에는 너무 큰 데이터를 참조합니다. locator는 클라이언트 환경에게만 존재해, 일시적인 존재입니다. JDBC 2.1 코어 API 의 표준적인 구현에서는 `Blob`,`Clob`,`Array` 의 각 인터페이스의 인스턴스용으로 내부적으로 locator를 사용합니다. 즉,`Blob`,`Clob`,`Array` 객체에는 데이터 그 자체가 포함되어 있는 것이 아니라, 서버상의 데이터를 가리키는 locator가 포함되어 있습니다. `Blob`,`Clob`,`Array` 인스턴스를 조작한다고 하는 것은, 실제로는, 그것들이 나타내는 데이타베이스 객체를 조작하고 있게 됩니다. 클라이언트에 데이터를 반입하지 않고 큰 데이타베이스 객체를 조작하는 이 기능은, 성능에 크게 공헌합니다.

JDBC 2.1 코어 API 에서는 SQL `LOCATOR(`구조화형`)` 의 사용은 필요하지는 않습니다. 표준적인 구현에서는,`Struct` 객체에는, 그것이 매핑 되는 구조화형의 데이터가 포함되어 있어,`Blob`,`Clob`,`Array` 객체와 같은 내부적인 locator로서는 구현되고 있지 않습니다.

#### A. 3.5 Java 객체 보존의 지원

JDBC API 에서는, Java 프로그램 언어 정의되고 있는 영속적인 보존을, `getObject`,`setObject` 메소드를 통해서, 항상 지원 사계라고 있습니다. 물론, Java 객체의 영속적인 보존은, DBMS 가 그것을 지원하고 있지 않는 한 실제로는 일어날 수 없습니다. 이 때문에 지원에는 제한이 있습니다만, Java 객체를 데이터형으로서 인식하는 신세대의 DBMS 가 출현하고 있습니다. Java 릴레이셔널 DBMS 로 불리는 이러한 DBMS 에서는, Java 클래스의 인스턴스를 데이타베이스 테이블내의 열의 값으로 해서 보존할 수 있습니다.

[선두의 항목] [전의 항목] [다음의 항목] [마지막 항목]

Copyright © 1999, Sun Microsystems, Inc. All rights reserved.