오류 해결 (1)

이진수·2024년 1월 27일
0

문제 상황: BookRepository를 인터페이스로 설정하고 BookMySqlRepository, BookMomoryRepository 두 가지의 구현체를 설정하던 중, 에러가 발생했다. 클래스의 구조는 아래 그림과 같다.


< 에러 메세지 >

Description:

Parameter 0 of constructor in com.group.libraryapp.service.BookService required a single bean, but 2 were found:
	- bookMemoryRepository: defined in file [/Users/jjinsu/IdeaProjects/library-app/out/production/classes/com/group/libraryapp/repository/BookMemoryRepository.class]
	- bookMysqlRepository: defined in file [/Users/jjinsu/IdeaProjects/library-app/out/production/classes/com/group/libraryapp/repository/BookMysqlRepository.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

< 원인 >
해당 오류의 원인은 '빈 중복' 오류라고 한다. 스프링이 빈에 등록되어 있는 BookMysqlRepository와 BookMemoryRepository 둘 중 어떤 의존성을 주입하라는 건지 몰라서 생기는 오류이다. 스프링에서 제시한 해결 방법엔 3가지가 있고, 나는 1번 방법인 @Primary 어노테이션을 사용해 문제를 해결해 주었다.

  1. @Primary 어노테이션 활용: 해당 어노테이션이 사용된 클래스가 우선적으로 의존성을 주입받게 된다.
  2. @Qualifier 어노테이션 활용
  3. 해당 타입의 Bean 모두 주입 받기
  • @Qualifier vs @Primary: 우선적으로 사용할 클래스를 직접 명시해 준 @Qualifier가 우선 순위를 가진다.

profile
기록하는 개발자🧑🏻‍💻

0개의 댓글