스프링에서 2개 이상의 같은 타입의 빈을 주입하려고 Autowired 어노테이션만 사용하면 에러가 발생합니다.
아래 예제 코드를 먼저 보겠습니다.
TestService를 구현한 클래스 TestServiceImp, TestServiceImp2를 스프링 빈으로 생성합니다.
그리고 TestController에서 TestService 인터페이스 타입의 빈을 주입하려고 하지만
TestService 타입의 빈이 2개 있기 때문에 어떤 빈을 주입해야 할지 몰라 에러가 발생합니다.
Autowired는 빈을 주입할 때 먼저 빈의 타입, Qualifier, 이름 순으로 진행합니다.
따라서 이런 문제를 해결하는 방법은 많지만 그중에서 2가지를 소개하면
1. TestService 타입의 빈을 생성할 때 Qualifier 어노테이션을 추가하거나
2. Service 어노테이션에 value 속성을 사용하여 빈에 이름을 적용한 다음 Autowired 대신 Resource 어노테이션을 사용
하는 방법이 있습니다.
먼저 Qualifier 어노테이션을 사용하는 것은 간단합니다.
Service 어노테이션 밑에 Qualifier 어노테이션을 추가하여 생성될 빈 이름을 작성합니다.
그리고 Autowired 어노테이션 밑에도 Qualifier 어노테이션을 추가하여 주입받을 빈 이름을 작성하면 됩니다.
다음 방법은 Service 어노테이션의 value 속성을 사용하는 것입니다.
Service 어노테이션에 value 속성을 추가하여 생성될 빈 이름을 작성합니다.
그리고 Autowired 어노테이션 대신 Resource 어노테이션을 사용하여 빈을 주입하면 됩니다.
개인적으로는 Qualifier 대신 Resource가 더 간단해서 선호하는 편인데 취향에 따라 사용하시면 될 거 같습니다.
스프링 DI에 관한 자세한 정보는 아래 링크에서 확인하시면 됩니다.
https://www.baeldung.com/spring-annotations-resource-inject-autowire
'dev > 스프링' 카테고리의 다른 글
Spring Enum 활용 (0) | 2023.06.05 |
---|---|
Spring Boot WebSocket (0) | 2023.02.14 |
SSO 로그인 연동 (0) | 2023.01.10 |
spring profile 설정 (0) | 2022.09.29 |
spring security sessionRegistry (0) | 2022.04.25 |