woniper

[MyBatis] Invalid bound statement (not found): 에러 본문

Framework

[MyBatis] Invalid bound statement (not found): 에러

woniper1 2015. 4. 1. 09:53

Invalid bound statement (not found): 에러가 발생하는 이유가 몇 가지 있는데 아무리 찾아봐도 내 문제는 해결되지 않았다.

에러 원인은 아래와 같다.

  1. Mapper Interface와 mapping되는 xml파일에 오타가 있는 경우 : 예를 들면 id와 Interface에 메소드명이 일치하지 않는 경우
  2. classpath에 경로가 잘못된 경우
  3. xml이 저장될 경로는 잘못 생성한 경우
대부분 1번과 같은 에러가 발생하는데 이는 오타만 찾으면 금방 해결이 가능하다. 근데 3번과 같은 경우(내가 겪은 에러)는 쉽게 인지 하지 못하는 경우가 많다. 주의해서 생성할 필요가 있다.
어떤 경우였냐면 나는 Intellij를 사용하는데 예를 들어
Inteface package 경로 : net.woniper.spring.java.mapper 라는 package에 Mapper Interface가 있다.
XML(Mapper) directory 경로 : net/wonierp/spring/java/mapper
나는 xml이 있어야할 경로를 classpath 즉 resources 밑에 넣어 놓는데 이때 javaConfig의 @MapperScan 어노테이션을 사용할 때 xml directory에 접근한다. 이게 문제였다.
나는 resources 밑에 package처럼 경로를 만들어도 당연히 package처럼 생성이 될 줄 알았는데 그렇지 않았다.
resources 밑에는 package를 생성하지 못하고 directory만 생성이 가능한데 이 directory를 생성할 때 net.woniper.spring.java.mapper라는 directory를 생성하면 그냥 "."을 포함한 폴더가 생성되는 것이다. 그런데 @MapperScan은 "."을 포함한 폴더가 아니라 net/woniper/spring/java/mapper와 같은 경로에 폴더를 원하기 때문에 Invalid bound statement (not found):와 같은 에러가 나는 것이다. 즉 net폴더 밑에 woniper 폴더 밑에 spring 폴더 밑에.... 이런식으로 하나씩 만들어야 접근 가능한 폴더 경로가 생성 된다.
저번에도 이것 때문에 고생했던 기억이 있는데 또 이런 실수를 한다. 전혀 예상치 못한 에러였다. 조심하자.


Comments