p6spy란 쿼리 파라미터를 로그에 남겨주고 추가적인 기능을 제공하는 외부 라이브러리이다.
스프링부트와 JPA로 프로젝트를 진행하다 보면 실제 쿼리가 어떻게 나갈지 눈으로 확인을 하고 싶을 때가 참 많다. JPA가 참 편하긴 한데 개발자가 직접 쿼리를 작성하지 않았다 보니 실제로 어떤 쿼리가 나갈지는 눈으로 확인 하기 전까지는 정확히 알기 힘들다.
내 기준에 쿼리를 꼭 확인해야 할 상황이 크게 두가지 정도가 있다.
의도한대로 작동하지 않아서 쿼리가 의심될 때
N+1 문제가 발생하고 있는지 확인이 필요할 때
그러다보니 항상 테스트 설정에서는 쿼리가 전부 출력되게 설정 해두고 테스트 코드들을 실행 시키고 있다.
쿼리 로그를 확인하는 방법을 단계별로 개선 해 가며 알아보도록 하자.
일단 간단한 설정으로 JPA에서 쿼리가 어떻게 나가는지 로그로 확인을 할 수 있다. 운영환경에서는 로그가 감당이 안되기 때문에 개발환경이나 테스트 환경에서만 설정을 하는게 좋다!!!!!
application.yaml
spring:
jpa:
show_sql: true
application.properties
spring.jpa.show-sql=true
이렇게만 하면 쿼리가 눈에 보이기는 정렬이 되어 있지 않아 정신이 없고, 파라미터도 보이지 않는다.
spring:
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
spring.jpa.properties.hibernate.format_sql=true
이후 로그를 확인해 보면 깔끔하게 쿼리가 정렬 되어서 무엇을 하는 쿼리인지 한 눈에 알아볼 수 있게 된다.
파라미터를 확인해보자
logging:
level:
org.hibernate.type.descriptor.sql.BasicBinder: trace
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
🎈 해당 설정을 추가하면 , prepared statement의 파라미터를 로그로 남기게 된다.
모든 문제를 해결해주는 p6spy
P6Spy
는 기존 어플리케이션에서 코드를 변경하지 않고도 데이터베이스의 데이터를 자연스럽게 가로채고, 로그도 남기게 해주는 프레임워크이다.
실제 사용자의 DataSource를 P6SpyDataSource 가 감싸고, jdbc 요청이 발생 할 때마다 p6spy가 프록시로 래핑해서 해당 정보를 분석 하고, 로그를 남기는 원리로 작동한다.
P6Spy를 도입하는 방법은 몇 가지가 있다.
p6spy-spring-boot-starter 버전
은 implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.1")
이며 이 경우에는 아래와 같은 추가 설정이 필요하다.decorator.datasource.p6spy.enable-logging=true
🎈 spy.properties
생성 및 설정
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.[블로그]