작성
·
853
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
안녕하세요, 질문이 있어 글 남깁니다.
<의존관계 자동 주입> - <자동, 수동의 올바른 실무 운영 기준> 강의를 듣다가 영한님께서 작성해주신 아래 코드를 참고하여 실제 코드에 적용해보았습니다.
그 결과 AllBeanTest 내 findAllBean() 메서드에서 NoSuchBeanDefinitionException 오류가 떴습니다. 확인해보니 findAllBean() 메서드 내에서 스프링 컨테이너에 빈을 등록할 때, AutoAppConfig 클래스에서 @Configuration 어노테이션이 붙은 클래스는 컴포넌트 스캔 대상에서 제외했기 때문에 발생한 문제였습니다.
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
위의 코드에서 DiscountServiceConfig.class를 파라메터로 추가하여 문제는 해결하였습니다만, 다른 방법이 잘 동작하지 않아 문의드립니다.
다른 방법으로 AutoAppConfig 클래스에서 @Configuration 어노테이션이 붙으면 컴포넌트 스캔에서 제외하는 것 대신에 AppConfig 클래스만 컴포넌트 스캔 대상에서 제외하는 것으로 코드를 변경하였습니다.
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = AppConfig.class) // 예제코드 살리기
)
그런데 위의 코드로 변경 후 실행 결과 NoUniqueBeanDefinitionException 오류가 발생합니다. 확인 결과, 로그를 찍어봤더니 AppConfig 클래스 내 빈을 등록하고 있었습니다. 다시 말해, AppConfig 클래스를 스캔 대상으로 제외하였으나, 그럼에도 스캔하고 있다는 말이 됩니다.
+) 영한님 강의 너무 잘 듣고 있습니다. 영한님께서 테스트 코드를 훌륭하게 작성해주신 덕분에 배움의 깊이도 질문의 깊이도 커지는 것 같습니다. 진심으로 감사드립니다.
답변 1
1
안녕하세요. workinghamee님
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
안녕하세요. workinghamee님
저도 이 부분은 정확히 잘 모르겠습니다.
ASSIGNABLE_TYPE이 일반적인 @Component에는 잘 동작하는데 @Configuration에는 잘 적용되지 않는 것을 보면, 스프링 내부 우선순위가 있는 듯 합니다.
관련해서 잘 아시는 분이 있으면 답변 부탁드립니다.
안녕하세요, 영한님.
우선 바쁘실텐데 번거롭게 해드려 죄송하고 신경써주심에 감사드립니다.
1. 실행 방법을 알려주세요.
0) https://drive.google.com/file/d/1vNj6NJUV7zdkXO9PqcFunmk6GsXM1j3j/view?usp=sharing 링크에서 파일 다운로드 후
build.gradle
파일 실행1) AutoAppConfig.java 파일 내 9번째 줄 주석 처리 및 10번째 줄 주석 해제
2) AutoAppConfigTest.java 파일 내 16번째 줄 주석 처리 및 17번째 줄 주석 해제
3) AutoAppConfigTest 클래스의 basicScan 메서드 실행
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
위의 1-(3)을 실행해보면 아래
NoUniqueBeanDefinitionException
오류가 발생합니다.오류가 있던 로그를 검색해보면
call AppConfig.memberRepository
가 찍혀있습니다. 위의 1-(1)에서 AppConfig 클래스를 컴포넌트 스캔 대상에서 제외했음에도 해당 클래스를 스캔하여 중복 빈이 정의된 것으로 보입니다.제가 1-(1)에서 코드 작성을 제대로 하지 못한 것인지, 아니면 다른 놓친 부분이 있는 것인지 모르겠어서 문의드립니다.
좋은 강의 들려주심에 진심으로 감사드립니다.