📖 ✏️
- TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
- 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.
스프링 Bean을 등록하는 방법은 크게 @Bean을 이용하는 방식, XML의 을 이용하는 방식 그리고 컴포넌트 스캔 방식이 있다. 등록해야 할 스프링 빈이 수백개에 이르면 하나하나 수작업으로 등록하는 것이 여간 번거로운 작업이 아닐 수 없다. 누락의 문제도 발생한다.
컴포넌트 스캔 방식은 별도의 설정 정보가 없어도 자동으로 스프링 Bean을 등록할 수 있다. 의존 관계를 자동으로 주입하는 @Autowired
기능도 제공하기 때문에 보다 편리하게 스프링 Bean을 관리할 수 있다.
컴포넌트 스캔 방식은 @ComponentScan을 사용한다. 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙여줘야 한다. 컴포넌트 스캔은 이름 그대로 @Component 애노테이션이 붙은 클래스를 스캔하여 스프링 Bean으로 등록한다. Bean 등록을 희망하는 클래스에 @Component를 붙여주면 된다.
의존 관계 주입은 @Autowired를 사용한다. Bean으로 등록하는 클래스의 생성자에 @Autowired를 붙여주면, 스프링 컨테이너가 파라미터 타입에 해당하는 구현체를 등록된 Bean에서 찾는다. 그리고 의존 관계 주입이 자동으로 이루어진다.
컴포넌트 스캔 방식을 적용한 예시 코드
- MemoryMemberRepository @Component 추가
@Component public class MemoryMemberRepository implements MemberRepository {}
- RateDiscountPolicy @Component 추가
@Component public class RateDiscountPolicy implements DiscountPolicy {}
- MemberServiceImpl @Component, @Autowired 추가
@Component public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; @Autowired // 마치 ac.getBean(MemberRepository.class)와 같이 해당 타입으로 조회되는 Bean을 찾아서 등록한다. public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } }
아래와 같이 컴포넌트 스캔 방식의 설정 정보 파일(AutoAppConfig.class
)을 통해 스프링 컨테이너를 생성하는 테스트를 진행해 보면, 로그에서 싱글톤 Bean 등록에 대한 내용과 @Autowired
를 이용하여 의존 관계 주입이 완료되었다는 내용을 확인할 수 있다.
public class AutoAppConfigTest {
@Test
void basicScan() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
로그를 살펴보면 컴포넌트 스캔이 잘 동작하는 것을 확인할 수 있다.
컴포넌트 스캔과 자동 의존관계 주입이 어떻게 동작하는지 그림으로 알아보자.
@ComponentScan
은 @Component
가 붙은 모든 클래스를 스프링 Bean으로 등록한다. 이때, 스프링 Bean의 기본 이름은 클래스명을 사용한다. 단, 맨 앞글자만 소문자를 사용한다. 만약 스프링 Bean의 이름을 직접 지정하고 싶다면 @Component("사용할 이름")
와 같이 지정할 수 있다.
생성자에 @Autowired
를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 Bean을 찾아서 주입한ek. 이때, 기본 조회 전략은 타입이 같은 빈을 찾는 방식을 사용한다. getBean(클래스이름.class)
와 동일한 방식이라고 볼 수 있다.
생성자에 파라미터가 많아도 문제 없이 찾아서 자동으로 주입을 도와준다.
@ComponentScan
가 @Component
가 붙은 모든 클래스를 스프링 Bean으로 등록한다. @Autowired
를 이용한다. 생성자에 @Autowired
를 붙이면 파라미터에 해당하는 타입을 스프링 Bean에서 찾아서 등록한다.@Component("원하는 이름")
을 이용하여 별도 지정할 수 있다.