최근에 스프링부트를 쓰면서 더더욱 많이 쓰는 기능들입니다.
먼저 기존 AppConfig.java는 과거 코드와 테스트를 유지하기 위해 남겨두고, 새로운 AutoAppConfig.java를 만듭니다.
package hello.core;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration //...1
@ComponentScan( //...2
//...3
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
설정 정보이니까 @Configuration 적어줍니다.
@ComponentScan
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
type = FilterType.ANNOTATION : 타입은 애노테이션
classes = Configuration.class : Configuration 애노테이션이 붙은 클래스는 뺍니다.
컴포넌트 스캔을 사용하면 @Configuration 이 붙은 설정 정보도 자동으로 등록되기 때문에, AppConfig, TestConfig 등 앞서 만들어두었던 설정 정보도 함께 등록되고, 실행되어 버립니다.
그냥 놔두면 다 빈으로 등록이 됩니다.
그래서 excludeFilters 를 이용해서 설정정보는 컴포넌트 스캔 대상에서 제외했습니다.
보통 설정 정보를 컴포넌트 스캔 대상에서 제외하지는 않지만, 기존 예제 코드를 최대한 남기고 유지하기 위해서 이 방법을 선택했습니다.
@Configuration 이 컴포넌트 스캔의 대상이 된 이유도 @Configuration 소스코드를 열어보면 @Component 애노테이션이 붙어있기 때문입니다.
<aside> 🌟
[TIP]
Shift + Command + F
파일에서 원하는 단어를 검색할 수 있습니다.
</aside>
컴포넌트 스캔은 이름 그대로 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다고 했습니다. @Component 를 붙여줍니다.
@Component
public class MemoryMemberRepository implements MemberRepository {}