[MyBatis] IllegalArgumentException

서현서현·2022년 7월 15일
0

작은 실수들

목록 보기
7/19
post-thumbnail
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for org.zerock.mapper.ReplyMapper.create
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for ....

jUnit으로 DAO 테스트를 하는중 위 오류가 발생했다.

검색해보니 원인은 다음과 같다고 한다.

 (1) mapper id가 틀린 경우

 (2) Parameter와 bean의 field명이  틀린 경우

 (3) sql.xml에서 정의된 namespace와 DAO에서 호출하는 namespace가 다를 경우

 (4) mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우

 (5) mapper에 정의된 namespace 명칭이 같은 Application 내에 중복 될 경우
 

우선... 5번은 일어날수없었다. mapper가 하나니까. 그래서 네임스페이스나 필드명을 쭉 확인해봤다. 스프링에서 MyBatis가 동작하려면 어떻게 해야하는지 공부할수있어 좋았다...^^


테스트 코드는 미리 넣어둔 데이터를 삭제하는 구문으로 했다

	@Test
	public void deleteReply() throws Exception{
		dao.delete(1);
	}

dao의 delete가 있는지 확인해볼까

@Repository
public class ReplyDAOImpl implements ReplyDAO{
	
	@Inject
	private SqlSession session;
	
	private static String namespace = "org.zerock.mapper.ReplyMapper";

	...(생략)

	@Override
	public void delete(Integer rno) throws Exception {
		session.update(namespace+".delete",rno);
	}

}

mapper의 delete를 호출하는 구문이 잘 적혀있다.
namespace의 문제일까?

<mapper namespace="org.zerock.mapper.ReplyMapper">

	...(생략)
	
  	<select id="list" resultType="ReplyVO">
		select *
		from tbl_reply
		where bno=#{bno}
		order by rno desc
	</select>
  
	<delete id="delete">
		delete from tbl_reply where rno=#{rno}
	</delete>
	
</mapper>

namespace도 잘 적혀있다. 그렇다면 혹시 select 구문의 vo에 오류가 났나?

	<typeAliases>
		<typeAlias alias="ReplyVO" type="org.zerock.domain.ReplyVO"/>
	</typeAliases>

mybatis-config 파일에 제대로 작성되어있었다. 따라서 VO를 짧게 적은것도 문제가 아니다.

그럼 xml파일들에 문제가 있을수 있겠다. 혹시 component-scan 설정이 없을수도있다.

<context:component-scan base-package="org.zerock.controller" />

servlet-context.xml이다. 컨트롤러를 인식하도록 설정을 잘해줬다(상관은 없다)

	<context:component-scan base-package="org.zerock.persistence"></context:component-scan>
	<context:component-scan base-package="org.zerock.service"></context:component-scan>	

root-context.xml파일이다. base-package로 persistence 계층을 잘 써줬다.
그런데도 안돼서 결국 데이터소스(테스트 잘됨)부터 코드를 쭉 일어보니

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
		<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
	</bean>

오마이갓.,... 답을 여기서 찾았다. 보다시피 mapperLocations의 valye가 mappers 아래에 있는 Mapper로 끝나는 xml파일로 설정되어있다.

근데나는 보다시피... Mappers로 설정해둔것이다! 그러니 매퍼를 아예 인식하지못한것! Mapper로 바꿔주고 단위테스트를 실행했다.

아주 잘 돌아간다...^^ 드디어 해결!

0개의 댓글