hoon's bLog

Mybatis Error | Error querying database. Cause: java.lang.NumberFormatException: For input string: “Y” 본문

IT/Error

Mybatis Error | Error querying database. Cause: java.lang.NumberFormatException: For input string: “Y”

개발한기발자 2023. 2. 21. 11:21
반응형

Error 발생 경로

Spring Build 후 기동 중에, 다음과 같은 Error가 발생!!

Error querying database. Cause: java.lang.NumberFormatException: For input string: “Y”

MyBatis 사용 시 위와 같은 에러가 발생하는 경우가 있다.
원인을 살펴보면, 다음과 같은 문자열 비교 구문에서 에러가 발생하는 것을 확인할 수 있다.

<if test=" stringValue == 'Y' "> AND COLUMN = #{value} </if>

아니 'Y'가 있는데?? 왜 이런 데서 에러가 날까?!

분명 문자열 비교 구문인데 NumberFormatException이 발생하는 상황이다.

해결

위 현상은 myBatis 문제는 아니고 OGNL 문제이다.

OGNL(Object-Graph Navigation Language)은 자바 언어가 지원하는 범위보다 더 단순한 식을 사용하면서,

Java Beans에서 발견되는 setProperty와 getPeroperty 메서드를 통해 속성을 가져오고 설정하는 것을 허용하고,

자바 클래스의 메서드를 실행하는 오픈 소스 표현식 언어(EL)이다. 더 단순한 배열 조작도 허용한다.
OGNL 인터프리터에서는 위 구문의 ‘Y’를 char 형으로 인식하고, ‘YY’나 “Y”는 String으로 인식한다.

 

그래서 <if test=”stringValue == ‘Y’”> 이와 같은 구문을 비교할 때 NumberFormat으로 비교를 시도하여 Exception이 발생한다!!
이유는 Java의 char형은 실제로 문자의 코드값을 저장하기 때문이다.

그래서 아래와 같은 형변환이 가능하다. 

char x = 'X';

int code = (int)x; // code에는 X의 코드값인 88이 저장

그래서 위와 같은 상황을 피하기 위해서, 해결책은 다음과 같다.

 

큰따옴표와 홑따옴표의 위치를 변경

<if test=' stringValue == "Y" '>

 

큰따옴표를 HTML 코드로 변경

<if test=" stringvalue == &quot;Y&quot; ">

 

toString() 함수를 사용해 String 형으로 변환

<if test="stringValue == 'Y'.toString()">

 

equals() 함수를 사용해 String 형 비교

<if test="stringValue.equals('Y')">

 

결론

실무에서, 값을 비교하는 로직을 만들다 보면 한 번쯤은 맞닥뜨리는 에러 중에 하나다.

전에도 났었고, 이번에도 나면서, 같은 실수의 반복을 막기 위해 기록하기로 마음먹었다.

찾아서 공부하고, 에러를 고쳐서 해결해도,

결국 사용하지 않다 보면 또 망각하고 같은 실수를 반복하게 된다.

실수가 실력이 되지 않도록, 끊임없이 공부하자!

 

참고

https://ko.wikipedia.org/wiki/OGNL

 

OGNL - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. -->

ko.wikipedia.org

 

https://jehuipark.github.io/java/mybatis_ognl

 

mybatis의 OGNL기반 표현식 분석

mybatis는 동적SQL처리를 지원하기 위해 지정된 엘리먼트들을 제공합니다. 그리고 기존 ibatis에서 제공되어지던 다수의 엘리먼트들은 OGNL기반의 표현식이 도입됨으로써 많이 사라지고 다음과 같은

jehuipark.github.io

 

https://kimvampa.tistory.com/177

 

[MyBatis] <if> 사용법

목표 MyBatis에서 사용하는 사용법 를 왜 사용하고 어떻게 사용하는지를 알아봅니다. 순서 1. 이해 2. 예제 1. 조건식이 참인 경우 쿼리문을 실행합니다. 전달받은 파라미터 값에 따라 쿼리를 동적

kimvampa.tistory.com

 

728x90
반응형