1. Component Scan이란?


아래와 같은 설정 클래스가 있습니다.

@Configuration 
public class FirstConfiguration { 
    @Bean 
    public MemberRegisterService memberRegSvc() { return new MemberRegisterService(); } 
    @Bean 
    @Qualifier("printer") 
    public MemberPrinter memberPrinter() { return new MemberPrinter(); } 
    @Bean 
    public VersionPrinter versionPrinter() { 
        VersionPrinter versionPrinter = new VersionPrinter(); 
        versionPrinter.setMajorVersion(5); 
        versionPrinter.setMinorVersion(0); 
        return versionPrinter; 
    } 
}

위와 같은 방식으로 설정 클래스를 작성한다면 등록해야할 빈이 늘어날 때마다 설정 클래스의 코드가 길어질 것입니다. 이 때 Component Scan 기능을 이용하면 설정 클래스를 엄청 깔끔하게 만들 수 있습니다. 위의 빈에서 MemberRegisterService를 @ComponentScan을 이용해 빈으로 등록해보겠습니다. 먼저 해당 클래스에 @Component 애노테이션을 붙여줍니다.

@Component // 해당 클래스를 빈으로 등록한다. 맨 앞글자를 소문자로 바꾼 클래스명이 빈의 이름이 된다. 
public class MemberRegisterService { 
    @Autowired 
    private MemberDao memberDao; 
    
    public MemberRegisterService() { } 
    
    public MemberRegisterService(MemberDao memberDao) { this.memberDao = memberDao; } 
    
    public Long regist(RegisterRequest req) { // ...생략 } 
}

빈의 이름을 따로 주고싶다면 @Component("memberRegSvc") 처럼 값으로 줄 수 있습니다. 다음으로 클래스를 Component로 등록했다면 설정 클래스에서 @ComponentScan Annotation을 이용해 Component를 불러와 빈으로 등록할 수 있습니다.

@ComponentScan 애노테이션의 값으로 주어진 basePackages를 이용해 스캔할 대상 패키지를 지정합니다.

@Configuration 
@ComponentScan(basePackages = {"spring"}) // 괄호의 값은 스캔할 패키지명이다. 
public class AppCtx { 
    @Bean 
    @Qualifier("printer") // Spring Container으로부터 주입할 빈의 이름을 명시합니다.
    public MemberPrinter memberPrinter() { return new MemberPrinter(); } 
    @Bean 
    public VersionPrinter versionPrinter() { 
        VersionPrinter versionPrinter = new VersionPrinter(); 
        versionPrinter.setMajorVersion(5); 
        versionPrinter.setMinorVersion(0); 
        return versionPrinter; 
    } 
}