@ComponentScan과 @Configuration
안녕하세요! 좋은 강의 너무 감사하고 잘 듣고 있습니다.
이번 수업을 듣던 중에 @ComponentScan 애노테이션과 @Configuration 애노테이션을 함께 사용하는 이유가 궁금해서 찾아봤습니다.
찾아본 결과는 다음과 같습니다.
@Configuration 애노테이션이 없는 경우 Spring에서 구성정보를 제공하지 않는다는 것을 의미하기 때문에 @ComponentScan이 스캔할 패키지 내에서 Bean으로 등록할 클래스를 찾지 않는다.
저는 @ComponentScan이 해당 애노테이션이 달린 패키지부터 하위 패키지까지 @Component 애노테이션이 달린 모든 클래스들을 빈으로 등록해주는 역할을 한다고 생각했는데, 위가 아니라 @ComponentScan이 @Component 애노테이션이 달린 모든 클래스들을 찾고 @Configuration이 해당 클래스들을 빈으로 등록해주기 때문에 같이 사용한다로 이해해도 될까요?
답변 1
8
@Configuration이 붙은 클래스는 스프링의 빈으로 등록되면서 각종 자바코드 구성정보(@Bean 메소드)와 부가 애노테이션을 스프링 컨테이너가 인식할 수 있게 만들어줍니다.
@ComponentScan은 그런 부가 애노테이션 중의 하나로 @Component 애노테이션이 붙은 클래스를 자동으로 빈으로 등록해주는 기능을 제공합니다.
@Configuration은 @ComponentScan의 기능을 완성해주거나 도와주는 것이 목적이 아닙니다. 따라서 이해하신 내용은 맞지 않습니다. 단지 @ComponentScan은 @Configuration이 붙은 클래스에 사용해야 스프링 컨테이너가 인식할 수 있다고 생각하시면 됩니다.
이게 조금 헷갈릴 수 있는 건, @Configuration도 결국 @Component가 붙은 애노테이션인데, @ComponentScan이 먼저 동작하지 않으면 최초 @Configuration 클래스는 어떻게 빈으로 등록되는가? 이게 순서가 헷갈릴 수 있겠죠. @ComponentScan이 불은 @Configuration 클래스도 @ComponentScan이 동작해서 빈으로 등록이 되는데, @Configuration 클래스가 빈으로 등록이 안 되면 @ComponentScan을 스프링이 인식을 못합니다. 결국 영원히 인식되지 않는 코드가 될 것처럼 보이죠. 이건 강의 앞부분에 나온 것처럼 메인 @Configuration 클래스를 한번 스프링에 직접 register 해주는 작업을 하기 때문에 가능한 것입니다. 최초 @Configuration 클래스는 @ComponentScan의 도움 없이도 빈으로 일단 등록이 되고, 등록된 빈에 @ComponentScan이 붙어있으니 나머지 클래스들은 @ComponentScan에 의해서 등록이 되는 것이죠. 그 나머지 클래스 중에 또 @Configuration이 붙은 클래스도 있을 수 있습니다.
0
궁금했던 내용인데 감사합니다.
스프링 컨테이너를 구성하기 위한 @Configuration 은 @ComponentScan 유무에 상관없이 최초 1회는 필수라는 뜻이네요.
11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지
0
77
2
TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.
0
86
1
섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)
0
202
2
WebApplicationContext를 DispatcherServlet에 this로 넘기는 것
0
279
2
인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.
0
211
2
질문드립니다.
0
234
2
spring boot 3.3.7로 학습중입니다.
0
372
2
Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도
0
162
2
spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.
1
299
2
Springboot 3.2 이상에서 파라미터 추론관련
0
920
4
binding error
0
223
3
Arrays.copyOf 메서드의 타입 세이프
1
156
2
MyOnClassCondition에 있는 matches method의 Invoke 횟수
1
234
3
인용구의 출처가 궁금합니다.
0
260
1
프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용
0
236
2
SimpleCacheConfiguration과 빈 등록
0
169
2
MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점
0
244
1
IntelliJ project jenerator spring initailizr
0
150
1
강의 자료 레퍼지토리에 업로드
0
216
1
강의자료
0
388
1
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
0
315
2
Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의
0
477
5
@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.
0
344
2
application.properties파일내 프로퍼티 이름
0
214
1





