저번 글에서, ConfigureSource에 대해 알아보았습니다. 그 글에서, 이런 이야기를 했습니다. 객체가 생성되었을 때, 완전한 상태가 되게 할 수는 없을까? 정확히 말하면, 객체가 생성되었을 때, 설정이 되어야 하는 값은 생성이 될 때 setting이 되게 할 수 없을지를 고민해 보자고 하였습니다. 그에 대한 답이 될 수 있는 것은 ConstructorBinding 어노테이션을 쓰는 것입니다.

 


 ConfigurationProperties 어노테이션을 보면, 세터를 쓰거나, ConstructorBinding을 쓸 수 있다고 되어 있습니다. binding을 하는 방법에는, 세터 메서드 말고도, 생성자로 할 수 있다는 이야기입니다.

 

 

 그래서 위에 해당 어노테이션을 적어 주었습니다. 해당 어노테이션에 대한 설명에도 비슷한 이야기가 있습니다. 세터가 아닌, 생성자를 이용해서 바인딩을 해야 할 때, 이것을 이용할 수 있다고요.

 

 

 application-X.properties에는 spring.server.name이라는 속성이 있습니다. 저는 이 속성을 바인딩 하려고 합니다. 그러면, 먼저, ConfigurationProperties의 prefix는 spring.server를 적어주면 됩니다. 다음에, 이것은 spring.server의 name 이므로, 변수명을 name으로 적어주면 됩니다. 생성자 매개변수의 name을 의미합니다.

 

 

 그 다음에, 생성자를 name으로 받게끔 설정하기만 하면 됩니다. 그런데, 이렇게만 하면, ConfigureSource 생성자가 실행되지 않을 겁니다.

 

 

 아무리 눈을 씻고 봐도, name : 이 없는 것을 알 수 있습니다. 이는, Configurationproperties가 있는 위치를 스캔하지 않았기 때문입니다.


 

 프로젝트의 폴더 구조는 위와 같고, ConfigureSource는 com.example.demo 밑에 있네요. 이것 조차 못 잡는다는 이야기는 scan 집합에 들어가지 않았다는 의미일 겁니다. 이 부분은 이 문서에서 매우 강조해서 다루는 부분입니다.

 

 

 이걸 집어넣기 위해서는, SpringEx1Application에, ConfigurationPropertiesScan 어노테이션을 선언해 주면 됩니다.

 

 

 그러면, 초기화 과정에서 name : choA가 불렸음을 알 수 있습니다.

 

 

 문제는 여전히 test가 불리지 않았다는 것입니다.

 

 

 ConfigurationPropertiesScan 어노테이션의 설명을 봅시다. ConfigurationProperties가 붙은 클래스를 스캔한다고 되어 있습니다. 그리고 이것이 붙은 것에 대해서 초기화를 한다고 되어 있습니다. 여기서 중요한 것은, basePackage 혹은, basePackageClasses인데요.

 

 설명을 계속 보면, specific packages 라고 되어 있습니다. 그리고 사용 용례가 나온 문서를 보면, 아. 그냥 스캔할 무언가를 적어주면 되는 구나 정도는 간파하실 수 있습니다. 한 마디로 특정짓는다 정도가 됩니다. 즉, 스캔하기 위한 집합을 설정할 수 있다는 의미가 됩니다. test는 com.example.other입니다. 이것 역시 com.example.* 로 표현할 수 있습니다.

 

 

 패키지 구조를 보면 알 수 있습니다.

 

 

 그러므로, basePackages를 "com.example.*"으로 설정합니다. 그러면, com.example으로 시작하는 패키지들을 모두 스캔해 버립니다.

 

 

 실행 결과는 위와 같습니다.