공부/프로그래밍

[jpa] 쿼리 로그 설정

demonic_ 2021. 1. 15. 08:00

jpa 쿼리가 보이는 설정을 하는건 크게 2가지가 있다.

 

1) show-sql 을 true로 설정하는 방법

2) p6spy를 이용한 로깅(외부라이브러리).

 

1번은 파라미터 안에 무엇이 들어있는지 알 순 없고 바인딩쿼리만 로그에 찍힌다.

2번은 추가설정을 좀 해주어야 한다.

 

 

 

1)

show-sql을 사용하는 방법은 간단하다. application.properties 에다 다음이 설정을 추가하면 된다.

 

spring.jpa.show-sql=false # 여기
spring.jpa.properties.hibernate.format_sql=false # 여기
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.generate-ddl=true
spring.jpa.hibernate.database=mysql
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.default_batch_fetch_size = 1000

format_sql을 같이 설정하면 SQL문이 포멧되어 로그에 찍힌다.(아래)

select
    member0_.id as id1_29_,
    member0_.email as email4_29_,
    member0_.nickname as nickname6_29_,
from
    member member0_ 
where
    member0_.id=?

 

 

 

 

 

2)

build.gradle에 다음을 추가한다

dependencies {
    ...
    implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
    ...
}

 

application.properties 에 다음을 추가한다

기본값이 true 이니 운영으로 배포할 땐 false로 하기로 하자.

# jpa query, parameter 로그
decorator.datasource.p6spy.enable-logging=true
decorator.datasource.p6spy.multiline=true

 

설정하는 파일을 열어보면 다음과 같다.

@Getter
@Setter
public class P6SpyProperties {

    /**
     * Enables logging JDBC events.
     *
     * @see P6LogFactory
     */
    private boolean enableLogging = true;
    /**
     * Enables multiline output.
     */
    private boolean multiline = true;
    /**
     * Logging to use for logging queries.
     */
    private P6SpyLogging logging = P6SpyLogging.SLF4J;
    /**
     * Name of log file to use (only for logging=file).
     */
    private String logFile = "spy.log";
    /**
     * Custom log format.
     */
    private String logFormat;

    public enum P6SpyLogging {
        SYSOUT,
        SLF4J,
        FILE
    }
}

 

실행해보면 다음과 같이 파라미터가 자동 바인딩 되어 로그로 나온다.

select member0_.id as id1_29_, member0_.birthday as birthday2_29_, member0_.country as country3_29_, member0_.email as email4_29_, member0_.gender as gender5_29_, member0_.nickname as nickname6_29_, member0_.social_id as social_i7_29_, member0_.social_type as social_t8_29_ 
from member member0_ where member0_.id=1;

 

 

 

# 2021.02.23 추가

dataSource가 Bean으로 등록되어 있지 않으면 p6spy가 자동으로 h2를 잡고 설정된 Datasource를 잡지못한다. 반드시 Bean으로 생성되어야 한다.

 

 

끝.