반응형
@ComponentScan이란
- @Component가 붙은 클래스를 모두 빈으로 등록하도록 해주는 어노테이션이다.
- @Autowired가 붙은 Target에 자동으로 등록된 빈을 타입으로 조회하여 의존 관계 주입을 해주는 어노테이션이다.
먼저 수동으로 빈을 등록하는 방법을 간단히 알고 넘어가자.
아래와 같이 AppConfig라는 클래스에 @Configuration을 붙이고 @Bean을 사용해서 하나하나 모두
설정을 해주고 new AnnotationConfigApplicationContext(AppConfig.class)로 스프링 빈으로 등록을 하게 된다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
// 아래는 스프링 컨테이너에 등록된 객체를 사용하는 코드이다.
public class MemberApp {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = ac.getBean("memberService", MemberService.class);
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("member = " + member.getName());
System.out.println("findMember = " + findMember.getName());
}
}
하지만 이렇게 하는 것은 불편한 요소가 있다.
- 빈 설정용 클래스 관리를 해야 한다.
- 그렇게 때문에 빼 먹을 수 있다.
- 의존 관계 주입도 직접 해주어야 한다.
그래서 스프링에는 @Conmponet와 @ComponentScan이 있다.
@ComponentScan 사용 하도록 변경 해보자.
- @ComponentScan을 사용하면 위와 같은 과정을 생략할 수 있게 된다.
- @ComponentScan은 @Component가 붙은 클래스를 모두 스프링 빈으로 등록을 해준다.
즉, AppConfig에서 @Bean을 등록하는 행위를 해줄 필요가 없는 것이다. - @Configuration에도 내부적으로 @Component가 있다.
아래와 같이 AppConfig대신 자동 등록을 해주는 용도로 AutoAppConfig를 만들었다.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
AppConfig에서 등록하기 위해 했던 @Bean을 직접 해당 클래스에 @Component
를 붙인다.
AppConfig에서 의존관계 주입을 직접 해주었는데 @ComponentScan을 사용하면 @Autowired
를 사용하면
자동으로 등록된 빈에서 타입으로 조회
를 하여 자동 주입을 해준다.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
테스트 해보기
class AutoAppConfigTest {
@Test
void basicScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
반응형
'Spring' 카테고리의 다른 글
스프링에서 모든 타입의 빈을 동적으로 관리하기 (0) | 2022.01.14 |
---|---|
스프링 조회 대상 빈이 2개 이상일 경우 (0) | 2022.01.14 |
스프링의 @Configuration과 싱글톤의 관계 (0) | 2022.01.14 |
스프링의 BeanDefinition (0) | 2022.01.14 |
스프링의 자바 코드와 XML 설정 방식 (0) | 2022.01.14 |