본문 바로가기
트러블슈팅

[스프링] 컴포넌트 스캔 필터 에러

by 새발의 피 2023. 4. 2.

컴포넌트 스캔의 필터를 공부하기 위해 테스트 코드를 짜던 중 예외가 발생하였습니다.

 

package hello.core.scan.filter;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {
}

 

이런 애노테이션을 만들고

 

package hello.core.scan.filter;

import org.springframework.stereotype.Component;

@MyIncludeComponent
public class BeanA {
}

그 애노테이션을 포함하는 클래스를 만들었습니다.

 

package hello.core.scan.filter;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;

import static org.assertj.core.api.Assertions.*;
import static org.springframework.context.annotation.ComponentScan.*;

public class ComponentFilterAppConfigTest {

    @Test
    void filterScan(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
        BeanA beanA = ac.getBean("beanA", BeanA.class);
        assertThat(beanA).isNotNull();

//        BeanB beanB = ac.getBean("beanB", BeanB.class);
    }

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

(MyExcludeComponent 애노테이션이나 BeanB 클래스는 에러와 관계 없어서 코드 생략함)

 

앞선 전제와 함께 해당 테스트 코드를 실행하였는데 이런 에러가 떴습니다.

 

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'beanA' available

 

컨테이너에서 beanA라는 이름의 빈을 찾을 수 없다고 합니다.

강의를 세 번 반복해서 듣는데도 이유를 못 찾고 결국 챗 지피티에게 질문을 했습니다.

 

 

몇 번의 끈질긴 질의응답 끝에 사진과 같은 답변이 왔습니다.

 

그래서 발 빠르게 BeanA 클래스에 @Component 애노테이션을 추가하고 테스트를 돌렸더니 예외가 사라졌습니다.

그리고는 다시 @Component 애노테이션을 제거하고 원래의 오류났던 코드로 다시 테스트를 돌리니 처음에는 안 되었던 것이 다시 문제 없이 테스트가 성공했습니다.

 

뭔가 이상해서 다시 질문을 했습니다.

 

 

이해가 잘 되지 않아 아예 해당 강의의 질문방에 질문을 올렸습니다.

 

얕게 예상하기에는 이 스프링 컨테이너가 애노테이션을 인식하고 빈으로 추가하는 과정에서 인식하는 데에 문제가 있는 듯 합니다. 하지만 다시 경로를 제대로 설정 해 주고 나면 애노테이션을 인식할 수 있는 것이라고 우선 이해했습니다. 아주 오묘하고 애매한 상태이지만 어쨌든 공식 강의에 질문을 남겼으니 답이 돌아오고 제가 제대로 이해하는데로 추가 글을 쓰겠습니다.

 

 

(질문 링크 ↓)

https://www.inflearn.com/questions/832738/%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%8A%A4%EC%BA%94-%ED%95%84%ED%84%B0-%EC%88%98%EA%B0%95-%EC%A4%91-%EC%A7%88%EB%AC%B8

 

컴포넌트 스캔 - 필터 수강 중 질문 - 인프런 | 질문 & 답변

안녕하세요. 스프링 핵심 원리 기본편 중 컴포넌트 스캔의 필터 강의를 4:57까지 수강하던 중 에러가 생겼습니다. 에러는 해결했지만 궁금한 점이 생겨 질문 드립니다. 구분선을 기준으로 안에

www.inflearn.com

 

(해당 강의 링크 ↓)

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

댓글