본문 바로가기
웹개발지식쌓기

[back] Mybatis 오류 - NumberFormatException : "" 와 ''

by developer_j 2021. 4. 7.
728x90
반응형

최근 다른 팀 요청으로 기능 개선할 건이 있었다. 오늘 back단을 개발하던 중에, mybatis 문법 중 <if test=""> 부분에서 format 에러가 났다. String 값 체크하는 부분이었는데 NumberFormatException이길래 뭐지..? 했는데 어쨌든 형 변환 문제 같았다. 내가 봤을 때는 아무 문제도 없었기에 오늘도 구선생님에게 여쭤봤고 답을 찾을 수 있었다.


문제발생 ) 아래와 같이 코드를 짜면 에러가 남

<if test = "searchFlagYn == 'Y'">
	...
</if>

 

mybatis 가 ONGL기반의 표현식을 도입하고 지원하는데, 싱글쿼테이션('')이나 더블쿼테이션("") 없이 문자열이 들어오게 되면 객체라고 판단하고 해당 객체에 접근하기 위한 다양한 처리(getter / setter 메소드 호출 등)가 사용된다. 그렇다면 싱글쿼테이션이나 더블쿼테이션과 함께 문자열이 들어오게 되면 객체가 아닌, 값(value)이라는 소리가 된다!

그럼 mybatis는 OGNL을 어떻게 지원하고 있을까요? 아주 기본적인 것부터 분석해보니 and와 or처럼 test 연산을 위한 예약어를 제외하고는 싱글쿼테이션이나 더블쿼테이션 없이 문자열이 들어오게되면 어떤 객체라고 판단을 하고 해당 객체에 접근하기 위한 다양한 처리가 수행되어 객체로 접근하게 된다는걸 우리는 경험을 통해 알 수 있습니다. ...  mybatis에서 객체값을 비교할 경우 싱글쿼테이션으로 감싸주어서 사용하는 경우가 있는데 mybatis에게 “이건 property가 아니고 어떤 값이야” 라고 알려 주는거지 문자열이라고 명시해 주는게 아니라는 점 입니다. (후략) -- 출처 2 발췌

즉, 싱글쿼테이션으로 어떤 값을 감싼다면 객체가 아님을 명시하는 것은 맞지만 그게 문자열이라고 명시하는 것은 아니라는 것이다. mybatis에 의해, 내부적으로 적당한 자료형으로 대체된다.

단일 문자의 경우 char 타입으로 인식된다. char 타입은 int형으로 형변환이 가능하다. java의 char형은 실제로 문자의 코드값을 저장하기 때문이다!

이제 NumberFormatException이 나는 이유를 이해할 수 있을 것 같다. char 타입 값인 Y를 int 형 코드값으로 가지고 있는데, VO에는 String형 변수로 저장하고 있다. view로부터 string 형 값을 커맨드객체에 담아 가져왔지만, 해당 값을 <if test="searchFlagYn == 'Y'"> 에서 char 형 값인 'Y'와 비교하고 있고, string 과 char 형을 비교하는 과정에서  'Y'는 char 형식으로 취급되어 NumberFormat으로 비교됨으로써 Exception이 발생한다.

** char = character(문자)의 약자이며, char 형은 1바이트 크기를 의미하고 1바이트는 문자코드(ASCII) 값을 저장하는데에 가장 적당한 크기이다. 또한 이런 문자 외에도 0~9의 숫자나 특수기호 등, 크기가 작은 값을 저장한다. 

결론

아무래도 Char 타입보다는 String 타입의 변수를 더 자주 쓸 것 같다. 따라서 앞으로 바깥 쪽을 감쌀 때는 ""보다 ''를 사용하는 것이 더 좋을 것 같다. 코드의 일관성을 위해서라도 그게 더 깔끔할 듯!

<if test = 'searchFlagYn == "Y"'>
	...
</if>

<출처목록>

1. 오류 관련

m.blog.naver.com/PostView.nhn?blogId=admass&logNo=220533442483&proxyReferer=https:%2F%2Fwww.google.com%2F

 

MyBatis에서 자주하는 실수 : 작은따옴표의 구분

요새 MyBatis를 자주 쓰다보니 나쁜 프로그래밍 습관때문에 자주 만나는 오류가 하나 있습니다. 1234567...

blog.naver.com

t-ara72.blogspot.com/2013/10/mybatis-numberformatexception.html

 

mybatis에서 NumberformatException이 나는 경우

출처: http://sinius.net/?p=308 java.lang.NumberFormatException: For input string: “y” 에러 해결방법 ### Error querying database. Cause: java.l...

t-ara72.blogspot.com

2. OGNL 개념

jehuipark.github.io/java/mybatis_ognl

 

mybatis의 OGNL기반 표현식 분석

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

jehuipark.github.io

728x90
반응형