본문 바로가기

Java/오류

[오류 / IntelliJ] org.apache.ibatis.binding.BindingException: Parameter '변수명' not found (MyBatis 쿼리 매핑 오류)

 

 

org.apache.ibatis.binding.BindingException: Parameter '변수명' not found

xml파일의 여러 쿼리문 중 딱 하나의 쿼리문에서만 매핑오류 발생.

 

service에서 mapper로 넘어가는 부분에서 로직이 멈추고,
서비스 로직에서 에러 로그를 출력해보니 아래처럼 나온다.

org.mybatis.spring.MyBatisSystemException: null

 

이유를 찾아보니 대부분 변수명 혹은 parameterType 오타문제라는데 오타는 없었음.

(String param1, String param2) 로 전달하던 파라미터를 

(Map<String, object> param)의 형태로 변환해서 전달해줬더니 오류없이 성공.

 


 

Build - Rebuild Project 과정에서 두번째 오류 발생.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception with message: Failed to parse mapping resource: 'file [D:\경로\프로젝트명\out\production\resources\mybatis\파일명.xml]'

MyBatis가 **sqlSessionFactory**를 생성하는 과정에서 파일명.xml 파일을 파싱하지 못한 경우 발생하는 오류.

그런데 경로가 out 폴더 내부의 xml파일을 잡고있다.

잘못된 경로의 잘못된 파일을 잡고있음!!!!

 


 

MyBatis가 out 폴더를 참조하지 않도록 설정

1. application.properties 설정.

mybatis:
  mapper-locations: classpath:mybatis/*.xml

 

2. Projec Structure 설정

File > Project Structure > Modules에서 out 폴더를 Excluded로 설정

 

 

둘다 되어있긴 했다...


 

캐시를 한번 지워주고  File > Invalidate Caches / Restart

다시  Build > Rebuild Project

오류없이 잘된다.

그래도 일단 out폴더 자체를 삭제해줬다.

 


 

정리해보자면 

 

1. 빌드오류 원인

=> IntelliJ가 빌드 출력 디렉토리(out/production/resources)를 클래스패스로 포함. 

 

2. 쿼리오류 원인

=> 1번에 의해 MyBatis가 out/production/resources와 src/main/resources의 매퍼 XML 파일을 동시에 로드.
=> 동일한 파일을 두 번 로드하면 MyBatis는 중복된 매퍼 SQL(namespace와 id)을 덮어쓰거나 충돌.

파라미터를 String에서 Map으로 변경했을 때는 잠시 중복을 피해서 오류가 안났던것! 이후에 또 오류가 났을듯!?

 

결국 빌드 과정에서 중복된 리소스 파일로 인한 오류!!!

 


 

Gradle은 build 폴더로 빌드 결과물이 나오고

IntelliJ 는 out 폴더로 빌드 결과물이 나온다.

빌드 설정은 Settings - Build, Execution, Deployment - BuildTools - Gradle 에서 가능.

 

https://pamyferret.tistory.com/62

 

Build Gradle vs IntelliJ IDEA

작년에 처음 IntelliJ IDEA를 사용하기 시작하면서 이클립스와는 다른 단축키들을 익혔었다. 그 중 하나가 Gradle Project를 Gradle로 빌드 할건지 IntelliJ IDEA로 빌드할 것이지 설정이었다. 처음에는 기본

pamyferret.tistory.com

 


 

빌드방식 차이점 비교 (증분빌드)

https://bombo96.tistory.com/72

 

gradle build vs Intellij IDEA build

개발바닥 오픈채팅방에서 호돌님이 인프런에서 질문자의 문제를 해결하는 과정에 있어서 Build Tools를 Gradle로 설정해야만 오류가 발생하지 않고 Intellij로 설정하면 오류가 발생한다는 원인을 발

bombo96.tistory.com