개발 공부 기록하기/04. Spring & Spring Boot

Spring Boot SQL 보기 옵션 총 정리

lannstark 2019. 7. 30. 20:35

Spring Boot에서 query DSL을 사용하건 spring boot JPA를 사용하건, 쿼리를 튜닝할 때 SQL을 봐야할 때가 있다.

그럴 때 사용할 수 있는 몇 가지 옵션을 조사해 보았다.

환경 : Spring boot 2.* + hibernate 5.3.10 이상

 

sql 보기

Hibernate이 DB에 날리는 모든 쿼리(DDL, DML)를 보여준다

application.yml을 사용한다면,

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true

application.properties를 사용한다면,

spring.jpa.properties.hibernate.show_sql=true

추가된 로그

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?

 

sql 예쁘게 보기

보여지는 쿼리를 예쁘게 포맷팅 해준다.

application.yml을 사용한다면,

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true

application.properties를 사용한다면,

spring.jpa.properties.hibernate.format_sql=true

바뀐 로그

Hibernate: 
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_ 
    from
        user user0_ 
    where
        user0_.name=?

조금 더 보기 좋게 바뀐 것을 확인할 수 있다!

 

추가적인 주석을 표시하기

추가적인 주석을 표시해준다.

application.yml을 사용한다면,

spring:
  jpa:
    properties:
      hibernate:
        use_sql_comments: true

application.properties를 사용한다면,

spring.jpa.properties.hibernate.use_sql_comments=true

바뀐 주석

/* select
    generatedAlias0 
from
    User as generatedAlias0 
where
    generatedAlias0.name=:param0 */ select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_ 
    from
        user user0_ 
    where
        user0_.name=?

/* */로 열고 닫힌 주석이 달린 것을 확인할 수 있다.

 

?에 어떤 값이 들어갔는지 확인하기

hibernate이 보여주는 로그에 있는 ?에 어떤 값이 들어갔는지 구체적으로 알고 싶을 때 사용하는 옵션이다

application.yml을 사용한다면,

logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

application.properties를 사용한다면,

logging.level.org.hibernate.type.descriptor.sql=trace

바뀐 주석

Hibernate: 
    /* select
        generatedAlias0 
    from
        User as generatedAlias0 
    where
        generatedAlias0.name=:param0 */ select
            user0_.id as id1_0_,
            user0_.age as age2_0_,
            user0_.name as name3_0_ 
        from
            user user0_ 
        where
            user0_.name=?
2019-07-28 22:00:32.673 TRACE 33555 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [김철수]
2019-07-28 22:00:32.676 TRACE 33555 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_0_] : [BIGINT]) - [1]
2019-07-28 22:00:32.680 TRACE 33555 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([age2_0_] : [INTEGER]) - [15]
2019-07-28 22:00:32.680 TRACE 33555 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([name3_0_] : [VARCHAR]) - [김철수]

 

모두 적용하기

yml 를 사용하는데 위의 옵션을 모두 적용하려면

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true
logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace

properties 를 사용하는데 위의 옵션을 모두 적용하려면

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
logging.level.org.hibernate.type.descriptor.sql=trace

를 적용하면 된다.