정리자 - 이태혁(Lee, TaeHyuk)
앞서 Class의 bean을 등록하기 위해서는 Java형식의 설정정보인 Config파일이나 XML 또는 YAML 등의 파일로 Bean에 대한 정보를 직접 알려줘야 한다. 하지만 Bean의 갯수가 많아질수록 이 또한 상당한 반복잡업이 된다
→ 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공하게 된다. 뿐만 아니라 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공해준다.
AppConfig.class 와 같은 설정파일 없이 어떻게 Class 파일들을 등록할까?
바로 @ComponentScan, @Component Annotation을 사용하면 된다.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
) //Configuration 안에도 @Component가 들어가 있기때문에
public class AutoAppConfig {
}
위와 같이 AutoAppConfig.class를 새로 만들고 마찬가지로 @Configuration으로 등록하고 추가적으로 @ComponentScan을 같이 등록해주면 패키지 내부에 있는 @Component들을 다 찾아서 Bean으로 등록해준다. (참고로 @Configuration 내부에도 @Component가 들어가 있어 위의 Config.class도 bean으로 등록된다)
@Component
public class MemberServiceImpl implements MemberService{
//........ (내용물)
}
@Component
public class OrderServiceImpl implements OrderService{
//........ (내용물)
}
@Component
public class MemoryMemberRepository implements MemberRepository{
//........ (내용물)
}
@Component
public class RateDiscountPolicy implements DiscountPolicy{
//........ (내용물)
}
기존에 만들어놨던 구현첸 class 위에 @Component를 붙여놓으면 Spring이 알아서 bean으로 인식해서 스프링컨테이너에 등록한다.
@Component를 알아보고 등록해 주는 것일까?자 여기서 @Component를 사용해서 bean을 등록하게 되면 한 가지 더 문제가 발생한다. AppConfig.class에서는
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImpl(memberRepository()); //생성자를 통해 구현체를 주입한다.
}
}
내가 직접 구현체를 주입해주는 것이 명시되어 있었다. 그런데 @ComponentScan을 이용해서 @Component들을 bean으로 등록할때는 의존관계 주입(구현체를 주입해줄 방법)을 해줄 방법이 없다.