ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [springboot] Datasource Proxy로 SQL query logging 하기
    Spring Boot/환경설정 2024. 1. 11. 21:17

    1. Hibernate 기본 쿼리 로그

    • 기본적으로 JPA를 사용하면 쿼리가 어떻게 찍히는지 확인이 필요하다.
    • application.yml에 hibernate 옵션을 넣어주면 가독성 좋은 query를 찍어보며 개발할 수 있다.

    application.yml

    아래는 쿼리찍히는 예시

    로그 예시

     

    2. Datasource Proxy

    • 운영 환경에서 유용한 확장 기능을 제공하는 Datasource proxy(https://github.com/jdbc-observations/datasource-proxy)를 사용하면 더 풍부한 SQL query를 찍을 수 있다.
    • [대표적으로 쓸만한 기능]  
      • slow query가 발생하면 INFO대신 WARN이나 ERROR로 로그를 찍수 있다.
      • 쿼리 호출 앞뒤로 어떤 작업 하도록 설정 할 수 있다.
      • hibernate에서는 ?표로 표시하는 파라미터를 로그로 기록할 수 있다.
    • 대표적으로 비슷한 도구로 P6spy가 있으나, 2020년 이후 업데이트가 안되고 있고, 이슈가 쌓이고 있는 반면, 꾸준히 업데이트 중이다. (2024.1.9 기준)

     

    설치 및 설정

     

    - build.gradle

    implementation 'net.ttddyy:datasource-proxy:1.10'

    - application.yml

    logging:
      level:
        net.ttddyy.dsproxy.listener: DEBUG

    - Datasource 설정

    @Configuration
    @EnableTransactionManagement
    public class DatabaseConfig {
    
        @Value("${spring.datasource.hikari.jdbc-url}")
        private String JDBC_URL;
    
        @Value("${spring.datasource.hikari.driver-class-name}")
        private String DRIVER_CLASS_NAME;
    
        @Value("${spring.datasource.hikari.username}")
        private String USERNAME;
    
        @Value("${spring.datasource.hikari.password}")
        private String PASSWORD;
    
        @Value("${spring.datasource.hikari.maximum-pool-size}")
        private int MAXIMUM_POOL_SIZE;
    
        @Bean(name = "dataSource")
        public DataSource dataSource() {
    
            Formatter formatter = FormatStyle.BASIC.getFormatter();
    
            return ProxyDataSourceBuilder.create(buildDataSource(
                    JDBC_URL,
                    USERNAME,
                    PASSWORD,
                    DRIVER_CLASS_NAME,
                    MAXIMUM_POOL_SIZE
            ))
                .logQueryBySlf4j(SLF4JLogLevel.DEBUG)
                .name("sendkite-query-log")
                .formatQuery(formatter::format)
                .multiline()
                .logSlowQueryBySlf4j(2, TimeUnit.MINUTES, SLF4JLogLevel.WARN)
                .buildProxy();
        }
    
        private DataSource buildDataSource(
                String jdbcUrl,
                String username,
                String password,
                String driverClassName,
                int maximumPoolSize
        ) {
    
            HikariConfig config = new HikariConfig();
            config.setJdbcUrl(jdbcUrl);
            config.setUsername(username);
            config.setPassword(password);
            config.setDriverClassName(driverClassName);
            config.setMaximumPoolSize(maximumPoolSize);
            return new HikariDataSource(config);
        }
    }

     

    이제 쿼리를 호출하면
    아래와 같이 표시된다.

    스프링부트 로그

     

    ## Reference 

    https://vladmihalcea.com/log-sql-spring-boot/
    https://github.com/gavlyukovskiy/spring-boot-data-source-decorator?tab=readme-ov-file

    반응형
Designed by Tistory.