Spring p6spy 적용하기

Chooooo·2023년 9월 7일
0

TIL

목록 보기
17/28
post-thumbnail

😎 p6spy란 ?

p6spy란 쿼리 파라미터를 로그에 남겨주고 추가적인 기능을 제공하는 외부 라이브러리이다.
스프링부트와 JPA로 프로젝트를 진행하다 보면 실제 쿼리가 어떻게 나갈지 눈으로 확인을 하고 싶을 때가 참 많다. JPA가 참 편하긴 한데 개발자가 직접 쿼리를 작성하지 않았다 보니 실제로 어떤 쿼리가 나갈지는 눈으로 확인 하기 전까지는 정확히 알기 힘들다.

내 기준에 쿼리를 꼭 확인해야 할 상황이 크게 두가지 정도가 있다.

  • 의도한대로 작동하지 않아서 쿼리가 의심될 때

  • N+1 문제가 발생하고 있는지 확인이 필요할 때
    그러다보니 항상 테스트 설정에서는 쿼리가 전부 출력되게 설정 해두고 테스트 코드들을 실행 시키고 있다.

  • 쿼리 로그를 확인하는 방법을 단계별로 개선 해 가며 알아보도록 하자.

😊 show_sql 설정

일단 간단한 설정으로 JPA에서 쿼리가 어떻게 나가는지 로그로 확인을 할 수 있다. 운영환경에서는 로그가 감당이 안되기 때문에 개발환경이나 테스트 환경에서만 설정을 하는게 좋다!!!!!

  • application.yaml
spring:
  jpa:
      show_sql: true
  • application.properties
spring.jpa.show-sql=true

이렇게만 하면 쿼리가 눈에 보이기는 정렬이 되어 있지 않아 정신이 없고, 파라미터도 보이지 않는다.

😊 format_sql 옵션

  • application.yaml
spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  • application.properties
spring.jpa.properties.hibernate.format_sql=true

이후 로그를 확인해 보면 깔끔하게 쿼리가 정렬 되어서 무엇을 하는 쿼리인지 한 눈에 알아볼 수 있게 된다.

😊 Logger를 통해 파라미터 확인하기

파라미터를 확인해보자

  • application.yaml
logging:
  level:
    org.hibernate.type.descriptor.sql.BasicBinder: trace
  • application.properties
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

🎈 해당 설정을 추가하면 , prepared statement의 파라미터를 로그로 남기게 된다.

😊 p6spy로 쿼리 로그 출력하기

모든 문제를 해결해주는 p6spy
P6Spy는 기존 어플리케이션에서 코드를 변경하지 않고도 데이터베이스의 데이터를 자연스럽게 가로채고, 로그도 남기게 해주는 프레임워크이다.

실제 사용자의 DataSource를 P6SpyDataSource 가 감싸고, jdbc 요청이 발생 할 때마다 p6spy가 프록시로 래핑해서 해당 정보를 분석 하고, 로그를 남기는 원리로 작동한다.

P6Spy를 도입하는 방법은 몇 가지가 있다.

  • Datasource를 P6DataSource로 대체하는 방법
  • URL 방식으로 p6spy를 거치도록 변경하는 방법
  • Spring Boot 자동 설정을 하는 방법

스프링부트로 자동 설정

  • p6spy-spring-boot-starter 버전implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1") 이며 이 경우에는 아래와 같은 추가 설정이 필요하다.

application.properties

  • 이 설정의 기본값은 true이나 관리를 위해 명시적으로 추가해 주는게 좋다.
    decorator.datasource.p6spy.enable-logging=true

🎈 spy.properties 생성 및 설정

  • <프로젝트>/src/main/resources 경로에 spy.properties 파일을 생성한다.
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=took %(executionTime) ms | %(sql)
excludecategories=info,debug,result,resultset

위 설정은 변경한 설정만 넣었다.

ref.[블로그]

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글