database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Tutorials 9348 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 9348
Oracle SQLJ and JPublisher: 새로운 모습
작성자
정재익(advance)
작성일
2002-01-07 19:10
조회수
6,218

Oracle SQLJ and JPublisher: 새로운 모습

 

저자: Ekkehard Rohwedder, Brian Wright

 

새로운 Oracle SQLJ를 사용하면 JDBC에서 SQLJ으로의 전환이 쉬워집니다.

 

이 문서는 Java와 SQL을 함께 사용하는 분들을 위해 JDBC 프로그래밍 대신 SQLJ 프로그래밍을 사용하여 얼마나 빨리 생산성을 높일 수 있는지를 설명합니다. 또한 이 문서는 Oracle9i에 포함되어 있는 새로운 SQLJ 기능과 어떻게 보조 JPublisher 툴을 사용해 Java 프로그램에서의 SQL 오브젝트 사용을 쉽게 할 수 있는 지를 설명합니다.

 

SQLJ 설명

 

SQLJ를 사용하면 Java 애플리케이션에서 편리하게 SQL 코드를 직접 기록할 수 있기 때문에, 프로그래머들은 작업 방법이 아닌 작업 내용에 집중할 수가 있습니다. Oracle9i에서 SQLJ는 완숙한 기능을 제공하고 있습니다. JDBC 2.0 기능성까지 포함하고 있는 Oracle9i SQLJ는 동적 SQL 코드 삽입을 직접 지원합니다. 이는 편리한 SQLJ 구문을 사용하면 Java언어로 거의 모든 SQL 프로그래밍이 가능하다는 것을 의미합니다. 또한 JDBC 프로그래머들은 동적 SQL을 기반으로 하여 라인별로 모든 JDBC 구문(construct)을 SQLJ 구문으로 전환할 수 있을 것입니다.

 

요구 사항

 

이 문서는 Oracle SQLJ 9.0.1과 Oracle JDBC 9.0.1을 Oracle9i Release 9.0.1 또는 이전 데이타베이스와 같이 사용하는 방법을 설명하고 있습니다. Oracle SQLJ는 Oracle9i Database 및 Oracle9i Application Server 릴리스와 같이 제공되며 otn.oracle.com OTN(Oracle Technology Network) 사이트에서 구할 수도 있습니다. SQLJ 설치와 구성에 대한 전체 설명은 Oracle 설치 시 [OracleHome]/ sqlj/README.txt 파일에 제공됩니다.

 

JDBC에서 SQLJ로

 

JDBC에서 SQLJ로의 전환을 고려 시 JDBC 프로그래머들은 SQLJ가 아래의 JDBC 코드를 처리할 수 있는지 의문을 가질 수 있습니다.

PreparedStatement ps =
  conn.prepareStatement
    ("SELECT ename 
     FROM tab");
ResultSet rs = 
  ps.executeQuery();
while (rs.next())
{ String s = rs.getString(1);
  ... }
rs.close();
ps.close();

물론 대답은 "처리할 수 있다" 입니다. JDBC의 ResultSet 대신 SQLJ의 반복자(iterator)를 사용함으로써 이를 처리할 수 있습니다. 또한 Oracle9i에서는 반복자(iterator) 사용 시 새로운 선택권을 사용할 수 있습니다.

 

표준 SQLJ에서는 이름 소유 반복자(named iterator)나 위치 지정 반복자(positional iterator)를 모두 사용할 수 있습니다. 반복자는 엄격한 타입 구문(construct)으로서 다음과 같이 데이타 타입 또는 옵션으로 각 열의 이름을 지정할 수 있습니다.

#sql iterator PosIter (String);

Oracle.connect(conn);  // required once

PosIter pi;
#sql pi = { SELECT ename FROM tab };
while (pi.next())
{ String s; #sql { FETCH CURRENT 
   FROM :pi INTO :s }; ... }
pi.close();

위치 지정 및 이름 소유 반복자를 사용하면 타입에 구애 받지않는 선언형 프로그래밍 스타일을 허용할 수 있습니다. 전환하는 동안 SQLJ는 SELECT 문이 Java 문자열과 호환되는 타입의 단일 항을 반환하는지를 확인합니다. 이때 반복자 타입을 선언해야 합니다.

 

이 절차를 간결하게 하고 싶고 전환-시간 타입에 신경 쓰지 않는다면, Oracle9i SQLJ는 추가적으로 타입이 없는 반복자(ResultSetIterator로 알려져 있음)를 직접 지원합니다. 이 경우에는 아래 SQLJ 예제에 나타나 있듯이 어떠한 반복자 타입 선언도 존재하지 않습니다.

ResultSetIterator rsi;
#sql rsi = { SELECT ename FROM tab };
while (rsi.next())
{ String s; #sql { FETCH CURRENT 
    FROM :rsi INTO :s }; ... }
rsi.close();

이 메모리 누수는 구문이 자동으로 종결되는 SQLJ 프로그램에서는 발생하지 않습니다.

 

동적(Dynamic) SQL에 대한 새로운 지원

 

출시 때부터 SQLJ은 JDBC보다 장점이 많이 있었지만 SQLJ에 나름대로의 제한이 있었던 것은 사실입니다. 예를 들어, SQLJ는 런타임 시 WHERE 절, 테이블 이름 및 열 이름을 제공한다든지 하는 동적 SQL 기능을 지원하지 못했습니다.

 

하지만 Oracle9i와 SQLJ 9.0.1부터는 이러한 제한을 걱정할 필요가 없어졌습니다. Oracle9i SQLJ에서는 동적 SQL 코드를 내장하고 싶을 때마다 :var 대신 : 구문을 사용할 수 있습니다. (이 구문은 Java 변수를 SQL 작업으로 바인딩할 때 일반적으로 사용하는 구문입니다.) 예를 들어, 마지막 SQLJ 예제에서 다음과 같이 SELECT 구문을 수정할 수 있습니다.

String whereClause = "WHERE ename 
   LIKE 'S%'";
String table = "emp";
#sql rsi = { SELECT ename FROM : : };

하지만 SQLJ 전환기는 런타임 시 생성되는 구문의 의미를 확인할 수가 없기 때문에 전환 목적으로는 다음과 같이 ::(더블 콜론) 표시 뒤에 SQL 교체 텍스트를 제공할 수 있습니다.

#sql rsi = { SELECT ename 
   FROM :{table :: tab}
        :{whereClause :: 
         WHERE ename IS NOT NULL} };

이 SQL 교체 텍스트는 전환 시 SQL 확인을 위한 것입니다. 런타임 시 table과 ename 변수를 위해 올바른 SQL 코드를 제공하는 것은 여러분의 책임입니다.

 

강화된 런타임 효율을 위한 새로운 옵션

 

SQLJ의 또 다른 제한은 런타임의 비효율성에 있습니다. SQLJ 런타임은 JDBC 드라이버에 의해 실행되며, JDBC와 여러분의 애플리케이션 사이에 다른 레이어를 추가합니다. 그리고 일반적으로 SQLJ 런타임은 여러분의 SQL 작업을 SQLJ 전환기가 만들어내는 .ser (serialized resource) 파일에서 읽습니다.

 

Oracle9i에서 제공되는 새로운 SQLJ는 아래 SQLJ 명령줄과 같이 새로운 변환 세팅(-codegen=oracle)을 기반으로 하기 때문에 런타임의 효율성이 강화되었습니다.

 

sqlj -codegen=oracle Sample.sqlj

 

이 명령의 결과는 Sample.java 파일로서 이는 Oracle JDBC 코드를 직접 생성합니다. .ser 파일은 생성되지 않으며 그 결과 SQLJ 런타임의 역할은 프로그램 실행 동안 최소화됩니다. 이 영향과 특별히 최적화된 JDBC API를 사용함으로써 표준 JDBC 실행 보다 더욱 효과적인 SQLJ 실행을 할 수 있습니다.

 

SQL 오브젝트 타입을 위해 SQLJ로 JPublisher를 사용하려면

 

Oracle8i(Release 1부터)와 Oracle9i는 Java와 SQL 사이에서 구성된 오브젝트 데이타를 변환하기 위해 SQLJ이나 JDBC 애플리케이션을 사용할 수 있도록 JPublisher 유틸리티를 제공합니다. JPublisher는 Oracle9i SQLJ를 설치할 때 같이 설치됩니다. 본 섹션에서는 SQLJ와 JPublisher를 사용하여 얻을 수 있는 혜택을 설명합니다.

 

아래의 inheritance 관계를 사용해 오브젝트 타입을 생성한다고 가정하겠습니다.

create type pers 
   as object (name varchar(20)) not final;
create type stu 
   under pers (major varchar(20));

JPublisher 툴을 사용해서 데이타베이스에 연결된 상태에서 SQL 타입에 해당하는 Java 클래스를 만들 수 있습니다. 이 예제를 계속하려면, JPublisher를 실행해서 SQL 타입 PERS에 대한 Java 클래스 Person과 SQL 타입 STU에 대한 Java 클래스 Student를 지정하십시오. JPublisher는 이 클래스들(Person.java와 Student.java)에 대한 원본 파일을 제공하며 여러분은 이를 컴파일할 수 있습니다.

jpub -user=scott/tiger 
   -sql=pers:Person,stu:Student
javac Person.java Student.java

Person 및 Student 클래스는 JDBC와 SQLJ 모두에서 사용할 수 있습니다. SQLJ의 편리함은 이 타입들을 아래 SQLJ 예제에서 볼 수 있듯이 수정 없이 "그대로" 사용할 수 있다는 점에 있습니다.

#sql { create table p of pers };
Student stu1 = new Student();
s.setName("Smith"); s.setMajor("CS");
#sql { insert into p values(:stu1) };

이와는 대조적으로 JDBC의 경우 아래와 같이 사전에 연결 오브젝트 상에서 SQL-Java 타입의 상관관계를 등록해야 합니다.

Hashtable ht = new Hashtable();
ht.put("PERS", Person.class);
ht.put("STU", Student.class);
conn.setTypeMap(ht);

그런 다음 앞에서 보여드린 SQLJ 예제에 상응하는 JDBC 코드(아래 참고)를 사용할 수 있습니다.

PreparedStatement ps = 
   conn.prepareStatement("insert into p
                       values (?)");
ps.setObject(1,s);
ps.executeUpdate();
ps.close();

구문이 편리하다는 점 외에도 SQLJ는 타입 확인 혜택(type checking advantage)을 제공합니다. 이 예제에서 SQLJ 전환기는 SQL 타입 STU가 Java bind 변수인 stu1로 허용될 수 있는지를 확인할 수 있습니다.

 

결론

 

본 문서는 JDBC 사용자를 위한 SQLJ 및 JPublisher의 혜택을 설명하고 있습니다. 타입형 반복자(typed iterator), 스크롤형 반복자(scrollable iterators), 연결 문맥(connection context) 같은 SQLJ의 추가 기능들을 살펴볼 것을 권장합니다.

 

Ekkehard Rohwedder (Ekkehard.Rohwedder@ oracle.com) 씨는 Oracle의 SQLJ 개발 그룹을 책임지고 있습니다. Brian Wright (Brian.David.Wright@oracle.com) 씨는 기술 문서 작가(technical writer)로서 "Oracle9i SQLJ Developer's Guide and Reference"의 저자이기도 합니다.

 

주 1. SQLJ에 관한 추가 정보를 보려면 http://www.oraclepress.com에서 제공하는 Oracle9i: SQLJ Programming (저자:Nirva Morisseau-Leroy, Gerald P. Momplaisir 및 Martin K. Solomon 출판사:Oracle Press/McGraw-Hill, 2001)과 http://www.oreilly.com에서 제공하는 Java Programming with Oracle SQLJ (저자:Jason Price 출판사:O'Reilly & Associates, 2001)를 참조하십시오.

 

주 2. SQLJ에 관한 방대한 정보를 보려면 otn.oracle.com 에서 제공하는 Oracle Technology Network를 참조하십시오. 여기에서 배포용 SQLJ의 다운로드, SQLJ & JDBC 토론 그룹 참여, Oracle SQLJ 관련 자료 액세스, SQLJ와 JDBC 샘플 코드 입수, 기술 부분의 SQLJ와 JDBC 홈 페이지 액세스와 관련 강좌 액세스, 백서 및 자주 묻는 질문(FAQ) 목록이 제공됩니다.

 

원본출처 : http://www.oracle.com/kr/magazine/webcolumns/2001/index.html?o61sqlj.html

[Top]
No.
제목
작성자
작성일
조회
9353RedHat 7.0 에서 Oracle 8.1.6 설치하기 [2]
정재익
2002-01-07
7817
9351Oracle 8 on Linux Enterprise Edition 설치와 Network 설정
정재익
2002-01-07
6566
9349Redhat 7.2 + Oracle 9i 설치하기
정재익
2002-01-07
6638
9348Oracle SQLJ and JPublisher: 새로운 모습
정재익
2002-01-07
6218
9347Oracle9i XMLType의 이해
정재익
2002-01-07
6549
9334오라클 9i 에서 추가된 timestamp 자료형
정재익
2002-01-07
9115
9333client-server환경에서 비정상 종료된 session정리 방법
정재익
2002-01-07
5542
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다