해결된 질문
작성
·
604
4
안녕하세요! 좋은 강의 너무 감사하고 잘 듣고 있습니다.
이번 수업을 듣던 중에 @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이 붙은 클래스도 있을 수 있습니다.
궁금했던 내용인데 감사합니다.
스프링 컨테이너를 구성하기 위한 @Configuration
은 @ComponentScan
유무에 상관없이 최초 1회는 필수라는 뜻이네요.
정성스러운 답변 너무 감사합니다!