일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 리눅스마스터 1급 정리
- 코딩테스트
- 연습문제
- 반복문
- toCharArray
- 월간코드챌린지
- 문자열
- 리눅스마스터1급
- 리눅스
- 개발자 회고록
- 자바
- 코테
- 리눅스마스터 3과목
- 자바스크립트 코딩의 기술
- Memoir
- 스프링 컨테이너
- Linux
- Kotlin
- JavaScript
- 백준 java
- 프로그래머스
- java 백준 1차원 배열
- 스프링 빈
- 고잉버스
- GoingBus
- 백준 javascript
- 명령어
- Java
- 카카오
- map
- Today
- Total
hoon's bLog
Mybatis Error | Error querying database. Cause: java.lang.NumberFormatException: For input string: “Y” 본문
Mybatis Error | Error querying database. Cause: java.lang.NumberFormatException: For input string: “Y”
개발한기발자 2023. 2. 21. 11:21Error 발생 경로
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 == "Y" ">
toString() 함수를 사용해 String 형으로 변환
<if test="stringValue == 'Y'.toString()">
equals() 함수를 사용해 String 형 비교
<if test="stringValue.equals('Y')">
결론
실무에서, 값을 비교하는 로직을 만들다 보면 한 번쯤은 맞닥뜨리는 에러 중에 하나다.
전에도 났었고, 이번에도 나면서, 같은 실수의 반복을 막기 위해 기록하기로 마음먹었다.
찾아서 공부하고, 에러를 고쳐서 해결해도,
결국 사용하지 않다 보면 또 망각하고 같은 실수를 반복하게 된다.
실수가 실력이 되지 않도록, 끊임없이 공부하자!
참고
https://ko.wikipedia.org/wiki/OGNL
https://jehuipark.github.io/java/mybatis_ognl
https://kimvampa.tistory.com/177