※ 본문은 인프런 김영한님의 스프링 강의를 바탕으로 학습한 내용을 기록한 글입니다.
오개념이 있다면 댓글로 알려주세요!
[ 1 ] 컴포넌트 스캔이란?
스프링 빈은 자바 설정 클래스에서 @Bean으로, 혹은 XML에서 <bean>으로 등록할 수 있다. 하지만, 등록해야 할 스프링 빈이 수십, 수백개가 된다면 수동으로 관리하기 힘들 것이다. 그래서 스프링은 설정 정보(@Bean, <bean> 등) 없이도 자동으로 스프링 빈을 등록해주는 '컴포넌트 스캔' 기능을 제공한다.
다음은 컴포넌트 스캔을 하는 방법이다.
(1) 컴포넌트 스캔을 사용하기 위해서는 스프링 설정 클래스(AppConfig.java라고 가정)에 @ComponentScan 애노테이션을 붙여준다.
(2) 컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다. 그러므로 더 이상 스프링 설정 클래스에 수동으로 @Bean을 등록할 필요가 없다.
(3) basePackages로 스캔 범위를 설정할 수 있다. 만약, 설정하지 않는다면 @ComponentScan 애노테이션이 붙은 스프링 설정 클래스의 패키지가 스캔 범위의 시작 위치가 되어 해당 패키지와 하위 패키지를 모두 탐색한다.
(4) 그러므로 basePackages로 따로 스캔 범위를 설정하는 것보다 프로젝트의 루트에 메인 설정 클래스를 두는 것을 권장한다.
※ 스프링부트의 @SpringBootApplication 에는 기본적으로 @ComponentScan이 내재되어 있다.
컴포넌트 스캔으로 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록은 했는데, 그렇다면 DI는 어떻게 해야 할까? 스프링은 이를 위해 의존관계를 자동으로 주입하는 @Autowired 를 제공한다.
[ 2 ] 컴포넌트 스캔과 @Autowired
MemberService가 MemberRepository에 의존하고 있고, 생성자로 의존관계를 주입 받는다고 가정하자.
(이때 스프링 빈으로 등록할 각 구현 클래스는 MemberServiceImpl, MemoryMemberRepository 라고 가정)
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
}
스프링 설정 클래스에 수동으로 @Bean을 등록할 때에는 위 코드처럼 설정 클래스에서 직접 DI를 해 주었다.
이를 컴포넌트 스캔으로 수정해보자.
@Configuration
@ComponentScan
public class AppConfig {
}
AppConfig에 @ComponentScan 애노테이션을 추가한다. 이제 자동으로 @Component가 붙은 클래스들을 스프링 빈으로 등록할 것이므로 수동으로 @Bean을 등록할 필요가 없다.
@Component
public class MemoryMemberRepository implements MemberRepository {
...
}
대신, 스프링 빈으로 등록할 MemberRepository의 구현 클래스에 @Component 애노테이션을 추가한다.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
마찬가지로 스프링 빈으로 등록할 MemberService의 구현 클래스에 @Component 애노테이션을 추가한다.
이때 생성자에 @Autowired 애노테이션을 지정하면, 스프링 컨테이너가 자동으로 매개변수에 해당하는 스프링 빈을 자신의 저장소에서 찾아 주입한다.
이를 '의존관계 자동 주입'이라 한다.
[ 3 ] 컴포넌트 스캔 대상
컴포넌트 스캔은 @Component가 붙은 클래스뿐만 아니라, 다음과 같은 애노테이션이 붙은 클래스도 스프링 빈으로 등록한다.
- @Controller : 스프링 MVC의 컨트롤러
- @Service : 스프링 비즈니스 로직 클래스
- @Repository : 스프링 데이터 접근 계층 클래스
- @Configuration : 스프링 설정 정보 클래스
- @RestController : @Controller + @ResponseBody
'Programming > Spring' 카테고리의 다른 글
[Spring] 여러가지 DI 방법, 의존관계 자동 주입(@Autowired) (1) | 2023.04.10 |
---|---|
[Spring] 싱글톤 컨테이너 (1) | 2023.03.15 |
[Spring] 스프링 컨테이너(Spring Container) (1) | 2023.03.07 |