문제의 시작
설정 문제는 코드보다 더 조용하게 실패한다. 값은 분명히 넣었는데 동작하지 않을 때, 실제로 어떤 설정 파일이 어떤 순서로 읽히는지 확인해야 한다. 이 글은 Hibernate slow query logging 설정을 적용하며 Spring Boot configuration priority를 다시 확인한 기록이다.
느린 데이터베이스 쿼리를 콘솔에 로깅하려는 시도를 했다.
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초과)
설정 확인 기준
설정은 application의 숨은 control plane이다. YAML, properties, profile-specific file, environment variable이 어떤 우선순위로 합쳐지는지 모르면 운영에서 같은 값을 여러 번 바꾸고도 원인을 놓칠 수 있다. 문제를 해결할 때는 설정이 존재하는지보다 실제 binding 되었는지를 확인해야 한다.
를 추가하면 된다. yaml 로 설정하는 경우도 마찬가지로 늘 그랬듯 . -> : 로 해주면 된다.
당연히 로깅 레벨에 차등을 두거나 statistics 관련만 INFO 로 설정해도 문제없다.
그런데 로깅이 되지 않는다.
혹시나 해서 application.yaml 이 아닌 직접적인 설정 파일인 hibernate.properties 에 저 설정들을 추가하여 실행해보니 정상적으로 로깅됨을 확인할 수 있었다.
먼저 명확히 할 점은, Spring Boot가 같은 configuration surface에서 .yaml/.yml 파일과 .properties 파일을 혼용하는 경우에 대해 별도 우선순위 규칙을 제공하지 않는다는 것이다.
우선 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 등의 환경을 별도로 정의하는 것을 흔하게 볼 수 있는데, 작동 방식이 문서화되어 있음을 확인할 수 있다.