애플리케이션의 데이터베이스 작업을 최적화하기 위해서는 성능 병목 현상을 감지하는 과정이 꼭 필요합니다. 애플리케이션의 데이터베이스 작업을 추적하는 것도 한 가지 방법입니다. 이 정보는 애플리케이션의 데이터베이스 호출을 미세 조정하는 데 도움이 되며 이를 통해 애플리케이션의 성능을 높일 수 있습니다. 이 테크팁에서는 P6Spy라는 도구를 사용하여 GlassFish v2 애플리케이션 서버로 실행되는 애플리케이션에서 발행된 데이터베이스 요청을 추적하는 방법에 대해 설명합니다. 특히 GlassFish의 JDBC 연결 풀을 사용하는 애플리케이션의 SQL 문을 추적하는 방법을 알아보겠습니다.

P6Spy는 자바 데이터베이스 연결성(JDBC)을 사용하는 애플리케이션의 모든 데이터베이스 문을 가로채서 기록하는 오픈소스 자바 도구입니다. 규격에 맞는 모든 JDBC 드라이버와 함께 이 도구를 사용할 수 있습니다. 사실 P6Spy 자체는 JDBC 규격 드라이버의 래퍼 역할을 하는 JDBC 규격의 드라이버입니다. 이 도구는 GlassFish 등 다양한 애플리케이션 서버 및 Oracle, DB2, SQL Server, MySQL, Java DB 등 다양한 데이터베이스와 함께 사용할 수 있습니다. 특히 GlassFish와 완벽하게 통합되므로 다른 소스 코드를 추가하거나 변경할 필요가 없습니다. 또한 이 도구는 구성의 범위가 넓으며 필요할 때만 작동시킬 수도 있습니다.


P6Spy와 GlassFish 사용

이 테크팁에서는 GlassFish v2로 실행되는 애플리케이션의 JDBC 기반 데이터베이스 호출을 P6Spy로 추적해 보겠습니다. 애플리케이션으로는 NetBeans IDE에서 샘플 프로젝트로 제공하는 CustomerCMP를 사용하겠습니다. 이 애플리케이션은 자바 DB 데이터베이스를 사용합니다. 또 JDBC 연결 풀도 사용합니다.


다운로드 및 구성

다음 도구가 설치되어 있지 않으면 이를 다운로드하여 설치합니다.

GlassFish를 시작합니다.

이제 P6Spy를 GlassFish와 함께 사용할 수 있도록 구성해야 합니다. 다음과 같이 하십시오.

  • GlassFish v2 설치 디렉토리 아래에 p6spy라는 디렉토리를 만듭니다. 예를 들어, GlassFish v2를 C:\Sun\AppServer에 설치했다면 C:\Sun\AppServer\p6spy 디렉토리를 만듭니다.
  • spy.properties 파일을 P6Spy 설치 디렉토리에서 방금 만든 p6spy 디렉토리로 복사합니다. spy.properties 파일은 P6Spy 드라이버의 여러 가지 기능을 제어하는 데 사용됩니다. 예를 들어 spy.properties 파일의 logfile 등록 정보는 P6Spy가 SQL 문을 기록할 파일의 이름을 지정합니다. 기본적으로 이 파일의 이름은 spy.log이지만 사용자가 파일 이름을 변경할 수도 있습니다.
  • spy.properties 파일에 지정된 모든 realdriver 등록 정보를 주석 처리합니다. realdriver 등록 정보는 P6Spy와 연동되는 데이터베이스 드라이버의 이름을 지정합니다. GlassFish는 P6Spy 연결 풀의 realDataSource 등록 정보에 정의된 데이터소스를 사용하기 때문에 이렇게 주석 처리해야 합니다.
  • GlassFish 클래스 경로에 p6spy.jar 파일의 위치와 spy.properties에 대한 경로를 추가합니다. 즉, GlassFish domain.xml 파일의 <java-config classpath-prefix> 요소에 추가하면 됩니다. 다음과 같이 GlassFish Admin Console을 사용하십시오.
    • Admin Console에 로그인합니다.
    • 왼쪽 탐색 표시줄에서 Admin Server를 선택합니다. 그러면 Application Server 페이지가 표시됩니다.
    • JVM Settings 탭과 Path Settings 탭을 차례로 선택합니다.
    • Classpath Prefix 입력란에 p6spy.jar 파일의 위치와 spy.properties의 경로를 입력합니다. 그림 1의 예제를 참조하십시오.
       
      사용자 삽입 이미지

      그림 1. GlassFish의 클래스 경로에 p6spy.jar 파일 위치 및 spy.properties 경로 추가

    • Save 버튼을 클릭합니다.

GlassFish를 다시 시작합니다.


JDBC 연결 풀과 리소스 작성

P6Spy를 GlassFish와 함께 사용하려면 JDBC 리소스 및 P6Spy 기반의 연결 풀을 작성해야 합니다. GlassFish v2에는 여러 가지 데이터베이스 및 JDBC 드라이버용 연결 풀과 리소스를 작성하기 위한 템플릿이 있어 이 작업을 간단히 해결할 수 있습니다. 템플릿은 GlassFish v2 설치 디렉토리 아래의 lib/install/templates/resources/jdbc 디렉토리에 들어 있습니다. 예를 들어, 자바 DB 유형 4 드라이버용 템플릿은 javadb_type4_datasource.xml입니다. 템플릿을 사용하려면 user, password, databaseName, serverName과 같이 적절한 등록 정보 값을 지정해 주면 됩니다.

일을 더 간단히 하려면 이 팁이 미리 적용된 p6spy_datasource.xml 파일을 다운로드하여 사용하면 됩니다. p6spy_datasource.xml 파일은 javadb_type4_datasource.xml 템플릿을 기반으로 하며 P6Spy 연결 풀과 자바 DB(Derby) 데이터 소스를 지정합니다. p6spy_datasource.xml 파일을 사용하여 연결 풀과 리소스를 작성하려면 명령행에서 다음 명령을 입력합니다.

   GF_INSTALL/bin/asadmin add-resources p6spy_datasource.xml_path

여기서 GF_INSTALL은 GlassFish를 설치한 디렉토리이고 p6spy_datasource.xml_pathp6spy_datasource.xml 파일의 전체 경로입니다.

또는 다음과 같이 Admin Console을 사용하여 JDBC 리소스와 연결 풀을 작성하는 방법도 있습니다.

  • 왼쪽 탐색 표시줄에서 Resources를 선택합니다. 그러면 Resources 페이지가 표시됩니다.
  • JDBC와 JDBC Resources를 차례로 선택합니다. 그러면 JDBC Resources 페이지가 표시됩니다.
  • JDBC Resources 페이지에서 New 버튼을 클릭합니다. 그러면 New JDBC Resources 페이지가 표시됩니다.
  • JNDI 이름 필드에 jdbc/p6spy-resource와 같이 리소스 이름을 입력합니다.
  • Pool Name 드롭다운 목록에서 풀 이름으로 p6spy_pool을 선택합니다.
  • OK 버튼을 클릭합니다.

이제 p6spy-resourcejdbc/__default 리소스의 데이터베이스 호출을 가로챌 수 있게 되었습니다.

다른 유형의 데이터 소스도 사용할 수 있습니다. 그러기 위해서는 p6spy 리소스의 유형을 javax.sql.DataSource로, 데이터 소스 클래스는 com.p6spy.engine.spy.P6DataSource로 유지합니다. realDataSourceName의 유형은 javax.sql.DataSource, javax.sql.ConnectionPoolDataSource 또는 javax.sql.XADataSource 등입니다.


CMP 프로젝트 작성

이 팁에서는 샘플 애플리케이션으로 CustomerCMP를 사용하며 이 애플리케이션은 자바 DB 데이터베이스와 JDBC 연결 풀을 사용한다는 사실을 잊지 마십시오. CustomerCMP 애플리케이션은 NetBeans IDE에서 샘플 프로젝트로 구할 수 있습니다. 이 애플리케이션을 사용하려면 다음과 같은 프로젝트를 작성해야 합니다.

  1. NetBeans IDE를 시작합니다.
  2. 기본 메뉴에서 New Project를 선택한 다음, Categories 목록의 Samples 아래에서 Enterprise를 선택합니다. 마지막으로 Projects 목록에서 CustomerCMP를 선택합니다. 그림 2를 참조하십시오.
     
    사용자 삽입 이미지

    그림 2. CustomerCMP 프로젝트 작성

  3. Next 버튼을 클릭합니다.
  4. 프로젝트의 위치를 지정하고 Finish 버튼을 클릭합니다.

이 애플리케이션에 P6Spy 기반의 리소스를 사용하기 위해 해야 할 또 다른 일은 persistence.xml 파일에 해당 리소스를 지정하는 것입니다. 그러기 위해서는 NetBeans Projects 목록의 CustomerCMP-ejb 아래에서 Configuration 파일을 확장합니다. 확장된 Configuration 파일 목록에 persistence.xml 파일이 있을 것입니다. persistence.xml을 열고 그림 3과 같이 <jta-data-source> 설정을 jdbc/p6spy_resource로 변경합니다.

 
사용자 삽입 이미지

그림 3. jta-data-source 설정

마지막으로 프로젝트 목록에서 마우스 오른쪽 버튼으로 CustomerCMP 프로젝트를 클릭하고 Build를 선택하여 프로젝트를 빌드합니다. 그런 다음 프로젝트 목록에서 마우스 오른쪽 버튼으로 CustomerCMP를 클릭하고 Undeploy와 Deploy를 선택하여 프로젝트를 배포합니다.


애플리케이션 실행

CustomerCMP 애플리케이션을 실행하려면 브라우저에서 http://localhost:8080/customer/로 이동합니다. 그러면 그림 4와 같은 컨텐츠가 포함된 페이지가 표시됩니다.

 
사용자 삽입 이미지

그림 4. CustomerCMP 페이지

Create New Customer 링크를 클릭하고 그림 5와 같이 새 고객의 데이터를 입력합니다. 그런 다음 Submit 버튼을 클릭합니다.

 
사용자 삽입 이미지

그림 5. 새 고객 작성

이 요청에서는 P6Spy 연결 풀을 사용하여 고객 정보를 자바 DB 데이터베이스에 보관합니다. P6Spy는 이 데이터베이스 작업에 사용된 SQL 문을 기록합니다. 이 스파이(spy) 로그 파일은 GlassFish 설치 디렉토리 아래의 domains\domain1\config 디렉토리에 들어 있습니다. 이 로그 파일에서 새 사용자인 Jagadish Prasath를 작성하기 위해 실행한 작업을 나타내는 다음과 같은 항목을 볼 수 있습니다.

   1215548015250|47|7|statement|INSERT INTO CUSTOMER (customerid, FIRSTNAME, LASTNAME) VALUES (?, ?, ?)| INSERT INTO CUSTOMER (customerid, FIRSTNAME, LASTNAME) VALUES ('1', 'Jagadish', 'Prasath')
 

사용자를 한 명 더 작성한 다음 그 사용자를 검색하여 P6Spy 로깅에 대해 보다 자세히 알아보겠습니다. 먼저 위와 같은 방법으로 새 사용자를 작성합니다. 새 사용자의 이름을 Arun Prasath로 하겠습니다. 이제 customerCMP 애플리케이션의 첫 페이지로 돌아가서 Search for Customer 링크를 클릭합니다. 검색 페이지가 나타납니다. 그림 6과 같이 이름 Prasath를 검색합니다.

 
사용자 삽입 이미지

그림 6. 고객 검색

스파이 로그 파일에 다음과 같은 항목이 추가되었습니다.

   1215549723390|15|11|statement|INSERT INTO CUSTOMER (customerid, FIRSTNAME, LASTNAME) VALUES (?, ?, ?)|INSERT INTO CUSTOMER (customerid, FIRSTNAME, LASTNAME) VALUES ('2', 'Arun', 'Prasath')
   1215549975390|125|12|statement|SELECT customerid, FIRSTNAME, LASTNAME FROM CUSTOMER WHERE (LASTNAME = CAST (? AS VARCHAR(32672) ))|SELECT customerid, FIRSTNAME, LASTNAME FROM CUSTOMER WHERE (LASTNAME = CAST ('Prasath' AS VARCHAR(32672) ))
   1215549975390|-1||resultset|SELECT customerid, FIRSTNAME, LASTNAME FROM CUSTOMER WHERE (LASTNAME = CAST ('Prasath' AS VARCHAR(32672) ))|CUSTOMERID = 1, FIRSTNAME = Jagadish, LASTNAME = Prasath
   1215549975390|-1||resultset|SELECT customerid, FIRSTNAME, LASTNAME FROM CUSTOMER WHERE (LASTNAME = CAST ('Prasath' AS VARCHAR(32672) ))|CUSTOMERID = 2, FIRSTNAME = Arun, LASTNAME = Prasath

 

P6Spy에서는 추적 대상을 융통성 있게 지정할 수 있습니다. 예를 들어, p6spy 기반의 리소스를 하나 더 작성한 다음 두 번째 데이터 소스를 추적하도록 참조함으로써 두 번째 데이터 소스를 추적할 수 있습니다. 또 spy.properties 파일에서 filter, include, exclude 등의 등록 정보에 적절한 값을 지정하여 추적할 테이블을 사용자 정의할 수도 있습니다. spy.properties 파일의 excludecategories 등록 정보를 통해 보다 상세한 기록을 요청할 수도 있습니다.

이와 함께 P6Spy 등록 정보는 동적 재구성이 가능합니다. spy.properties 파일의 reloadproperties 등록 정보를 True로 설정하고 reloadpropertiesinterval 등록 정보에 초 단위 시간을 지정하여 등록 정보를 재로드하는 시간 간격을 조정할 수 있습니다.


추가 자료


저자 정보

Jagadish Ramu는 GlassFish 애플리케이션 서버 팀에서 근무하는 엔지니어입니다. JDBC, 연결 풀, 커넥터 분야의 전문가로서 2005년 중반부터 썬 커넥터 팀과 교류해 왔습니다. Jagadish는 인도 BITS Pilani에서 기술사 학위를 받았습니다.


이 글의 영문 원본은
Using P6Spy and the GlassFish Connection Pool to Trace Database Operations
에서 보실 수 있습니다.

"Java EE" 카테고리의 다른 글

2008/08/13 18:27 2008/08/13 18:27

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/636

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 33 34 35 36 37 38 39 40 41  ... 624  Next ▶