컴포넌트 스캔의 필터를 공부하기 위해 테스트 코드를 짜던 중 예외가 발생하였습니다.
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 애노테이션을 제거하고 원래의 오류났던 코드로 다시 테스트를 돌리니 처음에는 안 되었던 것이 다시 문제 없이 테스트가 성공했습니다.
뭔가 이상해서 다시 질문을 했습니다.
이해가 잘 되지 않아 아예 해당 강의의 질문방에 질문을 올렸습니다.
얕게 예상하기에는 이 스프링 컨테이너가 애노테이션을 인식하고 빈으로 추가하는 과정에서 인식하는 데에 문제가 있는 듯 합니다. 하지만 다시 경로를 제대로 설정 해 주고 나면 애노테이션을 인식할 수 있는 것이라고 우선 이해했습니다. 아주 오묘하고 애매한 상태이지만 어쨌든 공식 강의에 질문을 남겼으니 답이 돌아오고 제가 제대로 이해하는데로 추가 글을 쓰겠습니다.
(질문 링크 ↓)
컴포넌트 스캔 - 필터 수강 중 질문 - 인프런 | 질문 & 답변
안녕하세요. 스프링 핵심 원리 기본편 중 컴포넌트 스캔의 필터 강의를 4:57까지 수강하던 중 에러가 생겼습니다. 에러는 해결했지만 궁금한 점이 생겨 질문 드립니다. 구분선을 기준으로 안에
www.inflearn.com
(해당 강의 링크 ↓)
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'트러블슈팅' 카테고리의 다른 글
[실전 프로젝트] 트러블 슈팅 N+1 (0) | 2023.07.04 |
---|---|
스프링 N+1 문제 해결, 쿼리 최적화 (0) | 2023.05.18 |
Cannot resolve symbol 에러 해결 (1) | 2023.04.22 |
@RequesBody String 타입 받기 에러 (0) | 2023.04.18 |
aws 배포 실패 (1) | 2023.03.28 |
댓글