Java™ 응용프로그램을
pureQuery 클라이언트 최적화로 사용하면 응용프로그램 보안, 유지보수성
및 성능이 개선될 수 있습니다.
pureQuery 클라이언트 최적화 사용의 중요 장점은
동적 SQL 실행에서 정적 SQL 실행으로 응용프로그램을 변환하는
기능입니다.
pureQuery 클라이언트 최적화의 다른 장점은
다음과 같습니다.
- SQL문의 응용프로그램 소스 코드를 역추적하는 기능에 대한
문제 진단
- 성능이 좋지 않은 SQL문을 최적화된 명령문으로 대체
- 제한된 SQL문 세트를 실행하여 SQL 주입 공격 위험
줄이기
pureQuery 클라이언트 최적화로 데이터베이스 관리자는
조직의 기존 스킬을 사용하여 응용프로그램을 관리할 수 있습니다.
다음 섹션은 pureQuery 클라이언트 최적화 및 SQL문을 다음 영역에서
정적으로 실행하는 장점에 대해 설명합니다.
기능 및 장점 요약
다음 목록은
pureQuery 클라이언트 최적화로 사용 가능한 기능을
요약한 것입니다.
- 개발 프레임워크 독립
- 도구 통합(Optim™ 제품과)
- SQL문 검색
- 수행상태가 좋지 않은 SQL 식별(기타 Optim 제품에 대해
작업할 때)
- SQL 성능 데이터 캡처(기타 Optim 제품에 대해
작업할 때)
- SQL문의 데이터 유형 정보 캡처
- SQL문의 동적 또는 정적 실행 선택
- 이전에 캡처한 SQL만 실행
- SQL 리터럴을 SQL 매개변수 표시문자로 대체하는 기능
- SQL문 대체
다음 목록은
SQL문을 정적으로 실행하는 경우의 장점을 요약한 것입니다.
- 일관성 있는 SQL 성능
- 예측 가능한 SQL 액세스 플랜
- SQL 실행 시의 개선된 데이터베이스 보안
- 감소된 네트워크 트래픽
- 런타임 PREPARE 및 DESCRIBE문 제거
- SQL문 검색
- SQL 실행 트래킹
- DB2® Explain 지원
- 수행 상태가 좋지 않은 SQL 식별 기능
- 실행별 오류 정보
개발 프로세스 장점
응용프로그램을
탄력적인 환경에서 개발, 테스트 및 전개할 수 있습니다.
장점은 다음과
같습니다.
- 개발 중 프레임워크 선택
- 응용프로그램 개발자가 데이터 액세스에 사용하는 Java
응용프로그램 개발에 대해 여러 기술이 사용 가능합니다. pureQuery 클라이언트
최적화는 프레임워크와 함께 작동하며 응용프로그램 개발에 대한 특정
프레임워크를 선택하는 데 있어서 제한이 없습니다.
예를 들어,
Spring, iBatis 및 JPA(Java Persistence
Architecture)와 같은 프레임워크를 개발 시 사용할 수 있습니다. pureQuery
클라이언트 최적화는 JDBC 드라이버에서 작동하며 위에 있는 응용프로그램 논리 계층의
영향을 받지 않습니다. 개발자는 동적
SQL을 사용하는 응용프로그램을 계속해서 개발할 수 있으며 정적 SQL 및 전개
고려사항의 시맨틱에 대해 걱정할 필요가 없습니다.
pureQuery
클라이언트 최적화는 개발 단계보다는 구성 단계에
해당합니다. 통합된 응용프로그램 테스트 중 pureQuery 클라이언트 최적화를
사용해야 합니다. 테스트 중 SQL문을 캡처하면
대부분의 SQL문이 캡처되고 정적으로 실행하도록 변환되어 SQL을 정적으로
실행하는 경우의 혜택을 최대한 얻을 수 있습니다.
pureQueryXML
파일은 SQL문을 포함하며
pureQuery 클라이언트 최적화로 사용된 응용프로그램에서 사용될 수
있습니다. 다음 자원 중 하나로 pureQueryXML 파일을 작성할 수
있습니다.
- JPA 응용프로그램 XML 파일: IBM® JPA
구현을 사용하는 경우 wsdb2gen 유틸리티를 사용하여 지속 단위에
사용된 SQL문을 포함하는 XML 파일을 생성할 수
있습니다.
wsdb2gen 유틸리티로
생성된 파일은 pureQuery 클라이언트 최적화와 호환 가능합니다. 선택적으로
이 파일을 사용하여 pureQuery 클라이언트 최적화로 사용된 응용프로그램의
추가 SQL문을 캡처할 수 있습니다. wsdb2gen 유틸리티로
작성된 SQL문 및 pureQuery
Runtime으로 캡처된 추가 SQL문이 파일에 포함됩니다. pureQuery Configure 및 StaticBinder
유틸리티와 함께 파일을 사용하여 SQL문이 포함된 DB2
패키지를 작성하여 데이터베이스에 패키지를 바인드합니다.
- SQL 텍스트 파일: 일부 응용프로그램은 응용프로그램에 사용되는
SQL문을 텍스트 파일로 분리하고 응용프로그램 논리를 사용하여
파일을 처리합니다. 텍스트 파일에는 세미콜론(;)과 같은 구분자로 구분된
SQL문이 포함되어 있습니다. pureQuery
GeneratePureQueryXml 유틸리티를 사용하여 텍스트 파일에서 pureQueryXML 파일을
생성할 수 있습니다.
GeneratePureQueryXml 유틸리티로
pureQueryXML 파일을 작성한 후 pureQuery Runtime과 함께 파일을 사용하여
추가 SQL문을 캡처하거나, pureQuery Configure 및 StaticBinder 유틸리티와 함께
파일을 사용하여 SQL문이 포함된 DB2 패키지를
작성하여 데이터베이스에 그 패키지를 바인드할 수 있습니다.
- 동적 또는 정적 SQL 실행 선택
- 응용프로그램이 pureQuery 클라이언트 최적화로 사용되면
응용프로그램이 실행하는 SQL문 중 어느 SQL문이 정적 및 동적으로 실행되는지
지정할 수 있습니다. 예를 들어,
가장 중요한 SQL문을 정적으로 실행하고 다른 SQL문은 동적으로 실행하도록
선택할 수 있습니다.
개발자는
SQL을 정적으로 실행하도록 응용프로그램을 변환하는 데 필요한 전개 단계나
정적 SQL 실행에 영향을 미치는 데이터베이스 아티팩트의 세부사항을
이해하거나 알고 있지 않아도 됩니다. 개발자는
익숙한 프레임워크를 기반으로 하여 SQL을 동적으로 실행하는 응용프로그램을
개발할 수 있습니다. 개발자는 응용프로그램의
비즈니스 로직 및 응용프로그램의 기능적 특성에 초점을 맞출 수 있습니다. 데이터베이스
관리자는 응용프로그램에 사용되는
SQL문의 전개 및 최적화에 집중할 수 있습니다.
SQL을 정적으로 실행할 때
pureQuery 클라이언트 최적화는 DB2
데이터베이스 서버에서 정적 SQL의 패키지 버전화 기능을 사용할 수
있습니다. 정적 SQL 실행은
새 응용프로그램 코드 및 DB2 액세스
플랜 변경사항의 동시 실행과 함께 승격된 롤아웃을
허용합니다. 패키지 버전화를 통해서는 기존 DB2
패키지를 저장하고 새 패키지를 작성할 수 있습니다. 패키지 버전을 사용하여
부정적 영향을 미치는 변경사항이 있을 경우 명확하고 단순한 폴백(fallback) 프로시저를
작성할 수 있습니다.
JDBC 기반 동적
SQL 응용프로그램에는 DB2 액세스 플랜
변경사항에 대한 폴백 프로시저가 없습니다. SQL을 정적으로 실행할 때
패키지 버전화를 사용하여 이전에 생성된 액세스 플랜으로 SQL을
실행할 수 있습니다.
주: pureQuery 클라이언트 최적화에 사용 가능한
응용프로그램에서 SQL을 정적으로 실행하려면
응용프로그램을 프로덕션 환경으로 이주하기 전에 테스트 단계에서 완료된 응용프로그램에
대해 구성 및 바인드 단계를 수행하는 것이 좋습니다. 테스트 단계에서
단계를 수행하면 SQL문을 정적으로 전개하고 실행하는 프로세스를
광범위하게 테스트하고 검증할 수 있습니다. purQuery 클라이언트 최적화 사용 단계에 대한
정보는
pureQuery 클라이언트 최적화 사용을 위한 단계를 참조하십시오.
- 도구 통합
- pureQuery 클라이언트 최적화는 Optim Development
Studio와 통합됩니다. pureQuery를
Java 프로젝트에 사용할 수
있습니다. Optim Development Studio는
응용프로그램 및 연관된 패키지를 보다 통찰할 수 있는 여러 유용한 보기를
제공합니다.
튜닝 및 문제점 판별
장점
pureQuery Runtime은
정상적으로 실행된 SQL문과 SQL 매개변수 정보 및 결과 세트 정보와 같은
관련 정보를 캡처합니다. pureQuery Runtime으로 캡처된 SQL문을 조정하고
pureQuery Runtime으로 캡처된 정보를 사용하여 문제의 원인을 판별할 수
있습니다.
장점은 다음과 같습니다.
- 캡처한 SQL문의 유형 매개변수 및 결과 세트 메타데이터
- SQL문이 동적으로 실행되면 JDBC 드라이버에서 준비되고
설명됩니다. 이 조치는 SQL문 구문 및 시맨틱 유효성을
보장합니다. 또한 목표 데이터베이스 컬럼에 대해 매개변수와 결과 컬럼의
유형, 길이, CCSID 및 기타 속성을
검사합니다. 정적 SQL 실행에서는
동적 SQL 실행의 런타임 대신 프로그램 준비 시간에 한번만 유형을
검사합니다.
캡처 프로세스 중 pureQuery
Runtime은 JDBC 드라이버에 대한 호출을 인터셉트하고 정보를 캡처합니다.
SQL문은 정상적으로 실행되는 경우에만 캡처됩니다.
SQL문이 데이터베이스에
대해 정상적으로 실행되었기 때문에 pureQuery로
캡처된 SQL에서 패키지를 작성하고 데이터베이스에 패키지를
바인드하는 프로세스는 무리없이 진행될 수 있습니다.
자료형 정보를 사용하여 바인드 프로세스에서 액세스 경로에 대한 적절한
인덱스를 선택할 수도 있습니다.
- 정적으로 실행된 SQL문의 패키지 레벨 어카운팅 및
스냅샷 정보
- 패키지 레벨 어카운팅 정보는 Linux®, UNIX®
및 Windows®용 DB2와
z/OS®용 DB2 모두에서
사용 가능합니다. Linux, UNIX
및 Windows용 DB2에서는
패키지 스냅샷에 정보가 있고 z/OS용
DB2에서는 어카운팅 보고서에 정보가
있습니다.
패키지 레벨 성능 정보로 데이터베이스 관리자는
응용프로그램 레벨 추적 없이 문제가 되는 응용프로그램의 특정 섹션을
식별할 수 있습니다. 패키지 레벨 성능 정보는
가장 빈번하게 실행되는 코드 섹션 및 상세 튜닝 분석을 위해 초점을 맞춰야 하는
코드 섹션을 식별할 때에도 유용합니다.
동적 환경에서는 응용프로그램의 임베디드(embedded) 사용자 고유 추적을
정의하지 않고 코드 섹션을 식별하기가 어려울 수
있습니다.
pureQuery Runtime은 응용프로그램에서 스택 추적도
캡처합니다. 데이터베이스 관리자는 스택 추적을 사용하고
개발자와 협력하여 문제의 원인을 진단할 수 있습니다.
- SQL문 검색
- 데이터베이스 관리자는 이후의 튜닝을 위해 여러 방식으로 개별
SQL문을 검색할 수 있습니다. SQL을 동적으로 실행하는
응용프로그램의 SQL문을 캡처하려면 SQL 추적을 사용하거나 캐시에 포함된 정보를
검색하거나, SQL문을 DB2 EXPLAIN과 함께
사용하고 동적으로 실행해야 합니다. 반대로,
정적 SQL문은 사전 정의되어 있으며 명령문에 대한 정보를 쉽게 검색할 수
있습니다. SQL문은 DB2
카탈로그 테이블에 캡처 및 보존되고 액세스 플랜은 DB2
Explain 테이블에 미리 캡처될 수 있습니다. 카탈로그 및
Explain 테이블을 쿼리하면 문제가 되는 SQL문 및 이와 연관된 액세스 플랜을
검색할 수 있습니다.
- DB2 EXPLAIN 기능
Optim Development Studio에서
개발 시 Visual Explain을 사용하거나 pureQuery StaticBinder 유틸리티를 실행할 때
바인드 옵션 EXPLAIN YES를 사용하여 SQL문의 성능 특성을
수집할 수 있습니다.
바인드 옵션
EXPLAIN YES를 사용하여 데이터베이스 관리자는 DB2
옵티마이저가 수행한 액세스 경로 의사결정을 검토할 수 있습니다.
관리자는 액세스 경로 선택사항을 개선시키기 위해 수집할 데이터 통계를
판별할 수 있습니다. 기타 도구도
Explain 테이블 내에서 SQL문을 분석하고 테이블의 컨텐츠에 기초하여 튜닝 권장사항을
작성하는 데 유용할 수 있습니다. 액세스 플랜 분석 및 튜닝은
프로그램 준비 시간에 수행되며 사전 정의된 액세스 플랜은
정적으로 실행될 SQL문에 대해 작성되는 패키지와 함께 포함될 수
있습니다. SQL을 동적으로 실행할 때에는 액세스 플랜을 사전 정의할 수
없습니다.
- DB2 오류 메시지
- DB2 데이터베이스를 사용하는 경우
SQL이 동적으로 실행될 때 잠금 시간종료, 교착 상태 및 자원 사용 불가능 오류와 같은
오류 메시지에 종종 패키지 이름이 포함됩니다.
데이터베이스 관리자는 패키지 정보를 사용하여 응용프로그램 모듈로 오류를
링크해서 오류를 유발하거나 오류의 영향을 받는 SQL문을 식별할 수
있습니다.
z/OS용
DB2 오류 메시지에는 실행 중인 패키지에 대한 정보가
포함됩니다. 이 오류 메시지는
위치, 패키지 이름 및 일관성 토큰에 대한 정보를 포함합니다. 응용프로그램 소스를
빠르게 식별하는 데 이 정보를 사용할 수 있습니다. SQL문이
동적으로 실행될 때 생성되는 유사한 오류 메시지는 이
SQL을 발행한 응용프로그램에 대한 정보를 제공하지 않습니다. 모든 SQL문은 동일한 JDBC
패키지를 통과합니다.
Linux, UNIX
및 Windows용 DB2에서
db2deadlock 이벤트 모니터와 같은 도구는 정적 SQL문과 함께 사용되면
교착 상태 이벤트에 대한 패키지 이름 및 섹션 번호 정보 외에 교착 상태에
관련된 특정 잠금 자원을 제공합니다.
DB2 db2evmon 도구로 이 정보를 표시할 수 있습니다.
- 응용프로그램 스택 추적
- 응용프로그램의 Java 코드에 대한
액세스가 있으면 pureQuery Runtime으로 캡처한 스택 추적 정보를 사용하여
SQL문을 Java 소스 코드의 위치와 연관시킬
수 있습니다. pureQuery
Runtime은 스택 추적 정보를 SQL문과 함께 pureQueryXML 파일에
저장합니다. Optim Development
Studio의 경우 스택 추적 정보를 사용하여 명령문을 발행한 Java
코드를 찾을 수 있습니다.
운영상의 장점
pureQuery 클라이언트 최적화에 사용 가능한 응용프로그램이 SQL문을 정적으로 실행하면 프로그램 실행 전에
데이터베이스에 SQL문이 제공됩니다. SQL문을 식별하면
데이터베이스 관리자가 전체 튜닝 도구 세트를 재량껏 사용할 수 있어서
SQL문을 식별하기 위해 온라인 추적이 필요하지 않습니다.
운영상의 장점은
다음과 같습니다.
- SQL문을 정적으로 실행할 때의 보안 모델
- SQL 정적 실행 모델에서는 런타임에 사용되는 권한 부여 ID에
기본 데이터베이스 오브젝트에 대한 액세스가 없어도 됩니다.
동적 JDBC 구현에서처럼 기본 데이터베이스 오브젝트에 대한 액세스를 부여하는 대신
특정 사전 정의된 패키지와 포함된 SQL문에 대한 액세스가 런타임 권한 부여
ID에 제공됩니다.
패키지 권한 부여로
권한 부여 ID로 프로그래밍 로직을 사용하여 SQL문을 변경할 수 없기 때문에
보안 구현을 개선할 수 있습니다. 또한
보안 위반으로 인해 대체 액세스 메커니즘으로부터 연결하는 데 ID가 사용되면
이 ID는 SQL을 동적으로 실행할 수 없습니다. 패키지 권한 부여는
테이블 세트에 대해 실행될 모든 SQL문에 대한 엄격한 감사를 가능하게
합니다.
정적 모델에서는,
기본 테이블에 액세스할 권한이 있는 사용자가 패키지를 바인드하고
패키지 소유자가 됩니다. 그러면 패키지 소유자는
런타임 환경 권한 부여 ID(예를 들어, WebSphere® Application Server
데이터 소스 정의 내에 저장된 사용자 ID)에 패키지를 실행할 권한을 부여할 수
있습니다. WebSphere
사용자 ID는 패키지에 정의된 SQL문 외부의 데이터베이스 오브젝트에 대해서는 기타
SQL을 동적으로 실행할 수 없습니다.
이와 반대로,
동적 SQL 환경에서는 응용프로그램 서버(AS)에 연결된 사용자를 대신하여
모든 데이터 액세스에 사용자 ID가 사용됩니다.
이 사용자 ID는 응용프로그램 서버(AS) 환경 외부의 데이터베이스에 대해
SQL을 동적으로 실행할 수 있습니다.
- SQL 리터럴 대체
- pureQuery Runtime에는 응용프로그램이 매개변수화된 SQL문으로 실행하는
매개변수로 사용 불가한 SQL문을 변환할 수 있는
SQL 리터럴 대체 기능이 있습니다. 이 기능은
런타임 중 상황에 따라 SQL문을 생성하는 응용프로그램에
유용합니다. 또한 동적으로 실행되는 SQL문의 경우에는, SQL
리터럴 대체가 서버 동적 캐시의 총 SQL문 수를 감소시키고 이로 인해
명령문의 캐시 히트 비율이 늘어납니다.
- 캡처 전용 SQL을 실행하는 기능
- pureQuery 클라이언트 최적화에는 캡처한 SQL문만 실행하는 기능이
있습니다. 이 기능은 SQL문이 동적으로 실행되는 경우에도
데이터베이스 관리자가 승인했으며 pureQueryXML 파일에 있는 명령문에 응용프로그램이
실행할 수 있는 명령문을 제한합니다. 캡처한 SQL만 실행하면 응용프로그램의
보안이 개선됩니다. 이 기능은
정적 SQL을 지원하지 않는 환경에서 유용합니다. 이 기능은 SQL 주입 공격을
차단할 때 유용할 수 있습니다.
pureQuery 클라이언트 최적화는
정적으로 실행할 수 있는 명령문으로 SQL문의 실행을 제한할 수도 있습니다.
- SQL문 대체
- 기존 JDBC 응용프로그램에 pureQuery 클라이언트 최적화를 사용하면
실행된 SQL을 최적화된 해당 SQL로 간편하게 대체할 수
있습니다. 데이터베이스 관리자는 응용프로그램을 수정하지 않고도 성능이 좋지 않은
명령문을 최적화된 SQL문으로 대체할 수 있습니다.
대체된
SQL문에는 더 나은 인덱스 선택 빈도를 위한 추가 WHERE절과 같은 변경사항이
포함될 수 있습니다. 메타데이터가 이미 캡처되었기 때문에 대체된 SQL문은
매개변수나 결과 컬럼을 추가할 수 없습니다.
성능 장점
운영, 튜닝 및
개발 장점 외에 정적
SQL 실행은 성능을 향상시킬 수 있습니다.
성능 조정상의 장점은
다음과 같습니다.
- 런타임 PREPARE 및 DESCRIBE 제거
정적 SQL 실행에서는 런타임 환경 전에 명령문 준비가 발생하며 한번만
발생합니다. 결과적으로
준비 및 설명 활동은 동적 SQL 실행으로 반복될 때 각 트랜잭션의
SQL문에 대해 반복되지 않습니다.
정적 SQL 실행은 준비가 발생하는 데이터베이스 서버와
PreparedStatement 오브젝트가 작성되는 응용프로그램 서버(AS) 모두에서 CPU 소모를
줄입니다.
JDBC 환경에서,
SQL 캐시 히트를 개선하여 이러한 PREPARE문의 비용을 줄이려 시도할 수
있습니다. 하지만 캐싱 구현은
100% 히트 비율을 보장하지 않습니다.
- 감소된 네트워크 플로우
- 각 SQL문을 준비할 필요없이 네트워크에서 각 명령문에 대해
준비 및 설명 활동을 플로우하지 않아도
됩니다. 따라서 네트워크 트래픽 및 트랜잭션 경과 시간이 모두
줄어듭니다.
- 예측 가능한 액세스 경로 선택
- SQL문 액세스 플랜은 미리 작성되며 실행 시에는 작성되지
않습니다. RUNSTATS 실행 및 데이터 분산의 변형으로 인해
액세스 경로가 변경되지는 않습니다. 테스트한 응용프로그램은
동일한 SQL문을 반복해서 실행할 수 있으며 선택된 액세스 경로는
데이터 변형이나 데이터베이스 유지보수로 인해 변경되지 않습니다.