이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)
GitHub Repository : https://github.com/jcw1031/spring-core-study
그동안 스프링 빈을 등록할 때 자바 코드의 @Bean
이나 XML의 <bean>
을 사용하여, 직접 등록할 빈을 구성 정보에 나열했다. 하지만 만약 등록해야 할 스프링 빈이 수백 개가 넘어가면, 하나하나 직접 등록하기 힘들고 설정 정 보의 크기도 커지며 개발자의 실수로 누락되는 문제가 발생할 수 있다. (무엇보다 반복이 너무 많다!)
스프링은 구성 정보 없이 자동으로 스프링 빈을 등록해 주는 ‘컴포넌트 스캔’이라는 기능을 제공한다. 또한 의존관계를 자동으로 주입하는
@Autowired
도 있다.
직접 코드로 작성해 보자.
AppConfig
는 놔두고, 새로 컴포넌트 스캔 기능을 할 AutoAppConfig
를 생성한다.
@Configuration
어노테이션을 통해 구성 정보로 설정하고, @ComponentScan
어노테이션도 추가한다. @ComponentScan
은 @Componen
어노테이션이 붙은 클래스를 찾아, 모두 자동으로 스프링 빈으로 등록한다.
컴포넌트 스캔의 스캔 범위에 대해 이 전에 글을 쓴 적이 있다. @ComponentScan의 스캔 범위를 참고하자.
근데 우리가 전에 만들었던 AppConfig
에도 @Configuration
어노테이션이 포함되어 있다. @Configuration
어노테이션의 코드를 보면 @Component
어노테이션이 붙어있다. 이 말은, AppConfig
도 컴포넌트 스캔의 스캔 대상이 되어 빈으로 등록된다는 의미이다. 따라서 필터를 사용해 AppConfig
는 스캔 되지 않도록 설정해야 한다.
클래스나 메서드에 커서를 두고 아래 단축키를 사용하면 클래스 또는 메서드의 정의로 이동할 수 있다.
MacOS : ⌘ + B
Windows : Ctrl + B
@ComponentScan
에 excludeFilters
를 사용해 제외할 대상을 설정할 수 있다. 필터에 대해서는 많이 중요한 내용은 아닌 것 같아 나중에 따로 글을 쓸까 한다.
@Configuration
어노테이션이 붙은 클래스는 제외한다는 의미이다.
그리고 빈으로 등록할 클래스들에 모두 @Component
어노테이션을 추가한다. 컴포넌트 스캔의 대상이 되는 것이다. 그리고 생성자 위에 @Autowired
어노테이션을 사용하면, 타입이 맞는 빈을 찾아서 자동으로 주입해 준다.
@Autowired
에 대해서는 뒤에서 자세히 학습한다.
MemberServiceImpl
OrderServiceImpl
MemoryMemberRepository
RateDiscountPolicy
test
패키지의 core
패키지 내에, scan
패키지를 생성해서 그 안에 AutoAppConfigTest
클래스를 생성하고, 간단하게 스프링 컨테이너를 생성하여 MemberService
를 조회하는 테스트 코드를 작성했다.
스프링 컨테이너를 생성할 때
AppConfig
가 아닌,AutoAppConfig
를 사용했다는 점을 주의하자‼️
실행한 후에 로그를 보게 되면, Creating shared instance of singleton bean ~
라고 하며 우리가 필요한 객체들이 싱글톤 빈으로 잘 등록되었고, Autowiring by type from bean name ~ via constructor to bean named ~
이라며 생성자를 통해 타입별로 자동으로 주입됨을 확인할 수 있다.
@ComponentScan
이 @Component
가 붙은 클래스들을 스프링 빈으로 등록한다. 스프링 빈의 이름은 기본으로 클래스의 맨 앞 글자를 소문자로 하여 설정된다.
@Component(”{이름}”)
으로 이름을 직접 설정할 수 있다.
@Autowired
를 생성자에 지정하면, 스프링 컨테이너가 자동으로 타입이 맞는 스프링 빈을 찾아 주입한다.
이번엔 구성 정보를 직접 작성하는 것이 아닌, @ComponentScan
과 @Autowired
를 사용해 자동으로 스프링 빈을 등록하고, 의존관계를 알아서 주입하도록 하는 방법을 알아보았다. 이 전에 작성한 AppConfig
와 비교해 보면 확실히 편리해진 것 같다. 다음 시간에는 빈이 중복으로 등록되었을 때 어떻게 충돌을 처리하는지 알아보자.