 |  |
|
Sonali Surange, pureQuery Tools Lead, IBM
2008 년 1 월 29 일 자바™ 개발자를 지망하거나, 현재 자바 개발자라면 이 글이 도움이 될 것입니다. IBM® pureQuery 툴로 SQL을 이용한 자바 프로그래밍의 생산성이 그 어느 때보다도 높아졌습니다. 자바 에디터에서 SQL과 자바 애플리케이션을 코딩하고, 동등한 생산성을 경험할 수 있습니다. 자바 에디터를 떠나지 않고, 에러가 없는 자바 애플리케이션과 SQL을 구현합니다. JDBC보다 훨씬 적은 코드로 간단한 데이터 액세스 레이어를 생성합니다. 정적인 SQL을 사용하여 애플리케이션 성능을 높이고, SQL을 사용하여 데이터베이스와 인-메모리(in-memory) 컬렉션에 액세스 합니다.
머리말
본 기술자료 시리즈에서는, 자바 애플리케이션 개발자가 자바 언어로 프로그래밍 할 때 SQL 코딩 에러를 줄일 수 있게 하는 방법을 배우고, 단 한 줄의 코드도 작성하지 않고 고성능 자바 애플리케이션과 테스트 샘플을 구현해 본다. 자바 애플리케이션 내에서 SQL을 커스터마이징 하여, SQL 콘텐트 어시스트, SQL 밸리데이션, SQL 실행, SQL 오픈 정의 같은 pureQuery 툴을 사용하여 SQL 프로그래밍에 적용한다.
pureQuery 툴을 사용하여 속도를 높일 수 있다:
- pureQuery 생산성 툴을 사용하여 데이터베이스 애플리케이션을 빠르게 구현하고, pureQuery 생산성 툴을 사용하여 자바 퍼스펙티브 내에서 SQL을 커스터마이징 한다.
- 하나의 API를 사용했을 때보다 더 쉽게 데이터베이스 애플리케이션을 개발하여 데이터베이스나 인-메모리 데이터 소스로 작업할 수 있다.
- 추가 작업 없이 정적인 SQL로 애플리케이션을 구현한다.
- 애플리케이션 등에 pureQuery 디자인 패턴을 사용한다.
pureQuery 툴과 기술은 IBM Viper Developer V9.5에서 사용할 수 있다.
기술자료 목표
pureQuery 툴의 핵심 기능을 파악한다. 주로 SQL 에디터와 자바 기술의 통합, 그리고 pureQuery 코드 생성 방법에 대해 익힌다. 샘플 pureQuery 애플리케이션을 생성 및 커스터마이징 하고, pureQuery 툴을 사용하여 SQL 또는 빈 같은 기존 에셋들을 재사용 및 마이그레이션 하여, 코드를 작성하지 않고 pureQuery 애플리케이션을 생성한다.
IBM pureQuery
pureQuery는 새로운, 고성능 자바 데이터 액세스 플랫폼으로서, 데이터에 액세스 하는 애플리케이션을 개발하고 관리하는 태스크를 단순화 한다.
pureQuery를 사용할 때의 혜택은 애플리케이션 라이프 사이클의 개발, 전개, 관리, 거버넌스 단계에까지 미친다.
pureQuery는 데이터베이스와 인-메모리 자바 객체에 있는 데이터로의 액세스에 툴, API, 런타임 환경을 제공한다.
왜 pureQuery 툴인가
기존 솔루션의 단점
오늘날, Hibernate, DALI 등과 같은 제품들을 사용하여 데이터베이스에 액세스 하는 애플리케이션들을 구현할 수 있다. 하지만, 이러한 제품들은 HQL/ JPA의 JQL 같은 상용 쿼리 언어에 의존하기 때문에, 여러분은 또 다른 쿼리 언어를 배워야만 한다.
이와 같은 솔루션은 개발자와 DBA에게 실제 네이티브 SQL을 보여주지 않는다. 이러한 쿼리들은 런타임 시 네이티브 쿼리 언어로 변형되기 때문이다. 이 같은 솔루션의 문제는 개발자들이 생성된 SQL의 효과를 볼 수 없기 때문에 문제를 파악하기도 어렵다. 이와 같은 제품들을 사용하여 구현된 최종 애플리케이션들은 하나의 벤더 쿼리 언어로 묶인다. 더욱이, 상용 쿼리 언어들은 복잡한 시나리오와 쿼리를 다룰 만큼 똑똑하지 않다.
지금까지의 모든 Eclipse 기반 제품들은 자바 에디터와 제한적으로 통합되거나, 전혀 통합되지 않아서 자바 애플리케이션 내에서 표준 SQL을 구현하는데 제한이 따른다. Hibernate, DALI 같은 툴은 애플리케이션 개발 시 자바 에디터와 상용 언어들 간 기본적인 통합만 제공한다. 이 같은 툴의 단점은 상용 쿼리 언어로 코딩할 때에만 통합이 가능하다는 점이다.
pureQuery의 솔루션
pureQuery는 네이티브 데이터베이스 쿼리 언어인 표준 SQL을 사용함으로써 이러한 문제들을 해결하여 고성능의 간단한 데이터베이스 액세스 레이어와 애플리케이션을 구현한다. 여러분은 데이터베이스뿐만 아니라, 인-메모리 컬렉션에도 표준 SQL을 사용할 수 있다. pureQuery는 개발자들이 애플리케이션의 SQL에 대해 완벽한 제어권을 준다. 자바 기술과 SQL의 통합은 자바 애플리케이션에서 SQL을 개발하는 어려운 문제를 해결했다.
pureQuery 툴은 create, retrieve,
update, delete 문을 사용하여 데이터 액세스 레이어를 자동 생성한다. 개발자들은 매우 유연한 pureQuery 툴을 사용하여 비즈니스 로직을 추가하고 자동 생성된 코드를 커스터마이징 하는데 집중할 수 있다.
이 글에서는 pureQuery 툴의 기능을 소개하고, 이것으로 애플리케이션 개발과 관리의 생산성을 높이는 방법을 설명한다.
pureQuery 툴의 효용성
IBM pureQuery는 자바 애플리케이션에서의 SQL 개발에 대한 독자적인 페이턴트 기술과 툴을 제공한다. 여러분은 이제, 자바 언어로 코딩할 때 SQL에 대해 생산성을 높일 수 있는 기능을 사용할 수 있게 되었다.
pureQuery 향상은 Eclipse의 표준 자바 에디터에서 경험할 수 있으므로, 새로운 에디터로 가거나, 새로운 툴을 배울 필요가 없다.
pureQuery 기능들
IBM pureQuery 툴의 기능:
- 데이터와 자바 간 차이를 메우면서, Eclipse 환경 내에서 완벽히 작동한다.
- 자바 에디터에 통합된 고급 SQL 에디터를 사용하여, 자바 애플리케이션 내에서 여러분의 필요에 맞게 SQL을 빠르게 개발 또는 커스터마이징 할 수 있다.
- 자바 애플리케이션 샘플을 구현하여 한 줄의 코드도 작성하지 않고도 IBM 데이터베이스에 액세스 할 수 있다.
- 테스트 애플리케이션과 코드를 위해 JUnit을 자동 생성한다.
- 사용하기 쉬운 툴을 사용하여 데이터베이스, SQL, 자바 빈에서 pureQuery 애플리케이션을 구현할 정도로 애플리케이션 개발이 유연하다.
- pureQuery 애플리케이션을 구현하여, 테이블, 뷰, 앨리어스, 프로시저로 작업할 수 있다.
- pureQuery API를 손쉽게 사용하여 JDBC와 비교하여 훨씬 적은 코드로 애플리케이션을 구현할 수 있다.
- 단일 API를 사용하여 인-메모리 컬렉션과 데이터베이스를 쿼리하는 애플리케이션을 구현할 수 있다.
- 정적 SQL을 위한 DB2 애플리케이션을 구현하여 성능을 매우 높일 수 있다.
- XML JPA 포맷으로 작업하여 모든 SQL을 자바 파일 밖의 한 위치에 저장할 수 있다.
- 모든 IBM 데이터베이스에 pureQuery 애플리케이션을 구현할 수 있다.
본 시리즈에서는 샘플을 통해 이러한 기능들을 보다 자세히 검토해 보고자 한다.
플랫폼 지원
IBM 데이터베이스 -? IBM DB2® for Linux®, UNIX® and Windows®,
zSeries®, and iSeries®, as well as IBM Informix® Dynamic Server
Eclipse 환경
- Developer Workbench 9.5 오픈 베타
- IBM Ration® Application Developer와 Rational Software Architect에서의 향후 쉘 공유
데이터베이스 익스플로러 통합-데이터와 자바 기술 간 차이 메우기
일반적으로, 자바 언어로 데이터베이스 애플리케이션을 작성하는 개발자들은 데이터 퍼스펙티브의 데이터베이스 익스플로러 뷰에 정의된 다양한 연결로 액세스 할 수 없다. 개발자들은 데이터베이스 툴과 자바 프로그래밍 툴 사이를 조절하면서 데이터베이스 쿼리와 관련 코드를 작성해야 한다.
pureQuery 툴은 자바용 툴과 데이터베이스 간 완벽한 통합을 지원한다.
특징 ? pureQuery 지원을 자바 프로젝트에 추가하기
- 자바 퍼스펙티브 안에서, 데이터 퍼스펙티브의 데이터베이스 익스플로러 뷰를 열 수 있다.
그림 1. 자바 퍼스펙티브에서 데이터베이스 익스플로러 열기
- pureQuery 툴을 사용하여, 잊는 자바 프로젝트와 데이터베이스 익스플로러에서 연결된 것을 제휴시킬 수 있다. 이렇게 하려면, pureQuery 지원을 자바 프로젝트에 추가한다.
- pureQuery 지원을 추가하려면, 자바 프로젝트를 오른쪽 클릭하고, Add pureQuery
support를 선택한다.
- 데이터베이스 익스플로러에서 기존 연결을 선택하거나 새로운 연결을 만든다.
그림 2. pureQuery 지원 추가하기
특징 ? 데이터베이스 익스플로러 연결 커스터마이징 권고
pureQuery를 사용할 때, 생산성 향상을 위해 데이터베이스 익스플로러 연결을 커스터마이징 한다:
- 데이터베이스 패스워드를 저장하고, 시작 시 자동 재연결을 선택한다. pureQuery 툴의 이러한 설정 때문에 사용이 쉬워진다:
-
Windows > Preferences로 가서, Data를 선택한다.
-
Password information > Persistence scope을 선택하고, "Automatically reconnect connections on startup"을 체크 된 상태로 둔다. 자바와 pureQuery SQL의 통합은 이제 필요할 때마다 자동 재연결을 사용할 것이다.
- 데이터베이스 모델에서 연결 해제된 채로 오프라인 작업을 한다: 활성 원격 서버가 늘 사용할 수 있는 것이 아니거나, 애플리케이션 디자인 시 사용하기에 너무 느리다면, 오프라인 모델에서 애플리케이션을 디자인 하는 것이 좋다. 이 기능은 많은 객체들을 갖고 있는 원격 zSeries와 iSeries 서버에 유용하다:
- 데이터베이스 익스플로러 연결을 오른쪽 클릭하여 연결을 오프라인으로 저장한다. pureQuery SQL과 자바의 통합은 이제 연결 해제 모델에서도 작동한다.
- 연결 스키마 또는 객체 필터: pureQuery 툴은 콘텐트 어시스트 리스트, 밸리데이션, 기타 SQL 통합 기능을 제안할 때 이러한 설정을 사용한다. 이러한 값들을 설정하면, 관심 있는 스키마와 객체로 작업할 수 있고, 객체들을 갖고 있는 zSeries와 iSeries 서버에서 작업할 때 성능을 높일 수 있다.
- 현재 스키마를 설정한다. 기본적으로, 이 값은 연결되어 있는 사용자 ID와 같을 것이다. pureQuery 툴은 이 스키마를 사용하여 모든 무자격 SQL에 자격을 부여한다.
- pureQuery 지원을 추가할 때, 현재 스키마 값을 추가한다. (또는, 프로젝트 프로퍼티 밑에 pureQuery 설정을 수정하여 현재 스키마 값을 설정한다.)
자바 에디터 내 SQL 에디터 통합 ?
SQL과 자바를 함께 코딩하기
pureQuery의 고유한 페이턴트 계류중인 기능인 SQL과 자바 기술의 통합은 개발자들이 자바 애플리케이션에서 SQL을 개발할 때 상당한 생산성 향상의 결과를 가져다 준다. 여러분은 pureQuery 툴을 사용하여 새로운 SQL을 생성하거나 기존 SQL을 커스터마이징 할 수 있다.
통합과 관련한 주요 특징은 다음과 같다:
자바 에디터 내에서 SQL에 대해 SQL 의미 및 신택스 밸리데이션 사용
자바 에디터에서 SQL을 타이핑 하는 동안 SQL 에러가 보고된다:
- 자바 프로그램 안에 삽입된 쿼리에 생긴 에러들은 자바 에러가 보여지는 것과 똑같이 나타난다:
그림 3. 자바 프로그램 내 SQL 에러
- 문제 페인에서 SQL 에러를 본다.
- 무효 SQL이 있는 자바 라인 넘버에 에러 마커를 보여준다.
- 자바 프로그램의 무효 SQL 아래에 에러 표시줄(또는 Eclipse의 기본 에러 표시)을 보여준다.
- 에러 부분으로 가면 상세한 정보를 볼 수 있다.
- SQL 키워드(신택스)와 스키마, 테이블, 컬럼에 생긴 에러 또는 기타 데이터베이스 이름(의미) 에러가 탐지된다.
- SQL 문에 여러 에러들을 탐지한다.
그림 4. 자바 프로그램 내 문제 페인의 SQL 에러들
자바 에디터에서 SQL에 대해 의미 및 신택스 콘텐트 어시스트를 사용할 수 있는 기능
Ctrl 키와 space bar(또는 기본 콘텐트 어시스트 키스트로크)를 누르면 SQL 콘텐트 어시스트 기능이 생기고 자바 에디터 내에서 SQL을 직접 입력할 필요가 없다:
- SQL 키워드를 찾아서 선택한다.
- 프로젝트와 연결된 데이터베이스를 기반으로 스키마 리스트에서 발견 및 선택한다. 연결과 제휴된 스키마 필터들은 보이는 아이템 리스트에 영향을 미친다.
- 테이블 리스트와 컬럼 이름을 찾아서 선택한다.
- 콘텐트 어시스트를 사용하여 테이블 앨리어스에 대한 컬럼을 찾는다.
- 콘텐트-어시스트는 데이터베이스 유형과 기본 키를 보여준다.
- SQL에 구별하기 쉬운 아이콘과 데이터베이스 스키마 관련 제안.
그림 5. 자바 프로그램 내 SQL 콘텐트 어시스트
이 글에서는 본문 "pureQuery 애플리케이션 구현하기
? 신속한 애플리케이션 개발"의 pureQuery 빈(bean) 신택스를 설명한다.
그림 6. SQL pureQuery 신택스를 위한 자바 빈 콘텐트 어시스트
자바 프로그램 내에 SQL을 실행할 수 있는 기능
테스트 애플리케이션을 작성하지 않고 자바 프로그램에서 디자인 시 매개변수로 SQL을 실행한다:
- 자바 프로그램 내 SQL을 오른쪽 클릭하면, 매개변수에 동적 매개변수 또는 pureQuery 빈 신택스를 제공한다. pureQuery 툴은 IDE 세션에 대한 빈 변수 매개변수 값을 기억하고 있다.
- 데이터 아웃풋 페인에서 결과를 본다.
- 데이터 아웃풋 페인에서 인풋과 아웃풋에 대한 메시지와 매개변수 값을 본다.
그림 7. 자바 프로그램에서 SQL 실행하기
SQL 신택스 하이라이팅 제공
하이라이팅을 통해서 자바 프로그램에서 SQL을 구별하여 복잡한 프로그램을 쉽게 볼 수 있도록 한다:
- 자바 프로그램에서 SQL을 강조한다.
- pureQuery 커스터마이징 옵션을 사용하여 원하는 디스플레이 옵션을 선택한다. 기본적으로, SQL 주위에 옅은 노란색 박스가 쳐진다:
Figure 8. 자바 프로그램 내 SQL 하일라이트 ?- SQL 주변의 옅은 노란색 박스
자바 프로그램 내 SQL을 위해 데이터베이스 익스플로러의 오픈 정의
자바 오픈 선언(open declaration)과 비슷한 의미로서, 자바 프로그램 내 SQL의 테이블과 컬럼의 정의를 본다:
- 테이블이 SQL에 배치될 때, 데이터베이스 익스플로러에서 SQL이 나타내는 한 개 이상의 테이블을 본다.
- 데이터베이스 익스플로러에 select 문에 대한 컬럼을 본다.
그림 9. Show in database explorer
자바 프로그램의 SQL 템플릿 지원
SQL 에디터에서 각자 선호하는 템플릿을 재사용 하여 자바 프로그램에 공통으로 필요한 쿼리를 생성한다:
- 자바에서 SQL 콘텐트 어시스트를 사용할 때 원하는 SQL 템플릿을 보고 선택한다.
- SQL 에디터 템플릿 편집 기능을 사용하여 SQL 템플릿을 커스터마이징 한다.
그림 10. 자바 내 SQL 템플릿
자바 프로그램의 시각적 설명
자바 프로그램 내에서 SQL을 위한 설명(explain) 페인을 본다.
프로그램에 pureQuery의 에디터 통합 사용하기
pureQuery의 SQL 통합은 Eclipse의 표준 자바 에디터에서 사용할 수 있다.
기본적으로, SQL 편집 기능은 pureQuery API 내 사용되는 스트링에 대해 실행된다.
또한, 이것을 여러분이 선택한 스트링 또는 SQL을 포함하고 있는 애플리케이션에 사용할 수 있다.
SQL이 있는 기존 또는 새로운 자바 프로젝트에 pureQuery 에디터 지원을 실행하기
여러분의 프로젝트의 어떤 스트링에서라도 SQL을 실행하고, 데이터베이스 익스플로러에 보이게 하고, SQL 빈 기능을 생성하려면(SQL 빈 기능과 관련하여 "pureQuery 애플리케이션 개발 ? 신속한 애플리케이션 개발" 섹션 참조) 다음 단계를 따른다:
- pureQuery 지원을 자바 프로젝트에 추가한다. 연결을 자바 프로젝트에 제휴시킨다.
- 이전에 열렸던 자바 파일들이 pureQuery 지원을 추가한 후에 다시 열렸는지를 확인하여 실행되는 pureQuery 오른쪽 클릭 메뉴를 본다.
여러분의 애플리케이션의 어떤 스트링에서라도 SQL 콘텐트 어시스트, SQL 밸리데이션, SQL 템플릿 기능을 활용하려면 아래 단계를 따른다:
-
@Sql 명령어를 사용하여 SQL 편집이 실행될 스트링의 선언에 주석을 단다.
-
Ctrl+Shift+O (또는 기본 키스트로크)를 사용하여
@Sql의 정의를 가져온다. pureQuery 런타임으로부터 정의가 임포트 된다:
import com.ibm.pdq.annotation.Sql; @Sql String mySQL = "select *
from ssurange.department"
스트링 mySQL에 대한 할당은 pureQuery 에디터 기능을 통해 혜택을 누릴 수 있다.
pureQuery 애플리케이션 구현하기 ? 신속한 애플리케이션 개발
pureQuery 툴을 사용하여, 코드를 작성하지 않고 pureQuery 스타터(starter) 애플리케이션을 구현할 수 있다. 생성된 애플리케이션에서 SQL을 커스터마이징 하거나, 새로운 pureQuery API를 애플리케이션에 추가하여 애플리케이션 개발의 요구 사항을 만족시킬 수 있다.
사용할 시기 ? pureQuery 툴 기능
-
데이터베이스를 갖고 있고, 데이터 액세스 코드를 생성하고 싶은가?
데이터베이스에서 pureQuery bottom up 시나리오를 사용하라.
-
SQL을 재사용 하여, 데이터 액세스 코드를 생성하고 싶은가?
SQL에서 pureQuery bottom up 시나리오를 사용하라.
-
데이터베이스와 자바 빈이 있고, 빈과 빈 필드를 데이터베이스 테이블과 컬럼에 매핑하여 데이터 액세스 코드를 계속 생성하고 싶은가?
pureQuery meet-in-the-middle 시나리오를 사용하라.
-
데이터베이스와 매핑된 자바 빈이 있고, 데이터 액세스 코드를 생성하고 싶은가?
빈 시나리오에서 pureQuery bottom up을 사용하라.
-
빈이 있고, 데이터베이스 스키마를 생성하고 싶은가?
top down 시나리오를 사용하라.
-
하나의 XML 파일에 모든 빈 주석과 애플리케이션 SQL을 두고 싶은가?
pureQuery XML 시나리오를 사용하라.
-
데이터 액세스 코드와 더 나은 성능이 필요하지만, 더 이상의 개발 작업은 필요하지 않은가?
pureQuery 정적 SQL 시나리오를 사용하라.
-
데이터베이스와 인-메모리 데이터로 작업해야 하고, 새로운 API를 배우고 싶지 않은가?
컬렉션 지원을 통한 pureQuery 쿼리를 사용하라.
데이터베이스의 pureQuery bottom up 시나리오
애플리케이션 개발자들은 일반적으로 다음과 같이 애플리케이션 개발을 시작한다:
- 예제로 시작하고, 이것을 필요에 맞게 커스터마이징 한다.
- 툴을 사용하여 스텁을 생성하면서, 데이터 액세스 코드를 직접 채우거나, 또는
- 전체 애플리케이션을 직접 코딩한다.
pureQuery 툴은 위 모든 시나리오에 생산성 향상을 가져온다.
pureQuery 코드 생성
pureQuery 툴을 사용하면, 테이블, 뷰, 프로시저에 대한 pureQuery 데이터 액세스 코드를 생성할 수 있다.
pureQuery 툴은 create, retrieve,
update, delete SQL 문을 제안하고, pureQuery를 사용할 때 개발이 얼마나 쉬운지를 증명한다.
여러분은 pureQuery 인라인-메소드 스타일 또는 주석-메소드 스타일 기반 애플리케이션을 구현할 수 있다:
- 인라인-메소드 스타일을 사용하여 JDBC와 비슷한 룩앤필로 애플리케이션 내에서 SQL로 애플리케이션을 생성할 수 있다.
- 주석-메소드 스타일을 사용하여 SQL을 인터페이스와 제휴시키고, 이 인터페이스를 사용하여 애플리케이션에서 분리시킨다.
새로운 pureQuery 메소드, 인터페이스, SQL을 추가하거나, 기존 메소드, 인터페이스, SQL을 수정함으로써, 애플리케이션을 쉽게 커스터마이징 할 수 있다.
또한, 샘플 프로그램 또는 생성된 API와 SQL을 사용하는 JUnit 테스트 케이스를 자동 생성하고, 한 줄의 코드도 작성하지 않고 실행시킬 수 있다.
데이터베이스의 pureQuery bottom up 시나리오 ?
테이블, 뷰
pureQuery는 테이블, 뷰, 닉네임에서 데이터에 액세스 하여 조작하는 pureQuery 코드를 생성할 수 있는 기능을 제공한다. pureQuery API는 빈을 사용하여 select 문의 결과를 보유한다. pureQuery API를 사용하면, 빈 인터페이스를 사용하여 select, insert, update, delete 문에 인풋 매개변수 값을 제공할 수 있다. 이는 데이터 액세스 코드를 매우 단순화 한다. pureQuery 툴은 모든 빈, SQL 문, pureQuery API를 위한 코드를 생성한다.
- 데이터베이스 익스플로러의 테이블을 오른쪽 클릭하고, Generate pureQuery
code를 선택한다.
그림 11. 테이블에서 pureQuery 코드 생성하기
빈 생성의 특징
테이블이나 뷰를 나타내는 빈을 자동 생성할 수 있다. 자바 코딩 표준을 따라야 한다면:
- 자바 빈 이름을 바꾸고, 필요할 경우 빈 필드 이름을 바꾸고, 자동으로 생성된 데이터베이스로 매핑시킨다.
- 퍼블릭 getter, setter를 사용하여 퍼블릭 필드와 보호 필드를 생성한다.
- 수퍼 클래스를 제공한다.
- 커스텀 자바 유형 매핑이 필요하면, 마법사에서 빈 필드용 기본 유형 매핑을 수정할 수 있다. (그림 12) 표준 JDBC 유형 변환 규칙은 애플리케이션 실행 시 적용된다.
그림 12. 빈 생성 옵션
pureQuery 데이터 액세스 코드 생성의 특징
pureQuery 신택스와 빈 필드를 나타내는 변수들은 코드의 라인들과 select, update, insert, delete 문의 복잡성을 줄이는데, 여러 매개변수들은 한 개의 빈 매개변수를 사용하여 표현될 수 있다.
pureQuery는 결과를 갖고 있는 빈의 iterator로서 값을 리턴하는 쿼리 API를 제공함으로써 용이성을 더했고, 관심 있는 데이터를 보내는 수동 결과 세트 핸들링을 줄였다.
- pureQuery의 queryFirst API를 사용하여 모든 행 대신 한 개의 행을 쉽게 얻을 수 있다.
- 생성된 코드는
select, insert,
update, delete 문에 대한 pureQuery API를 사용하도록 제안하고 있다. 기본 키는 생성된 SQL에 사용되어 where 문을 구현한다. 또한, 자동 생성 키를 사용하여 테이블에 대한 코드를 생성할 수 있다.
- 애플리케이션 요구 사항에 기반하여 인라인-메소드 스타일 또는 주석-메소드 스타일을 생성할 수 있다.
스콜 코딩 표준에 순응해야 한다면:
- 프레퍼런스를 사용하여 * 또는 모든 컬럼을 사용한다.
- 주석-메소드 스타일을 사용할 때 프레퍼런스를 사용하여 일부 제안된 메소드만 생성한다.
또한, 새로운 메소드를 기존 주석-메소드 스타일 인터페이스에 합병할 수 있다.
그림 13. 코드 생성 프레퍼런스
Listing 1. 생성된 코드 ?- Bean (코드 분석을 위한 코드 내 주석 참조)
/**************************************************************
*A bean that represents the PROJECT table.
*
**************************************************************/
import com.ibm.pdq.annotation.Table;
import com.ibm.pdq.annotation.Id;
import com.ibm.pdq.annotation.Column;
import java.math.BigDecimal;
import java.sql.Date;
// Auto generated mapping for bean to table name
@Table(name="PROJECT", schema="SSURANGE")
public class MyProject {
// Class variables
@Id
public String projno;
// Auto generated mapping for field to column name
@Column(name="PROJNAME") public String myProjname;
public String deptno;
public String respemp;
public BigDecimal prstaff;
public Date prstdate;
public Date prendate;
public String majproj;
}
|
Listing 2. 생성된 코드 -- 인라인-메소드 스타일 샘플
// create and use standard jdbc connection for conn
Data db = DataFactory.getData (conn);
db.setAutoCommit(false);
// execute the select statement and return results in an iterator of MyProject bean
// MyProject bean represents the result
Iterator<MyProject> getMyProjects = db.queryIterator ("select DEPTNO, MAJPROJ,
PROJNAME, PRENDATE, PROJNO, PRSTAFF, PRSTDATE, RESPEMP from SSURANGE.PROJECT",
MyProject.class);
// get the bean representing the first row to use to test update, delete and insert.
// The changes are rolled back if there is any error
MyProject bean = null;
if (getMyProjects.hasNext()) {
bean = getMyProjects.next();
} else {
SampleUtil.printLn("Result set is empty.")
db.rollback();
return;
}
// Suggestion for query using primary key and bean parameter. This API returns one
// bean.
// Notice that the parameter information is provided via a bean instance.
// pureQuery also supports standard dynamic parameters ( ie ?)
MyProject getMyProject = db.queryFirst ("select DEPTNO, MAJPROJ, PROJNAME, PRENDATE,
PROJNO, PRSTAFF, PRSTDATE, RESPEMP from SSURANGE.PROJECT where PROJNO = :projno",
MyProject.class, bean);
SampleUtil.printClass(getMyProject);
// Suggestion for query update statement. Provide all values to set in bean fields!
db.update("update SSURANGE.PROJECT set DEPTNO = :deptno, MAJPROJ = :majproj,
PROJNAME = :myProjname, PRENDATE = :prendate, PROJNO = :projno, PRSTAFF = :prstaff,
PRSTDATE = :prstdate, RESPEMP = :respemp where PROJNO = :projno", bean);
getMyProjects = db.queryIterator ("select * from SSURANGE.PROJECT", MyProject.class);
SampleUtil.printLn("Results for update (bean)");
SampleUtil.printAll(getMyProjects);
// Suggestion for query delete statement. Provide all values to set in bean fields!
db.update("delete from SSURANGE.PROJECT where PROJNO = :projno", bean);
getMyProjects = db.queryIterator ("select * from SSURANGE.PROJECT", MyProject.class);
SampleUtil.printLn("Results for - delete (bean)");
SampleUtil.printAll(getMyProjects);
// Suggestion for query insert statement. Provide all values to set in bean fields!
db.update("insert into SSURANGE.PROJECT (DEPTNO, MAJPROJ, PROJNAME, PRENDATE,
PROJNO, PRSTAFF, PRSTDATE, RESPEMP) values( :deptno, :majproj, :myProjname,
:prendate, :projno, :prstaff, :prstdate, :respemp)", bean);
getMyProjects = db.queryIterator ("select * from SSURANGE.PROJECT", MyProject.class);
SampleUtil.printLn("Results for - insert (bean)");
SampleUtil.printAll(getMyProjects);
|
데이터베이스의 pureQuery bottom up 시나리오 - 프로시저
pureQuery 툴은 pureQuery 코드를 생성하여 프로시저를 호출하는 기능을 제공한다. pureQuery API는 빈을 사용하여, 결과 세트를 갖고 있는 매개변수와 빈을 나타낸다. pureQuery 툴은 모든 빈에 대한 코드, 호출 문, pureQuery API를 생성하여 호출 문을 실행한다.
프로시저의 호출 문을 위한 코드를 생성하려면, 데이터베이스 익스플로러의 프로시저를 오른쪽 클릭하고, Generate pureQuery Code를 선택한다. 그리고 나서, 마법사에서의 단계를 따른다.
pureQuery 툴은, 매개변수가 존재한다면(input, output, in out), 빈을 생성하여 매개변수 값을 보유한다. pureQuery API는 빈을 사용하여 인풋 매개변수를 수락하거나, 인풋과 in out 매개변수에 대한 값을 리턴한다.
리턴된 각 결과 세트에 대한 빈도 생성할 수 있다. pureQuery 프로시저 코드 생성 마법사는 프로시저를 실행하여 결과 빈의 모양을 파악하는 옵션을 제공한다. 여러분은 이 빈을 커스터마이징 하여 수퍼 클래스, 퍼블릭 getter와 setter를 가진 퍼블릭 또는 보호 필드를 갖거나, 기본 자바 유형 매핑을 변경한다.
주: 향후 릴리스에서는 프로시저를 실행하지 않고 결과 세트를 정의할 수 있다.
그림 14. 결과 세트 빈 생성
pureQuery 데이터 액세스 코드 생성 특징
Listing 3 (결과 세트 빈을 가진 pureQuery)은 pureQuery API 예제로서, 결과 빈에 호출 문의 결과를 리턴하는 pureQuery API를 보여주고 있다.
Listing 6 (JDBC 결과 세트를 가진 pureQuery)은 JDBC 미가공 JDBC 결과 세트로서 결과를 리턴하는 pureQuery API 예제이다. 결과 세트 빈 모양을 파악하기 위해 프로시저를 실행하는 것을 선택하지 않았다면, 미가공 JDBC 결과 세트로 작업할 수 있다.
인라인-메소드 또는 주석-메소드 스타일 프로그램이 생성될 수 있다.
샘플 인라인-메소드 스타일:
Listing 3. 결과 세트 빈이 있는 pureQuery
// Get jdbc connection
Data db = DataFactory.getData (conn);
// Initialize parameter bean
Procedure1Param parms = new Procedure1Param();
// set parameter values from arguments to the program.
setParms(parms, args);
// Call the procedure using pureQuery API
// Note that all parameters are represented in the call statement
// Note that parameter bean is passed in as a parameter
StoredProcedureResult spResult =
db.call("Call SSURANGE.PROCEDURE1( :param1, :param2 )", parms );
// Retrieve first result set into the corresponding result bean
Iterator<ResultBean1> resultSet1 = spResult.getIterator(ResultBean.class);
// Print results
SampleUtil.printAll(resultSet1);
// Retrieve second result set into the corresponding result bean
Iterator<ResultBean2> resultSet2 = spResult.getIterator(ResultBean.class);
// Print results
SampleUtil.printAll(resultSet2);
|
Listing 4. 자동 생성된 매개변수 빈
public class Procedure1Param {
// Class variables
public String param1;
public String param2;
}
|
Listing 5. 첫 번째 결과 세트를 보유하고 있는 자동 생성된 결과 세트 빈
public class ResultBean1 {
// Class variables
public String routinename;
public String routineschema;
}
|
비슷한 빈이 생성되어 두 번째 결과 세트를 저장한다:
Listing 6. 미가공 JDBC 결과 세트를 가진 pureQuery
// If you choose not to run the procedure to discover the result set shape used to
// define the result bean, pureQuery APIs allow you to work with the JDBC result set
// Get jdbc connection
Data db = DataFactory.getData (conn);
// Initialize parameter bean
Procedure1Param parms = new Procedure1Param();
setParms(parms, args);
// call the procedure using pureQuery API
StoredProcedureResult spResult =
db.call("Call SSURANGE.PROCEDURE1( :param1, :param2 )", parms );
// Process the result sets
boolean results = spResult.hasResultSets();
while ( results){
ResultSet rs = spResult.hasResultSet();
SampleUtil.dumpResultSet(rs);
Results = spResult.moveToNext();
}
|
SQL의 pureQuery bottom up
pureQuery 툴은 pureQuery 애플리케이션을 구현할 때, SQL 같은 기존의 에셋들을 쉽게 재사용 할 수 있게 해준다. 이러한 기능을 사용하여, 기존의 JDBC나 SQL을 포함하고 있는 다른 데이터베이스 애플리케이션들을 쉽게 마이그레이션 할 수 있다.
pureQuery 툴은 자바 에디터 내에서 유연하고 쉬운 통합을 제공한다. 빈을 만들어서 SQL 문의 결과를 저장하고 간단한 pureQuery API를 사용하여 SQL을 실행하고 결과를 리턴한다.
pureQuery 툴을 사용하여, 다음과 같이 간단한 단계를 따른다:
- pureQuery 지원을 자바 프로젝트에 추가한다.
- SQL을 포함하고 있는 자바 파일을 Open/ re-open하여, SQL을 오른쪽 클릭하고, pureQuery 어시스트 메뉴에서 Generate SQL bean을 선택한다. 이렇게 하면, SQL의 결과를 갖고 있는 빈이 만들어 진다. 자동 생성된 pureQuery 애플리케이션은 커스터마이징 되어 빈을 사용할 수 있다.
Listing 7. 생성된 코드 - 인라인-메소드 스타일 샘플
// change the generated code to represent your SQL and beans.
Iterator<MyBean> getMyProjects = db.queryIterator ("your new SQL", MyBean.class);
|
그림 15. SQL에서 빈 생성하기
pureQuery meet-in-the-middle
기존 빈과 데이터베이스 스키마를 재사용 및 pureQuery로 마이그레이션 하기
pureQuery 툴은 기존 빈과 데이터베이스 스키마를 쉽게 재사용 하여 pureQuery 애플리케이션을 구현할 수 있도록 한다. 테이블, 스키마, 컬럼에 대한 pureQuery 주석에 유연하고 사용이 쉬운 콘텐트 어시스트를 사용하여 데이터베이스 테이블과 컬럼으로 빈과 필드를 쉽게 매핑할 수 있다.
일단, 매핑이 완료되면, "show in database explorer" 기능을 사용하여 매핑된 테이블과 컬럼을 보고 매핑이 정확하고 잘 되었는지를 확인한다.
pureQuery 툴을 사용하면 기존의 빈들을 데이터베이스 스키마 정의로 쉽게 매핑할 수 있다. pureQuery 주석이 결합된, 주석 내의 콘텐트 어시스트와 자바 quick-fix로, 코딩 없이 매핑을 수행할 수 있다.
다음과 같은 간단한 단계를 따른다:
- pureQuery 지원을 프로젝트에 추가한다.
- 자바 빈을 연다.
- 클래스에 대한
@Table 주석을 추가하여 테이블에 빈을 매핑한다.
- 주석이 com.ibm.pdq.annotation 패키지에 정의되고, Ctrl + shift + O 키스트로크를 사용하거나 기본 키스트로크를 사용하여 필요한
import 문을 빈 파일에 반입할 수 있다.
- 네임 애트리뷰트에 Ctrl + space를 사용하여 테이블과 스키마에 대한 콘텐트 어시스트를 얻는다. 마찬가지로,
@Column 주석을 사용하여 빈 필드를 데이터베이스 컬럼으로 매핑한다. 네임 애트리뷰트에 Ctrl + space를 사용하여 컬럼 콘텐트 어시스트를 얻는다.
그림 16. 스키마 콘텐트 어시스트
그림 17. 테이블 콘텐트 어시스트
그림 18. 컬럼 콘텐트 어시스트
데이터베이스 익스플로러에서 매핑된 빈 보기
테이블 또는 컬럼의 정의를 열면, 빈 또는 필드가 데이터베이스 익스플로러에 나타난다:
- 커서를 빈 필드에 놓는다.
- pureQuery 어시스트 메뉴를 사용하여, Show in
Database Explorer를 선택한다. 빈 필드를 나타내는 컬럼 정의는 Database Explorer에서 볼 수 있다.
또는 빈 파일 아무데나 커서를 두고 이 메뉴를 사용하면 테이블이 열리면서 Database Explorer에 빈이 나타난다.
그림 19. 데이터베이스 익스플로러에 빈 보여주기
pureQuery bottom up from beans 시나리오
pureQuery 툴을 사용하여, 데이터베이스로 매핑된 빈을 재사용 및 마이그레이션 하여 pureQuery 데이터 액세스 레이어를 만들 수 있다.
generate pureQuery code 액션을 사용하여 매핑된 빈에서 pureQuery 코드를 만든다. 모든 pureQuery 스타일 및 샘플 애플리케이션을 만들 수 있고, bottom up 시나리오와 비슷한 JUnit 테스트 케이스를 만들 수 있다.
그림 20. 매핑된 빈에서 pureQuery 코드 생성하기
pureQuery top down 시나리오
기존 빈을 재사용 하고 관계형 스키마 생성하기
SQL 스크립트를 사용하여 pureQuery 툴을 사용하는 빈을 나타내는 빈을 만들 수 있다. 빈을 나타내는 DDL 스크립트는 콘솔 창에 보이는데, SQL 에디터에서 수정 및 실행할 수 있다.
자바 에디터와의 통합은 다음과 같이 수행된다.
- 빈을 오른쪽 클릭하고, Generate DDL을 선택한다.
- 콘솔 창에서 제시된 DDL을 본다.
pureQuery XML 시나리오
애플리케이션 정보를 XML 포맷으로 가져오는데, 이것은 XML JPA 스팩의 하위 세트이다. pureQuery 툴을 사용하여 주석이 달린 메소드 스타일 프로그램에서 SQL과 빈을 데이터베이스 매핑 정보로 가져온다. 결국, 이 정보를 하나의 XML에서 관리할 수 있다.
pureQuery 제너레이터 프로퍼티를 XML 파일을 가리키도록 설정할 수 있다. 주석이 달린 메소드 인터페이스용 구현은 SQL과 XML로부터의 빈 매핑을 사용한다.
자바 에디터와의 통합.
- 빈 또는 인터페이스를 오른쪽 클릭하고, Generate XML을 선택한다.
- 자바 프로젝트를 오른쪽 클릭하고, pureQuery를 선택하고, 제너레이터 섹션에서 다음을 추가한다:
- xmlFile ? Eclipse 워크스페이스 내 yourFile
pureQuery 정적 SQL 시나리오
어떤 추가 작업 없이 애플리케이션 성능 높이기
정적 SQL은 애플리케이션을 실행할 때 성능을 높인다.
pureQuery는 정적 SQL과의 작업을 매우 쉽게 만든다. 정적 또는 정적으로 실행하기를 선택하는 것이 실행 시간 동안 가능하며, 애플리케이션 개발에는 영향을 주지 않는다. 결국, 개발자는 새로운 툴이나 프로그래밍 패러다임을 배울 필요 없이 정적 SQL에서 효과를 볼 수 있다.
pureQuery의 정적 SQL 통합은 기존의 SQLJ 솔루션 보다 생산성을 더욱 높인다.
pureQuery와 정적 SQL의 실행 모습을 보려면, 첨부디 스크린 캡쳐 비디오, pureQuery_staticSQL.zip(다운로드)을 참조하라.
애플리케이션을 바인딩 하려면, 자바 프로젝트를 오른쪽 클릭하고, Bind pureQuery
Application menu를 선택한다.
콘솔의 메시지는 바인드 프로세스가 성공했음을 나타낸다. 프로젝트와의 제휴는 바인드를 수행하는데 사용된다.
애플리케이션을 다른 데이터베이스로 연결하려면, 프로젝트와 제휴된 연결을 수정하고, 위 단계를 통해 애플리케이션을 다시 연결한다. 프로젝트를 오른쪽 클릭하고, Properties를 선택하고, pureQuery 밑에서 제휴 연결을 변경한다.
그림 21. pureQuery 애플리케이션 연결하기
연결을 해제하려면, 위쪽에 있는 메뉴인 Project >
Clean을 사용하여 프로젝트를 제거한다.
정적 SQL은 DB2 데이터베이스에서만 지원된다. 정적 SQL 역시 주석-메소드 스타일에서만 지원된다. 향후 릴리스는 정적 SQL을 인라인-메소드 스타일에 통합할 예정이다.
이 글에 첨부된 pdq.properties 파일을(다운로드) 프로젝트의 소스 폴더로 복사한다. 기본적으로, 이것은 src 폴더이다. pdq.properties 파일 역시 아래 Listing 8에 포함되어 있다.
런타임 시, 애플리케이션을 정적 또는 정적으로 실행할 선택권이 주어진다.
- 정적으로 실행하려면, pdq.executionMode=STATIC 을 유지한다.
- 동적으로 실행하려면, pdq.executionMode=STATIC을 제거한다.
Listing 8. Pdq.properties 파일
#Below data zero properties can be overridden by supplying the system properties
as input to the JVM:
#
#-Dpdq.config.file=filename //a file on file system.
#or
#-Dpdq.config.resource=filename //a file on classpath
(default is /com/ibm/zero/data/runtime/dzero.properties)
#or
#-DIndividualPropertyName=Value
#
#If both pdq.config.file and pdq.config.resource are specified,
pdq.config.file has precedence.
#Name of datazero log file. Can be absolute or relative path.
pdq.log.file.name=c:\\temp\\pdq.log
#detail level of messages written to the log file.
#Supported Levels are those supported by java.util.logging APIs:
# OFF - Logging turned off.
# SEVERE - Least detail, only severe problems are logged.
# WARNING
# INFO
# CONFIG
# FINE
# FINER
# FINEST - very detailed log.
# ALL - All levels will be logged.
#
pdq.log.file.level=ALL
#detail level of messages written to the console.
pdq.log.console.level=OFF
#Switch to buffer logs in memory and only write them on error.
#When non-zero, this will avoid the performance overhead of disk I/O of
#writing excessive logs, but will still provide some history around
#the vicinity of error conditions.
#Could be set to 1000 to buffer 1000 log records for example.
pdq.log.lazy.buffer=0
#Data Zero runtime execution log. STATIC or DYNAMIC.
#STATIC is only supported by DB2 databases.
pdq.executionMode=STATIC
|
컬렉션을 통한 pureQuery 쿼리
pureQuery를 통해, 표준 SQL을 사용하여 인-메모리 컬렉션 같은 정보 소스를 쿼리할 수 있고, 다양한 데이터 소스와 작업할 때 코드를 간단하고 일관성 있게 유지할 수 있다.
Listing 9에서, 사원들이 데이터베이스에서 검색되고, 결과는 메모리에 있는 컬렉션에서 온 부서와 결합된다.
Listing 10은 데이터베이스 쿼리의 결과를 인-메모리 컬렉션과 결합하는 pureQuery 코드 샘플이다.
Listing 9. 인라인-메소드 스타일
// get jdbc connection
// get employees from the database
Datadb = DataFactory.getData (conn);
Iterator<Employee> getEmployees = db.queryIterator ("select BIRTHDATE, BONUS, COMM,
EDLEVEL, EMPNO, FIRSTNME, HIREDATE, JOB, LASTNAME, MIDINIT, PHONENO, SALARY, SEX,
WORKDEPT from SSURANGE.EMPLOYEE", Employee.class);
// create in memory array of departments
ArrayList depts = new ArrayList();
Department d = new Department();
d.deptno = "A00";
d.deptname = "SPIFFY COMPUTER SERVICE DIV.";
depts.add(d);
Data qocData = DataFactory.getData();
// call the pureQuery API to join employees from the database with in-memory
// collection of departments
// The first parameter is the SQL like API to use for join
// The second parameter represents bean class to hold the result
// The third parameter defines the Employee bean
// The fourth parameter defines the Department class
Iterator<InMemResult> result = qocData.queryIterator (
"select e.FIRSTNME, d.deptname from ?1.com.ss.Employee as e,
?2.com.ss.Department as d where e.workdept=d.deptno",
InMemResult.class, getEmployees, depts );
// print result
SampleUtil.printAll(result);
|
Listing 10. 결과를 갖고 있는 빈
package com.inmem;
/**************************************************************
*A bean that represents the result of join between in-memory collection of
* departments with employees from the database
*
**************************************************************/
import com.ibm.pdq.annotation.Table;
import com.ibm.pdq.annotation.Id;
import java.sql.Date;
import java.math.BigDecimal;
public class InMemResult {
// Class variables
@Id
public String deptname;
public String firstnme;
}
|
다음 기술자료에서 보다 자세하게 다루도록 하겠다.
10배의 생산성 향상
pureQuery 툴이 생기기 전에, 개발자들은 자바용 다양한 툴과 SQL을 조율하여 데이터베이스 애플리케이션 개발 작업을 수행해야 했다. 이 과정은 시간이 많이 들고, 에러가 생기기 쉬웠으며, 결국 애플리케이션 개발 비용도 늘어나게 되었다.
이 글에서는, pureQuery 툴의 특징을 살펴보았으며, 개발자의 생산성을 높이고 SQL과 자바를 통합하는 10개의 고유한 기능에 대해 논했다. 또한, 신속한 데이터베이스 애플리케이션 개발에 쓰이는 pureQuery 툴에 대해서도 알아보았다.
이 글에서는 다음과 같은 기능을 설명했다:
- pureQuery 지원 추가
- SQL 밸리데이션
- SQL 콘텐트 어시스트
- SQL 실행하기
- 데이터베이스 익스플로러에서의 SQL 신택스 하이라이팅과 오픈 정의
- 데이터베이스의 pureQuery bottom up 시나리오
- SQL이 pureQuery bottom up 시나리오
- pureQuery meet-in-the-middle 시나리오
- pureQuery 정적 SQL 시나리오
- pureQuery 컬렉션을 통한 쿼리 시나리오
본 시리즈의 나머지 기술자료에서는 각 기능을 자세히 살펴보고, 이러한 기능이 어떻게 10배의 생산성 향상 효과를 가져오는지를 증명해 보이겠다. .
요약과 예고
pureQuery는 데이터베이스용 자바 애플리케이션 개발의 생산성을 크게 높일 수 있다.
표 1에, pureQuery 스타일에 대한 기능 지원을 요약했다 :
표 1. pureQuery 스타일에 대한 기능 지원
|
기능
|
주석-메소드 스타일
|
인라인-메소드 스타일
| | pureQuery 정적 SQL | Yes | No | | pureQuery XML 시나리오 | Yes | No | | 코드 생성 합병 | Yes | No | | 다른 모든 기능들 | Yes | Yes |
표 2는 데이터베이스 플랫폼에 대한 기능 지원을 요약한 것이다:
표 2. 데이터베이스 플랫폼 당 기능 지원
|
기능
|
DB2
|
IDS
|
zSeries
|
iSeries
| | pureQuery 정적 SQL | Yes | No | Yes | Yes | | 다른 모든 기능들 | Yes | Yes | Yes | Yes |
다음 글에서는, pureQuery가 SQL의 유효성 검사를 수행하는 방식과, 자바 에디터 내에서 타이핑 할 때 pureQuery가 SQL 에러를 보고하는 방법을 다양한 예제를 통해 설명하겠다.
Part 3도 기대하라. pureQuery의 신속한 애플리케이션 개발에 초점을 맞춰 설명하겠다.
감사의 말
pureQuery 팀 (Silicon Valley Lab, San Jose, California)
기술, 아키텍처, 리더쉽 - Stephen Brodsky
리더쉽 - Steven Sit, Dinesh Nirmal, Audrey Wang, Swaminathan Gounder
툴 개발 - Becky Nin, Azadeh Ahadian
툴 품질 보증 - Shahneela Rahman, Mark Hager, and Mi Wan
정보 개발 - Robert Heath, Ellen Livingood
런타임 - Bill Bireley, Anshul Dawra, Daya Vivek, Suavi Demir, Jaijeet Chakravorty, Delmar Blevins, Christopher M Ferrar, Heather Lamb, and Christina Davis
런타임 품질 보증 - Brandon Wirick, Victoria Rabern
이 글을 검토해 준 Audrey, Robert, Becky, Mario Ds Briggs, Rafael Coss 에게 특별한 감사의 말을 전한다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| pureQuery를 이용한 SQL 스크린 캡쳐 비디오 | JLinQ_staticSQL.zip | 7MB | HTTP |
|---|
| pdq.properties 파일 샘플 | pdq.zip | 1KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Sonali Surange는 IBM 실리콘밸리 연구소(San Jose, California) 내 Data Server Tooling 부서에서 pureQuery 툴 팀을 이끌고 있다. IBM pureQuery 팀에 합류하기 전에, Visual Studio .Net을 담당했다. 그 이전에는 Informix SOA 솔루션을 주도했으며, Object Relational 매핑 툴 개발을 이끌었다. |
기사에 대한 평가
|  |