@Configuration@ComponentScan스프링 빈을 등록하는 방법은 여러가지가 있다. 가장 대표적으로 사용하는 애노테이션 기반 스프링 빈 등록에 대해 알아보자.
스프링 빈 등록한 빈은
AnnotationConfigApplicationContext를 통해 조회하고 사용할 수 있다.
스프링 빈 조회하기
설정 정보 파일은 두 가지 방법이 있다.
1. 수동 등록 - @Configuration
@Configuration을 추가한다.@Bean을 추가한다.2. 자동 등록 - @ComponentScan
@ComponentScan을 추가한다.@Component를 추가한다.@Autowired를 통한 자동 의존관계 주입을 주로 사용한다.
@Configuration과@Component
@Configuration파일을 보면@Component가 붙어있는 것을 볼 수 있다. 즉,@Configuration도 컴포넌트 스캔 대상이라는 것이다. 그렇다면 차이점은 무엇일까?@Configuration의 경우 클래스 파일을 스프링 컨테이너에 빈을 등록하는데 이때 클래스 파일을 프록시로 만들어 등록한다.
간단하게 두 개의 클래스를 스프링 빈에 등록하겠다.
예제 클래스 다이어그램

@Configuration@Configuration 추가@Configuration 붙은 클래스를 설정 정보로 사용한다.import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //추가
public class AppConfig {
}
@Bean 붙은 메서드 추가한다.@Configuration 붙은 클래스에 @Bean 붙은 메서드를 통해 스프링 빈이 등록된다.@Bean(name = "이름")을 통해 지정한다.@Configuration
public class AppConfig {
//추가 - RedMyBean 스프링 빈으로 등록
@Bean
public MyBean myBean(){
return new RedMyBean();
}
//추가 - MyRepository 스프링 빈으로 등록
@Bean
public MyRepository myRepository(){
return new MemoryMyRepository();
}
}
@Bean
public MyRepository myRepository(){
return new MemoryMyRepository(myBean()); //파라미터로 넘겨줌
}
@ComponentScan@ComponentScan 추가@Componentscan은 @Component가 붙은 클래스를 찾아 스프링 빈으로 등록한다. @Component("이름")으로 바꿀 수 있다.@Componentscan가 붙은 파일이 위치한 곳부터 하위 폴더까지 탐색한다. @ComponentScan(basePackages={"패키지 경로1","패키지 경로2"})@ComponentScan(basePackageClasses= {클래스명1.class, 클래스명2.class})컴포넌트 스캔 대상
아래는 @Component가 붙은 애노테이션이다. 즉, 컴포넌트 스캔 대상이라는 뜻이다. 기능에 따라 여러 애노테이션이 있다.
@Component@Service@Component 붙어있음@Controller@Component 붙어있음@Repository@Component 붙어있음@Configuration@Component 붙어있음예제
@Component만 사용한다.//@Component 추가
@Component
public class RedMyBean implements MyBean {
}
//@Component 추가
@Component
public class MemoryMyRepository implements MyRepository {
...
}
@ComponentScan을 사용하면 자동 의존관계 주입을 해야한다.@Autowired@Component
public class MemoryMyRepository implements MyRepository {
private final MyBean myBean;
//생성자 자동 의존관계 주입
@Autowired
public MemoryMyRepository(MyBean myBean){
this.myBean = myBean;
}
}
출처
인프런 '스프링 핵심 원리 - 기본편' 강의