스프링부트가 @EnableConfigurationProperties를 사용하는 이유
안녕하세요! 토비님!
강의 정말 잘 듣고 있습니다. 덕분에 공부가 많이 되고 있어요. 강의 내주셔서 정말 감사합니다 :)
해당 강의를 듣고 나서, @Import가 더 간결해보이는데, 스프링 부트는 왜 굳이 @EnableConfigurationProperties()를 사용했을까? 라는 의문이 들어 아래와 같은 작은 고민을 해보았습니다.
처음에는 ServerProperties 빈 등록을 자동화 하기 위한 장치라고 생각했는데, 두 애너테이션 모두 클래스명을 일일히 적어주어야 하는걸 보니 자동화를 위한 것은 아닌 것 같다는 생각이 들어, 고민의 방향을 바꿔 보았습니다.
결론적으로, 저는 "@EnableConfigurationProperties()를 사용하는 이유가 @Import만으로는 어떠한 추가적인 행위를 할 수 없기 때문에 @EnableConfigurationProperties를 구현해서 사용한 것 아닐까..?"라고 추측이 되는데, 스프링 부트에서 @EnableConfigurationProperties() 라는 애너테이션을 도입한 이유가 무엇일까요..?
답변 1
2
사실 강의에서 구현한 @EnableMyConfigurationProperties와 스프링 부트의 @EnableConfigurationProperties는 내부 구현이 다릅니다. 스프링 부트는 ImportBeanDefinitionRegistrar라는 상당히 로우레벨의 복잡한 코드를 사용해서 프로퍼티 빈을 만들고, 강의 예제에서는 이를 보다 단순한 방식인 DeferredImportSelector를 사용했습니다. 예제 코드가 너무 난이도가 올라가지 않도록 가능한 단순한 구현 방법을 선택한 것입니다.
여기서 중요한 건 자동 구성 클래스에서 이와 연결되는 프로퍼티 정보를 담은 빈을 선언하는 방식으로 동작한다는 것입니다. 그래서 자동 구성을 하나 분석할 때, 여기에서 사용되어지는 프로퍼티 클래스를 살펴보는 것이 필요하다는 설명을 하려고 했습니다.
스프링에서 @Enable로 시작하는 애노테이션은 거의 모두 내부에 @Import를 메타 애노테이션을 가지는 방식으로 정의되어있습니다. 결국 @Import를 사용한 것과 같은 결과인데 뭐하러 애노테이션을 하나 더 선언을 해서 사용했는가라는 의문을 가질 수 있습니다. 이게 스프링 3.1 시절부터 확장을 위한 애노테이션을 정의하는 관례인데요. 제가 추측하는 이유는 @Import보다는 @Enable이 붙은 애노테이션을 사용하는 것이 빈 구성정보의 사용 의도를 잘 표현할 수 있기 때문입니다. 그리고 단순히 @Configuration 클래스를 가져오기만하는 @Import에 비해서 추가로 애노테이션 엘리먼트를 선언하거나 @Enable 클래스 내부에 다른 설정을 넣을 수도 있어서 활용하기에 더 유리합니다.
이런면에서 @Enable로 시작하는 다양한 애노테이션이 스프링과 스프링 부트에 정의되어있고 사용되어지고 있습니다. 그래서 개발자가 스프링이나 부트로 애플리케이션을 개발하는 경우 @Import를 직접 이용하는 일은 거의 없습니다. 애플리케이션 내부에서 정의한 구성정보는 @Configuration 클래스를 컴포넌트 스캐너로 한번에 가져오기 때문에 @Import할 필요가 없습니다. 그리고 재사용 가능하도록 정의한 자동 구성정보 내지는 설정에 따라 추가되도록 만든 구성정보는 @Enable로 시작하는 애노테이션을 거쳐서 @Import로 뒤에서 끌어오게 만드는 것이 스프링의 관례를 따르는 방식이라서 권장됩니다.
11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지
0
73
2
TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.
0
83
1
섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)
0
200
2
WebApplicationContext를 DispatcherServlet에 this로 넘기는 것
0
278
2
인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.
0
209
2
질문드립니다.
0
232
2
spring boot 3.3.7로 학습중입니다.
0
369
2
Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도
0
162
2
spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.
1
294
2
Springboot 3.2 이상에서 파라미터 추론관련
0
913
4
binding error
0
220
3
Arrays.copyOf 메서드의 타입 세이프
1
155
2
MyOnClassCondition에 있는 matches method의 Invoke 횟수
1
231
3
인용구의 출처가 궁금합니다.
0
259
1
프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용
0
235
2
SimpleCacheConfiguration과 빈 등록
0
168
2
MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점
0
241
1
IntelliJ project jenerator spring initailizr
0
150
1
강의 자료 레퍼지토리에 업로드
0
215
1
강의자료
0
385
1
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
0
311
2
Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의
0
467
5
@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.
0
333
2
application.properties파일내 프로퍼티 이름
0
207
1





