본문 바로가기
Spring

로컬과 운영서버에서 BindingError 메세지가 다르다? DevTools Property

by Gil Granger 2021. 1. 30.

 

 

필자는 SpringBoot 2.3.x 버전 환경에서 로컬과 운영, 개발환경에서 바인딩 에러 메세지 처리에 대한 동작이 다른것을 발견했다.

 

바인딩 에러처리에 대한 설명은 이전 글 참조(granger.tistory.com/69)

 

Spring Boot 2.3.x 에러페이지 BindingException 처리에 대한 ErrorAttibutes 변화

스프링 부트 2.3 버전 부터는 에러처리에 대한 메시지 정책이 변경되었다. 버전 변화로 인해 디폴트로 더이상 BindingExcption 대해서 발생원인에 대한 많은정보를 담고 있는 정보를 메세지에 담아서

granger.tistory.com

 

 

잘못 배포되어 코드가 다른가 Jar를 확인해보니 같았다.

 

어떻게 된것일까?

 

디버깅과 로깅을 통해 문제의 원인을 분석하던중(narrow down)에 이상한점을 발견했다.

 

ErrorProperties

분명 아무런 설정을 하지 않았는데 includeBindingErros 가 "ALWAYS" 였다. (Default는 "NAVER")

 

 

스프링부트 2.3.x 버전부터 업데이트 된 server.error.include-binding-errors 설정이 로컬과 운영이 다르다..!

 

 

그래서 찾아봤다. 언제 includeBindingErros가 "ALWAYS"로 들어가는지,

 

JavaBeanBinder.class

 

propertyBinder에 SpringConfigurationPropertySouces를 유심히 보면 devtools에 의해 server.error.include.message = ALLWAYS 가 들어가있는것을 확인해 볼 수 있다. (이것 이외에도 다른 어떤 프로퍼티 설정들이 들어가있는지 볼 수 있다. 아하..)

 

그래서 이러한 설정들이 어디에서 설정되는지 찾아봤다.

 

.

.

.

 

 

spring-boot-devtools (2.3.x)라이브러리를 보면 해당 코드를 확인해 볼 수 있다.

DevToolsPropertyDefaultsPostProcessor.class

 

 

결국 로컬환경과 배포된 개발환경은 devtools에 의해 차이가 발생했음을 알수 있다. 

 

 

그렇다면 왜 배포환경에서는 devtools가 작동을 왜 안하는것일까??

 

문서를 찾아보았다.

 

 

Spring Boot 2.3 docs (https://docs.spring.io/spring-boot/docs/2.3.x/reference/htmlsingle/)

java - jar로 실행하게 되면 production application으로 동작한다는 설명이다.

 

 

로컬, 배포환경에 따라 유의할 필요가 있어보인다.

 

 

 

 

 

 

DevTools는 유용하게 사용하고 있지만 어떤 원리로 동작하는지 그 기능에는 어떤것들이 있는지 알지 못했다.

이번 기회를 통해 시간이 된다면 자세히 알아보고 기록해두어야겠다.

 

 

 

 

 

댓글