Written on
·
61
0
과목명 : 프로퍼티 빈의 후처리기 도입
개요 :
프로퍼티를 객체로 추출하여 사용할 때 TomcatServerConfig에 @Import(ServerProseties.class)를 사용하는 이유와 이를 제거하였을 때 ServerProperties 클래스를 주입받지 못하는 이유가 궁금합니다.
세부 :
ServerProperties.java의 경우 @MyConfigurationProperties 메타 어노테이션을 통해 @Component 어노테이션이 설정되어 Bean으로써 등록이 가능하다고 생각하였습니다.
그러므로 ServerProperties.java는 서비스내에서 유일하게 선언된 ServerProperties 객체이기 때문에 굳이 @import문을 별도로 선언해줄 필요 없다고 생각하였습니다. 따라서 Spring이 기동 될 때 TomcatServerConfig의 servletWebServerFactory에 자동으로 의존성이 주입 될 것이라 생각하였습니다.
그래서 실제로 @ImportServerProperties.class)를 TomcatServerConfig.java에서 지우고 서비스를 기동하였을 때 다음과 같은 에러가 발생하면서 서비스 구동에 실패 하였습니다.
2025-01-13T06:55:22.586+09:00 ERROR 1088 --- [tobySpringBoot] [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method servletWebServerFactory in tobyspringboot.config.autoConfig.TomcatWebServerConfig required a bean of type 'tobyspringboot.config.autoConfig.ServerProperties' that could not be found.
Action:
Consider defining a bean of type 'tobyspringboot.config.autoConfig.ServerProperties' in your configuration.
이러하여 해당 부분에 왜 Import를 선언하는지 질문 드립니다!!
Answer 1
0
안녕하세요, 인프런 AI 인턴입니다. dbbizj님께서 질문하신 내용을 바탕으로 적합한 답변을 제공하겠습니다.
프로그램에서 ServerProperties
객체를 @Import
로 가져오는 이유와 만약 이를 제거할 경우 빈이 등록되지 않는 이유에 대해 설명하겠습니다.
@Import
를 사용하는가?스프링에서 @Import
어노테이션은 특정 클래스를 스프링 컨텍스트에 빈으로 등록하기 위한 방법 중 하나입니다. 특히, 해당 클래스에 직접 @Configuration
, @Component
와 같은 어노테이션이 없다면, @Import
를 통해 컨텍스트에 추가해야 합니다. 이 경우, ServerProperties
클래스가 별도로 @Component
로 명시되어 있지 않거나 스프링 부터가 제공하는 방식으로 자동 구성되지 않는다면, @Import
가 필요합니다.
@Component
와 @Import
의 차이@Component
는 컴포넌트 스캔을 통해 자동으로 빈을 등록하게 도와줍니다. ServerProperties
에 직접 @Component
를 사용하거나 @MyConfigurationProperties
로 컴포넌트 스캔에 포함될 수 있게 설정했다 해도, 패키지 구조나 스캔 범위 설정에 따라 실제로 스캔되지 않을 수 있습니다. 이 경우 @Import
를 명시적으로 사용하면 해당 클래스가 스프링 컨텍스트에 빈으로 등록되게 됩니다.
따라서, TomcatWebServerConfig
에서 @Import(ServerProperties.class)
를 삭제할 경우 빈이 등록되지 않으며, 이로 인해 ServerProperties
클래스가 주입되지 않아 오류가 발생하게 됩니다.
더불어, 아래의 관련 질문에서 유사한 상황에 대한 설명을 참고하시길 권장드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.