작성
·
106
1
안녕하세요, 강의를 듣는 학생입니다.
섹션 7 - 옵션관리 강의를 들으면서 아래 링크와 같은 문제가 발생하여 David님께서 답변해주신 대로 해서 해결은 했습니다. 하지만, 추가적으로 궁금한 것이 있어 질문드려요!
왜 MemberServiceImpl에서 MemberRepository 주입 대상이 2개가 존재하는지 궁금합니다. 에러 문구를 읽어보니 memoryMemberRepository와 memberRepository가 있다고 하는데 이해가 잘 안됩니다. 제가 강의를 들으면서 @ComponentScan에 대해 이해한 바로는 스캔 대상이 @Component, Controller, Service, Repository, Configuration인데 아직 @Component, Configuration 외에 다른 어노테이션을 사용하지는 않았고, MemberServiceImpl에 주입하는 MemberRepository 타입에 해당하는 구체화된 클래스는 MemoryMemberRepository 클래스 하나밖에 없지 않나요? 제가 어디를 놓쳤는지 설명 부탁드립니다!
질문 읽어주셔서 감사합니다.
https://www.inflearn.com/community/questions/1328229/illegalstateexception
답변 2
0
안녕하세요. 빵냥이님, 공식 서포터즈 OMG입니다.
해당 오류는 대표적으로 스프링부트 3.2이상부터 발생할 수 있는 가능성이 높은 상황으로, 아래 영한님 답변을 참고해주세요.
문제 원인
자바를 컴파일할 때 매개변수 이름을 읽을 수 있도록 남겨두어야 사용할 수 있다. 컴파일 시점에 -parameters 옵션을 사용하면 매개변수 이름을 사용할 수 있게 남겨둔다.
스프링 부트 3.2 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도했다. 하지만 스프링 부트 3.2 부터는 이런 시도를 하지 않는다.
영한님 답변을 근거하여 빌드 실행이 Gradle일 때는 매개변수 이름 추론을 하지 않고, IntelliJ IDEA일 때는 추론을 하도록 동작하고 있는 것으로 예상합니다.
https://www.inflearn.com/community/questions/1089023
이 문제로 인한게 맞는지 확인하려면 빌드 실행이 IntelliJ IDEA여야 합니다.
빌드 실행이 Gradle(Default)가 아닌 IntelliJ IDEA일 때 발생한 상황이 맞을까요?
인텔리제이 세팅 화면에서 빌드 실행 종류를 확인해주세요 ^^
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 빵냥이님의 질문에 대해 유사한 문제를 해결한 기존 답변 링크를 찾았습니다.
이 문제는 스프링 컨테이너에서 동일 타입의 빈이 2개 이상 존재할 때 발생하는 UnsatisfiedDependencyException
과 관련 있습니다. 스프링은 자동으로 의존성을 주입받을 빈을 탐색할 때, 해당 타입의 빈이 단 하나만 존재하기를 기대합니다. 만약 같은 타입의 빈이 여러 개 인식되면, 스프링은 어떤 빈을 주입해야 할지 결정할 수 없어 에러를 발생시킵니다.
문제 상황에서 MemberRepository
타입으로 선언된 memoryMemberRepository
와 memberRepository
두 개의 빈이 발견되었기 때문에 발생하는 문제입니다. 빵냥이님의 경우, 하나의 구현체만 존재한다고 생각했지만 실제로는 스프링 컨테이너가 두 개의 MemberRepository
구현체를 빈으로 인식한 것으로 추측됩니다.
비슷한 문제에 대한 다음 답변을 참고하세요:
- “UnsatisfiedDependencyException 관한 질문”에서는 스프링 데이터 JPA 사용 중 발생할 수 있는 No qualifying bean of type
과 expected single matching bean but found 2
오류에 대한 해결책을 다루고 있습니다. 이는 MemberRepository
의 구현체나 사용 방법에서 발생할 수 있는 일반적인 오류로, 특정 구현체에 @Primary
어노테이션 추가나 자동 설정 대신 수동 설정을 통해 해결할 수 있습니다.
빵냥이님의 경우, 강의 내용에 따라 구현했음에도 불구하고 예상치 못한 빈이 추가로 인식되었다면, 구현체에 부여된 어노테이션 또는 설정 파일 내 여러 구현체에 대한 선언을 재검토해 보는 것이 좋습니다. 또한, 스프링 데이터 JPA와 같은 다른 메커니즘에 의해 자동으로 구현체가 생성되어 빈으로 등록된 경후도 있기 때문에, 해당 부분도 함께 확인하시기 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
왜 실행이 Gradle 일 때와 IntelliJ일 때 다를까 궁금했는데 자세히 알려주셔서 정말 감사드립니다!