문제 상황
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);
}