Programing/Error Resolution(오류해결)

개발 일기 : available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations 오류 해결해보기

세기루민 2021. 1. 12. 14:42
728x90

최근들어 시간이 너무 없어서... 

포스팅을 잘 못하고 있었는데 

최근에 틈틈히 spring 관련 코딩을 하다가 

available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations 

라는 오류를 다시 만나게 됬다.

정확한 오류코드는 

org.springframework.beans.factory.NoSuchBeanDefinitionException : No qualifying bean of type 'service.userService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations

위의 이 코드 명칭인데

즉 현재 내 프로젝트 내부 코드에서 Beans의 생성자를 찾거나 정의하지 못하는 경우를 말한다.

내가 프로젝트 연습중이던 구조는 

JSP -> Controller -> Service(interface) -> ServiceLogic -> Store(interface) -> StroeLogic

위의 구조랑 일치하는데 

여기서 체크해야하는 점들이 존재한다.

1. 어노테이션을 정확하게 사용했는지!

예를 들어서 ServiceLogic에서 interface를 implements 해서 이용하는 경우가 많은데 

이때 해당 로직이 @Service라는 것을 알려줘야 한다.

그렇지 않으면 오류가 지속적으로 발생한다.

@Service
public class userServiceLogic implements userService{

	@Autowired
	private userJson userJsonStore;
	
	@Override
	public ArrayList<user> selectJsonUser() throws IOException, ParseException {
		return userJsonStore.selectJUser();
	}

}

대략적으로 위에 보는 것처럼 @Service라는 어노테이션을 꼭 붙여줘야 해당 로직이 

서비스의 역할을 하는지 프로그램 내부에서 인지하여 실행한다고 생각하면 편하다.

Store(DAO) -> @Repository

Controller -> @Controller

위의 어노테이션은 꼭 붙이는걸 추천한다.

2. logic 연결 상 오류

위에서 언급했듯이 내가 연습하는 구조는 

service와 store의 경우 logic과 interface를 따로 패키징해서 관리하는데 

이 때 잘못 호출하는 경우 오류가 발생하게 된다.

interface를 호출해야 한다면 interface!

만약에 interface를 사용하지 않고 logic만 한다면 logic을 호출해야 한다.

3. dispatcher-servlet.xml 수정

dispatcher-servlet.xml을 이용하는 입장에서 

componet-scan을 설정해줘야 beans 생성 여부를 확인해준다. 

	<mvc:annotation-driven/>
	<context:component-scan
		base-package="controller/**" />
	<context:annotation-config/>
		<context:component-scan
		base-package="service.logic/**" />
	<context:component-scan
		base-package="store.logic/**" />
	<context:annotation-config />
	
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/views/" />
		<property name="suffix" value=".jsp" />
	</bean>

내가 제작하는 코드를 기반으로 보면 

나는 Service, ServiceLogic, Store, StoreLogic 패키지를 사용하고 있기 때문에

beans를 생성했던 logic 패키지에 있는 파일들을 확인하도록 경로를 설정해줬다. 

이부분을 하지 않는다면 beans가 생성되었는지 컴퓨터는 알지 못한다.

기타오류 : @Autowired

이 오류는 사실상 간혹 나타나는 오류중 하나인데

오류가 발생한다면 오토와이어링을 시도하는 과정에서 빈이 없는경우인데 

이때는 어떻게 할 것인지 설정해주면 된다 . 

required = false or true!

위에 둘중 하나로 선택해서 작성해주면 된다 .

@Service
public class userServiceLogic implements userService{

	@Autowired(required=false)
	private userJson userJ;
	
	@Override
	public ArrayList<user> selectJsonUser() throws IOException, ParseException {
		return userJ.selectJUser();
	}

}

위에처럼 한다면? 와이어링 되지 않는 상태로 남기겠다는 의미!

오늘의 포스팅은 여기까지! 

최근들어 시간이 너무 없어서 포스팅을 자주 못하는데 

그래도 틈틈히 하도록 하겠습니다.

 

728x90