Spring Boot - p6spy

JeongHoHyun·2024년 6월 20일

Spring Boot

목록 보기
1/7
post-thumbnail

✏️ p6spy란?

p6spy란 Java 애플리케이션에서 JDBC 호출을 가로채 데이터베이스와의 모든 상호작용을 모니터링 하고 로그로 기록하는 기능을 제공하며, 데이터베이스 쿼리 실행에 관련된 세부 정보를 실시간으로 분석 할 수 있게 해주는 라이브러리이다. 이를 통해 개발자는 애플리케이션의 성능 최적화, 디버깅, SQL 쿼리 분석 등에 유용하게 활용할 수 있다.

✏️ p6spy의 주요 기능

  • SQL 쿼리 로깅 : 애플리케이션에서 실행되는 모든 SQL 쿼리와 해당 쿼리의 실행시간, 결과 등을 로그로 출력한다. 이를 통해 성능 분석이나 퀴리 최적화에 필요한 데이터를 제공한다.
  • 실행 시간 측정 : 각 SQL 쿼리의 실행에 걸리는 시간을 측정하고 로그에 기록한다. 이 정보는 성능 문제를 진단하는 데 중요한 역할을 한다.
  • 실시간 성능 모니터링 : 데이터베이스와의 상호작용을 실시간으로 모니터링하면서 성능 저하를 일으키는 쿼리를 식별할 수 있다.
  • 커스터마이즈 가능한 로그 포맷 : 사용자는 'spy.properties' 파일을 통해 로그 메시지의 형식을 자유롭게 정의하고 조정할 수 있다. 이를 통해 로그의 상세도와 포맷을 개발자의 요구에 맞게 설정 할 수 있다.
  • 투명한 통합 : p6spy는 애플리케이션의 기존 코드를 변경하지 않고도 쉽게 통합할 수 있으며, JDBC 드라이버 앞에 '프록시'로 작동하여 JDBC 호출을 가로챈다.

✏️ 사용방법

  • 1. 의존성 추가

    • 'build.gradle' 파일에 p6spy 의존성을 추가하여 JDBC 호출을 가로채고 로그에 SQL쿼리를 출력할 수 있도록 한다.
dependencies {
    // 기존 의존성들...

    // P6Spy 의존성 추가
    implementation 'p6spy:p6spy:3.10.1'

    // 사용 중인 데이터베이스 JDBC 드라이버 (예: MySQL)
    runtimeOnly 'mysql:mysql-connector-java'
}
  • 2. application.yml 설정 수정

    • 'application.yml' 파일에서 데이터베이스 연결 정보를 수정하여 p6spy를 사용하도록 설정한다. p6spy를 사용함으로써, 모든 JDBC 호출은 p6spy에 의해 가로채져 로그로 기록된다.
    • 여기서 url의 앞부분을 조심해야 한다. (jdbc:p6spy:mysql://~~)
spring:
  datasource:
    url: jdbc:p6spy:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
    username: root
    password: your_password
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
  • 3. p6spy 설정 파일 추가(spy.properties)

    • 'src/main/resource' 디렉토리 안에 'spy.properties' 파일을 추가하고 p6spy의 로깅 방식을 설정한다.
    • 여기서 루트 디렉토리는 spring설정에 따라 바뀔 수 있다.
    • spy.properties 설정예시
      appender=com.p6spy.engine.spy.appender.StdoutLogger
      logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
      customLogMessageFormat=%(sqlSingleLine)
  • 3-1. 출력 포맷의 추가 조정

    • p6spy의 'CustomLineFormat'을 사용하면, 다양한 변수를 조합하여 로그 메시지를 정의할 수 있다. 사용 가능한 변수는 다음과 같다.

      • %(currentTime) : 현재 시간
      • %(executionTime) : 쿼리 실행 시간
      • %(category) : 로그 범주 ('statment', 'resultset' 등)
      • %(effectiveSql) : '{}' 내의 실제 SQL
      • %(effectiveSqlSingleLine) : 실제 SQL을 단일 줄로 표시
      • %(sql) : 완전한 SQL 쿼리
      • %(sqlSingleLine) : 단일 줄로 표시된 SQL 쿼리
      #spy.properties에 적용한다.
      # 단순 SQL 로그 (쿼리와 실행시간)
      customLogMessageFormat=%(sqlSingleLine)|Execution Time: %(executionTime) ms
      
      # 상세 로그 (쿼리, 실행시간, 카테고리, 연결 ID)
      customLogMessageFormat=Time: %(currentTime)|Exec: %(executionTime) ms|Cat: %(category)|Conn: %(connectionId)|SQL: %(sqlSingleLine)
profile
Java Back-End 2022.11.01 💻~ing

0개의 댓글