728x90
문제 상황
public class OAuth2LoginSecurityConfig {
private final UserRepository userRepository;
private final OAuthService oAuthService; //-> 여기서
...
}
@Service
public interface OAuthService {} //GoogleOAuthService, KakaoOAuthService가 구현
오류 발생
Parameter 1 of constructor in com.memo.login.oauth.CustomOAuthService required a bean of type 'com.memo.login.oauth.OAuthService' that could not be found.
인터페이스를 빈으로 등록하려 했더니 OAuthService빈을 찾을 수 없다고 나옴. 그래서 구현체 2개 등록
@Service
public class GoogleOAuthService implements OAuthService {}
@Service
public class KakaoOAuthService implements OAuthService {}
→ 빈 충돌(config에서 OAuthService 빈을 주입해야하는데 동일한 타입의 빈이 2개라 충돌
Parameter 1 of constructor in com.memo.common.OAuth2LoginSecurityConfig required a single bean, but 2 were found:
- googleOAuthService: defined in file [/Users/jiyeon/study/project/memo/build/classes/java/main/com/memo/Login/oauth/google/GoogleOAuthService.class]
- kakaoOAuthService: defined in file [/Users/jiyeon/study/project/memo/build/classes/java/main/com/memo/Login/oauth/kakao/KakaoOAuthService.class]
충돌을 해결하기 위해 동일한 타입의 빈을 주입하는 여러가지 방법이 있는데 타입이 일치했을 경우 필드명을 보고 주입한다는게 생각나서 해당 방법을 활용하기로함
해결과정
1. OAuthService와 UserRepository 빈 주입이 필요한 CustomOAuthUserService를 Config에 빈으로 등록
public class OAuth2LoginSecurityConfig {
private final OAuth2UserService customOAuthService;
...
}
2. CustomOAuthService에서 OAuthService 타입으로 구현체 2개의 빈 등록(googleOAuthService, kakaoOAuthService)
@Service
@Slf4j
@RequiredArgsConstructor
public class CustomOAuthService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
private final UserRepository userRepository;
private final OAuthService googleOAuthService;
private final OAuthService kakaoOAuthService;
...
}
타입이 동일해도 필드명을 보고 주입하므로 동일한 빈 2개가 등록되고 주입시에 충돌나지 않는다.
728x90