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
를 적용하면 된다.
'개발 공부 기록하기 > 04. Spring & Spring Boot' 카테고리의 다른 글
There is no EC2 meta data available, because the application is not running in the EC2 environment 해결 (1) | 2020.09.19 |
---|---|
Failed to instantiate StackNameProvider 해결 (1) | 2020.09.18 |
Spring Boot Interceptor에서 권한 관리하기 I (HttpServletRequest getInputStream 여러번) (0) | 2020.03.18 |
Spring REST DOCS를 Spring Boot에 적용하기 (2) (0) | 2019.07.25 |
Spring REST DOCS를 Spring Boot에 적용하기 (1) (3) | 2019.07.25 |