🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@ComponentScan excludeFilters 속성 문의

22.12.06 12:53 작성 22.12.06 12:57 수정 조회수 680

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 클래스를 스캔 대상으로 제외하였으나, 그럼에도 스캔하고 있다는 말이 됩니다.

 

(Q) 왜 위의 코드가 정상적으로 동작하지 않는지 혹시 아시는가요?

 


+) 영한님 강의 너무 잘 듣고 있습니다. 영한님께서 테스트 코드를 훌륭하게 작성해주신 덕분에 배움의 깊이도 질문의 깊이도 커지는 것 같습니다. 진심으로 감사드립니다.

 

답변 1

답변을 작성해보세요.

1

안녕하세요. workinghamee님

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

안녕하세요, 영한님.
우선 바쁘실텐데 번거롭게 해드려 죄송하고 신경써주심에 감사드립니다.


1. 실행 방법을 알려주세요.

0) https://drive.google.com/file/d/1vNj6NJUV7zdkXO9PqcFunmk6GsXM1j3j/view?usp=sharing 링크에서 파일 다운로드 후 build.gradle 파일 실행

1) AutoAppConfig.java 파일 내 9번째 줄 주석 처리 및 10번째 줄 주석 해제
image

2) AutoAppConfigTest.java 파일 내 16번째 줄 주석 처리 및 17번째 줄 주석 해제
image

3) AutoAppConfigTest 클래스의 basicScan 메서드 실행

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

위의 1-(3)을 실행해보면 아래 NoUniqueBeanDefinitionException 오류가 발생합니다.

image

오류가 있던 로그를 검색해보면 call AppConfig.memberRepository 가 찍혀있습니다. 위의 1-(1)에서 AppConfig 클래스를 컴포넌트 스캔 대상에서 제외했음에도 해당 클래스를 스캔하여 중복 빈이 정의된 것으로 보입니다.

image

제가 1-(1)에서 코드 작성을 제대로 하지 못한 것인지, 아니면 다른 놓친 부분이 있는 것인지 모르겠어서 문의드립니다.


좋은 강의 들려주심에 진심으로 감사드립니다.

 

안녕하세요. workinghamee님

저도 이 부분은 정확히 잘 모르겠습니다.

ASSIGNABLE_TYPE이 일반적인 @Component에는 잘 동작하는데 @Configuration에는 잘 적용되지 않는 것을 보면, 스프링 내부 우선순위가 있는 듯 합니다.

관련해서 잘 아시는 분이 있으면 답변 부탁드립니다.

채널톡 아이콘