해결된 질문
작성
·
512
2
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (아니오)
[질문 내용]
1.강의 영상을 따라 코드를 따라 치는데, 강의영상에서 DiscountService 생성자에 @Autowired를 적용하고,
FixDiscountPolicy와 RateDiscountPolicy에 적용된 다른 애너테이션은 제외하고 @Component 애너테이션만 붙히고 테스트를 실행하여도 정상적으로 되는데,
저는 테스트를 실행하면 아래와 같은 에러가 발생합니다.
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [/Users/jinagyeomi/Desktop/dev/intelliJ-project/core/build/classes/java/main/hello/core/order/OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
@RateDiscountPolicy에 @Primary를 붙혀서 우선순위를 적용하면 테스트가 성공이 되는데.. 영상과는 다르게 왜 그러는지 이유를 알 수가 없어 무시하고 진도 나가다가 도저히 궁금증을 참을 수 없어 알아보다가 시간을 너무 뺏겨서 염치불구하고 질문을 남겨드립니다..
AllBeanTest 클래스에 @Autowired가 테스트 성공여부와 상관없이 빨간줄이 쳐져있는데 이건 그냥 무시해도 되는 것일까요?(저번 강의에서 아래 스크린샷에 Syntax로 바꿔서 하라는 답변을 본 것같은데 뭔가 명쾌한 해답이 아닌 것 같기도 하고 다른 질문의 Ai 답변으로는 궁금증이 해결이 안되어서 질문 남깁니다..)
자바는 21, 스프링 부트는 3.2.2 사용 중입니다.
코드는 해당 링크로 첨부파일 전달 드립니다
https://drive.google.com/file/d/1ectcWfuhvlZJVh1SUKn003MQoWIf4puY/view?usp=sharing
답변 2
2
안녕하세요. 나구리님, 공식 서포터즈 OMG입니다.
테스트 코드 실패 관련
해결방안 정보 제공 가이드1. 메뉴얼) 2.스프링 핵심 원리 이해1 - 예제 만들기.pdf
해결방안 정보 제공 가이드2. 자주하는질문(링크))
영한님께서는 강의영상과 현재 시점의 버전차이로 인해 발생하는 상황을 제공해드리는 강의자료 혹은 자주하는질문에 정리하여 원인과 해결방안을 설명해드리고 있습니다.
빌드 실행이 IntelliJ IDEA 일 때 아이콘 모양
테스트는 실패하지만
Gradle일 때 아이콘 모양
테스트 성공하는 것을 올리신 코드로 확인하였습니다.
강의자료 혹은 자주하는 질문을 참고하여 빌드 실행을 Gradle로 변경한 후 확인 부탁드립니다.
빨간밑줄 관련
해당 오류 메시지를 보면
@Autowired로 주입받으려면 @Component, @Service 등을 사용하여 스프링 빈으로 등록되어야 함을 인텔리제이에서 경고성으로 메시지를 표시해주는 것입니다.
인텔리제이에서 제시한 대로 시도하면 밑줄 표기는 없어집니다.
강의에서는 아래와 같이 직접 빈을 등록하였지만 인텔리제이가 강의에서 작성한 코드와 같이 테스트 내에서 직접 등록한 케이스까지 캐치하지 못하여 오류라고 인식하였던 것이며 IDE에서 제공하는 편의 기능이 완벽하지 않을 수 있는 점 참고 부탁드립니다.
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
감사합니다.
코드를 다시 살펴보았는데요,
테스트에서 이상이 없던것은 @Primary를 RateDiscountPolicy에 추가해놓으셨더라구요.
동일한 타입의 빈을 @Primarty 혹은 @Qualifier를 지정하지 않으면 NoUniqueBeanDefinitionException이 발생하는 것은 맞는 현상입니다.
이미 수강하신 내용이겠지만
아래의 두 강의는
(문제발생) 조회되는 빈이 2개일 때
(해결방법)그에 대한 해결 방안
을 설명하고 있습니다. 두 강의를 다시한번 보시면 명확히 이해되실 것 같습니다. 코드는 이미 작성해놓으셨으니 가볍게 영상을 복습해보시고 이해되지 않는다면 댓글로 다시 한번 남겨주시겠어요?
0
안녕하세요, 인프런 AI 인턴입니다.
나구리님의 질문은 Spring 프레임워크를 사용하실 때 AllBeanTest
에 관련된 테스트를 수행 중 발생하는 UnsatisfiedDependencyException
오류에 대하여 질문하신 것으로 이해됩니다. 문제의 핵심은 스프링 컨테이너가 hello.core.discount.DiscountPolicy
타입의 빈을 찾는 과정에서 동일 타입의 빈이 2개(fixDiscountPolicy
, rateDiscountPolicy
) 발견되어 생기는 문제입니다.
같은 문제를 겪으신 다른 학습자분들의 질문에서 얻을 수 있는 기존 답변 링크를 찾아 나구리님에게 도움이 되었으면 하는 바람입니다. 아래에 해당하는 유사한 질문의 답변을 찾았으니 확인해 보시기 바랍니다.
유사한 경우에 대한 답변에서는, 여러 방법으로 문제를 해결할 수 있음을 제시하고 있습니다. 그중 하나는 @Primary
어노테이션을 사용해 주입할 빈을 명시적으로 지정하는 것이며, 다른 하나는 @Qualifier
어노테이션을 사용하여 원하는 빈의 이름을 명시적으로 지정하는 것입니다. 또한, @Component
어노테이션이 중복으로 적용되지 않도록 하는 것도 중요합니다.
Autowired
가 테스트 성공 여부와 관련되어 빨간줄이 쳐진 문제는, 스프링의 버전이 업데이트되면서 나타나는 IDE의 경고일 수 있습니다. 이는 단순히 경고일 뿐이며, 실제로는 정상적으로 동작할 수 있습니다. 그러나, 정확한 문제의 원인을 파악하기 위해서는 질문자의 프로젝트 전체 코드를 검토해야 할 수도 있으므로, 질문에서 첨부하신 링크에 있는 프로젝트 코드를 살펴보는 것이 좋습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
2번의 문제는 이해 하였습니다!
다만 1번의 문제는 말씀해 주신 바와 같이 이전 강의에서 문제가 발생해서 설정을 Gradle로 모두 설정하고 사용 중 이였습니다.
그럼에도 저는 중복빈에 우선순위를 지정해야만 테스트가 통과 되고, 강의는 우선순위 지정이 없이 빈에 같은타입이 중복이 되어있어도 Map이나 List로 꺼낼 때에는 문제 없이 잘 꺼내지는 것 처럼 보여져서요!
아니면 중복 빈은 NoUniqueBeanDefinitionException에러가 나야하는게 당연한건데 제가 뭔가 놓쳐서 이렇게 이해하는 것일까요 ㅠㅠ?