본문 바로가기
error/Backend

[빈 생성 실패 애너테이션 필요]dao in ShareBrdServiceImpl required a bean of type 'DAO' that could not be found.

by 이쟝 2022. 4. 9.

문제 상황

Service 인터페이스를 구현한 ServiceImpl에서 DAO를 사용하는데 DAO의 bean이 없다고 뜬 것 같았다.


Field dao in com.semiproject.soboon.service.ShareBrdServiceImpl required a bean of type 'com.semiproject.soboon.dao.ShareBrdDAO' that could not be found.

The injection point has the following annotations:
- @javax.inject.Inject()

Action:

Consider defining a bean of type 'com.semiproject.soboon.dao.ShareBrdDAO' in your configuration.

 

DAO

package com.semiproject.soboon.dao;

import com.semiproject.soboon.vo.BoardVO;

public interface ShareBrdDAO {

	// 글 등록
	public int shareInsert(BoardVO vo); 
	
}

Service와 ServiceImpl

package com.semiproject.soboon.service;

import com.semiproject.soboon.vo.BoardVO;

public interface ShareBrdService {

	// 글 등록
	public int shareInsert(BoardVO vo); 
	
}
package com.semiproject.soboon.service;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.semiproject.soboon.dao.ShareBrdDAO;
import com.semiproject.soboon.vo.BoardVO;

@Service
public class ShareBrdServiceImpl implements ShareBrdService {

	@Inject
	ShareBrdDAO dao;
	
	@Override
	public int shareInsert(BoardVO vo) {
		return dao.shareInsert(vo);
	}

}

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.semiproject.soboon.dao.ShareBrdDAO">

애너테이션을 다 잘 붙인 것 같은데 왜 오류가 나는지.. 이해를 못했는데 DAO에 @Mapper와 @Repository 애너테이션을 추가했더니 오류가 없어졌다...

 

@Mapper Mapper 클래스의 정의, 자동 빈 등록, 즉 매퍼등록을 위한 애너테이션
@Repository mybatis.xml에서 사용하고 있는 맵핑xml 중
namespace가 value로 지정된 xml을 자동으로 찾음

이유는 모르겠지만 Mapper에 적은 namespace를 못찾는 것 같아서 애너테이션을 사용해서 DAO를 xml 클래스에서 찾은 것 같고, Mapper애너테이션이 매퍼 등록을 해준 것 같다. 

수정한 DAO

package com.semiproject.soboon.dao;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import com.semiproject.soboon.vo.BoardVO;

@Mapper 
@Repository
public interface ShareBrdDAO {

	// 글 등록
	public int shareInsert(BoardVO vo); 
	
}