개발.log/framework

[Mybatis][iBatis] org.apache.ibatis.binding.BindingException 에러해결 - 다중 매개변수 객체(DTO, String)넘기기

개발하는 주디씨 2023. 9. 18. 15:17

 

 

org.mybatis.spring.MyBatisSystemException : nested exception is ...


개발하면서 분명 mybatis parameter Binding 오류가 난 적이 없었는데;;; 오랜만에 구글링하여 공백이 있는지.. 마감태그는 잘 닫혀있는지,, 일반적으로 확인할 부분들을 한참 확인하고 나서도 해결되지 않았다...

그러다가 아래 사실을 간과했다는 것을 깨닫고, 겸허한 마음으로 다시 배우고자 한다.

 

MyBatis와 iBatis는 두 가지 다른 버전의 라이브러리이며, 각각의 라이브러리 버전에 따라 동작 방식이 조금 다를 수 있습니다. 또한 데이터 바인딩에 대한 규칙 및 기본 설정도 이 두 라이브러리 간에 다를 수 있다.

 

아래 3.0.0 기준에서는 별도의 어노테이션을 설정하지 않고도, 자동으로 넘긴 parameter 들이 잘 바인딩되었다.

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'

 

 

하지만 2.2.0 기준으로 사용하고 있는 현 프로젝트에서는 오류가 발생하였고, 다음과 같이 해결하였다.

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'

 

MyBatis에서의 @Param 어노테이션

MyBatis에서는 일반적으로 파라미터를 매핑하기 위해 @Param 어노테이션을 사용하는 것이 권장됩니다. 이 어노테이션을 사용하면 MyBatis가 파라미터 이름을 찾아서 SQL 쿼리에 매핑하는 데 도움을 줍니다.

 

iBatis

과거 버전의 iBatis에서는 @Param 어노테이션을 사용하지 않고도 파라미터 바인딩이 잘 동작하는 경우가 있었습니다. 이는 iBatis가 파라미터를 위치에 따라 순서대로 매핑하기 때문입니다. 따라서 파라미터의 순서와 SQL 쿼리의 위치(?)가 일치해야 합니다.
하지만 이러한 방식은 파라미터 순서에 의존하기 때문에 코드의 가독성과 유지 관리 측면에서 문제가 될 수 있습니다. 따라서 MyBatis에서는 명시적인 파라미터 이름을 사용하여 바인딩하는 것을 권장하고 있으며, 이를 위해 @Param 어노테이션을 사용합니다.

따라서 MyBatis를 사용할 때는 @Param 어노테이션을 적절하게 활용하여 파라미터를 명시적으로 지정하는 것이 좋습니다. 이를 통해 코드의 가독성을 높이고 나중에 파라미터 순서를 변경해도 문제가 발생하지 않도록 할 수 있습니다.

 

 

 

 




단일/다중 파라메터 바인딩

 

1. 단일 파라메터

String select(@Param("data")String data);

오브젝트문이 하나라면 그냥 그 안의 변수들을 사용하면 된다.
"select * from thistable where id = #{attributename1} and pw = #{attributename2}"


2. 다중 파라메터
String select(@Param("data")SampleDTO data, @Param("item")int a);

 

어떤 오브젝트인지 정확하게 지정해야 바인딩이 가능하므로 alias 를 주어야 한다. 
"select * from thistable where id = #{data.attributename1} and pw = #{item}"