반응형
◆ 발생에러
Cause: java.lang.NumberFormatException: For input string: "Y"
MyBatis Mapper 파일(xml)에서 위와 같은 에러 발생했다.
문제가 되는 구문은 아래의 조건문인데
<if test="emlTrmsAgreYn == 'Y'">
eml_trms_agre_yn = #{emlTrmsAgreYn}
</if>
eml_trms_agre_yn 컬럼은 varchar형이라 문자이고 파라미터로 넣어준 emlTrmsAgreYn도 String이다.
String과 문자 Y를 비교하는거라 (문자== 문자) 임에도 불구하고 NumberFormatException이 발생하고 있었다.
◆ 원인
조건문에서 홑따옴표(') 안에 한 글자만 있을 경우 이걸 String이 아닌 char로 인식을 하고 있었고, 이것을 숫자로 변환하려다 보니
(문자==숫자)의 비교처리가 되어 NumberFormatException이 발생하는게 원인이었다.
기본적으로 char는 16진수 4자리의 숫자로 문자를 표기할수 있음으로, 0 ~ 65535까지의 숫자를 대입할수 있다.
같은 값에 대해 16진수, 10진수, 문자형식 모두 지정이 가능하다는것인데,
마이바티스 내부적으로 문자'Y'가 아닌 10진수 89로 읽지 않았나 추측해 본다.
문자 | 10진수 | 16진수 |
Y | 89 | 0x59 |
N | 78 | 0x4E |
◆ 해결방안
문자가 한글자인 경우, 아래와 같은 방법으로 비교할 수 있다.
1. 홑따옴표('')가 아닌 쌍따옴표("")를 사용
<if test="emlTrmsAgreYn == 'Y' "> ⇒ <if test= 'emlTrmsAgreYn == "Y" '>
2. 홑따옴표('')를 HTML방식으로 변경해서 사용
<if test="emlTrmsAgreYn == 'Y' "> ⇒ <if test= "emlTrmsAgreYn == "Y " " >
3. toString() 함수를 사용하여 문자를 String으로 변환
<if test="emlTrmsAgreYn == 'Y'"> ⇒ <if test="emlTrmsAgreYn == 'Y'.toString()">
4. equals() 함수를 사용하여 명시적으로 문자로 비교
<if test="emlTrmsAgreYn == 'Y'"> ⇒ <if test="emlTrmsAgreYn.equals('Y') ">
글 내용 중 잘못된 부분이 있거나, 첨부하실 내용이 있으시면 댓글로 남겨주세요. 공부하는데 많은 도움이 됩니다.
-- 기억의 유효기간은 생각보다 짧다. --
반응형
'▹ 데이터베이스 연동 도구 > 마이바티스 (MyBatis)' 카테고리의 다른 글
[마이바티스] MyBatis 비교연산 시 XML 파싱 오류 (org.xml.sax.SAXParseException) (0) | 2025.01.07 |
---|---|
[마이바티스] MyBatis Mapped Statements collection does not contain value for ~ 에러 (0) | 2024.12.10 |