오류 log

SPRING 어노테이션 등록 시 오류 _ ex) @service

Alan__kang__morlang 2022. 5. 28. 11:14
반응형

@Service 어노테이션을 붙였는데 에러가 난다면?

- spring mvc 에서 분명 어노테이션들을 Controller나 Service 에 잘 등록을 시켰는데 하단에 보이는 에러메시지 처럼 에러가 난다면.. 상당히 애를 먹을 것입니다.

(나는 분명 Service 를 등록하고 Service 인터페이스를 상속 받았는데 말이죠..)

INFO : org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'appServlet'
WARN : org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kakaoLoginTestComtoller': Unsatisfied dependency expressed through field 'ks'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.care.root.KakaoLoginService' available: expected single matching bean but found 2: kakaoLoginServiceImpl,kakaoLoginService
ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kakaoLoginTestComtoller': Unsatisfied dependency expressed through field 'ks'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.care.root.KakaoLoginService' available: expected single matching bean but found 2: kakaoLoginServiceImpl,kakaoLoginService
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:397)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1429)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
	at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:702)
	at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:668)
	at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:716)
	at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:591)
	at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:530)
	at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:170)
	at javax.servlet.GenericServlet.init(GenericServlet.java:158)
	at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1134)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1089)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:761)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

 

1. 에러 문제 분석

 

WARN : org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'kakaoLoginTestComtoller': Unsatisfied dependency expressed through field 'ks'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.care.root.KakaoLoginService' available: expected single matching bean but found 2: kakaoLoginServiceImpl,kakaoLoginService

 

문제는 빨간색으로 밑줄 친 부분에서 @Autowired 받는 Service 가 2개를 인식하고 있다 그것을 해결해라 

라고 예상을 하게 되었습니다

 

2. 문제 해결

   1-1. 그럼 여기서 해결 방법은 spring 에서 단일한 Serive를 인식하게 해주어야 되는데 그럴때 사용하는 어노테이션 

 

@Primary

 

 ---미세 조정 @Primary---

유형별 자동 연결은 여러 후보로 이어질 수 있으므로 선택 프로세스를 더 많이 제어해야하는 경우가 많습니다.

 이를 수행하는 법은 Srping 의 @Primary 주석을 사용하는 것입니다 
여러 빈이 단일 값 종속성에  자동으로 연결될 후보인 경우 특정 빈에 대해 Serivce를 등록시켜줄 수 있는 단일 Bean으로 설정할 수 있게 합니다. 

[참조] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-autowired-annotation-primary

 

즉, Srping 에서 두개로 인식하던 Bean을 선택 지정을 하게 해주면서 상단에 나와있는 에러를 처리할 수 있게 해줍니다.

 

 

이렇게 @primary를 붙여서 실행하면 문제 없이 에러를 해결하는 것을 알 수 있습니다.!

감사합니다 에러 해결 완료!

반응형