Spring

스프링 핵심 원리 - 기본편(컴포넌트 스캔과 의존관계 자동 주입)

코드파고 2022. 4. 25. 17:29

스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan이라는 기능을 제공한다.

또한 의존관계도 자동으로 주입하는 @Autorwired라는 기능을 제공한다.

 

생성자에 @Autowired를 넣어 의존관계를 주입해보자💨

@Component
public class MemberServiceImpl implements MemberService{
    private MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

[ComponentScan]

스프링 컨테이너가 @Component 어노테이션이 붙은 들을 찾는다.

생성자의 파라미터 타입(위의 경우 MemberRepository)을 찾아서 가져온다.

같은 타입이 여러개 있으면?  충돌이 나게 된다  :( 

<스프링 빈의 충돌>
같은 이름의 자동 생성 빈 vs 자동 생성 빈일 경우 충돌이 난다
그러나 같은 네임의 자동 생성 빈 vs 수동 생성 빈은 덮어쓰게 되나 잡기 어려운 버그가 만들어진다.
그래서 최근에는 스프링 부트에서 자동 생성 빈과 수동 생성 빈이 충돌될 경우 오류가 나도록 설정되었다.

 

1. basePackages

basePackages = "탐색 패키지 위치 지정" -> 모든 자바 코드, 라이브러리를 탐색시 시간 낭비..

지정하지 않으면 ComponentScan이 붙은 설정 클래스가 포함된 패키지 위치로 지정된다.

 

@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Configuration.class}),
        basePackages= "hello.core",
        basePackageClasses = AutoAppConfig.class
)

[ComponentScan의 대상]

@Component / @Controller /  @Service / @Repository / @Configuration

 

2. Filters

excludeFilters  / includeFilters

아래와 같이 사용한다.

@ComponentScan(includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class))
@Configuration
static class ComponentFilterAppConfig {
}

<FilterType>

ANNOTATION: annotation을 인식해서 실행(default) (주로 사용)

ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작

ASPECTJ : AspectJ 패턴 사용

REGEX : 정규 표현식

CUTSOM : TypeFilter이라는 인터페이스를 구현해서 처리한다.