Hibernate Slow Query logging 및 yaml, properties 파일 동작 방식에 관하여
느린 데이터베이스 쿼리를 콘솔에 로깅하려는 시도를 했다.
HTTP intercepter과 비슷한 방식으로 데이터베이스에 쿼리가 처리되는 순간 hibernate 혹은 hikariCP 관련하여 설정파일 구현이 필요하지 않을까 싶었는데 생각보다 간단히 해결할 수 있다.
그냥 application.properties 에
spring.jpa.properties.hibernate.generate_statistics=true
logging.level.org.hibernate=INFO
hibernate.session.events.log.LOG_QUERIES_SLOWER_THAN_MS=원하는 단위 시간 MS (0초과)
를 추가하면 된다. yaml 로 설정하는 경우도 마찬가지로 늘 그랬듯 . -> : 로 해주면 된다.
당연히 로깅 레벨에 차등을 두거나 statistics 관련만 INFO 로 설정해도 문제없다.
그런데 로깅이 되지 않는다.
혹시나 해서 application.yaml 이 아닌 직접적인 설정 파일인 hibernate.properties 에 저 설정들을 추가하여 실행해보니 정상적으로 로깅됨을 확인할 수 있었다.
우선 명확히 할 것은, .yaml/.yml 파일과 .properties 파일을 혼용해서 쓰는 경우를 Spring Boot 개발사에서 고려하지 않았다는 것이다.
우선 https://docs.spring.io/spring-boot/docs/2.4.2/reference/htmlsingle/#boot-features-external-config 을 읽어보자.
환경 변수 등 설정파일에 담기는 configuration 들에 대한 우선순위가 명세화되어 있는데, .yaml format 과 .properties format 의 우선순위에 대한 것은 찾을 수 없다. 다만 테스트들을 통해 (위 경우와 같은) .properties 파일이 우선순위로 읽힘을 알 수 있다.
또 하나 눈여겨볼 것은, application-{ENV}.yml 이 application.yml 에 우선순위로 읽힌다는 것이다. 많은 프로젝트에서 환경관리를 위해 application.yml 을 공통으로 두고 develop, release, main 등의 환경을 별도로 정의하는 것을 흔하게 볼 수 있는데, 작동 방식이 문서화되어 있음을 확인할 수 있다.