본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

Mybatis MyBatisSystemException PersistenceException

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2021. 9. 8.

 

마이바티스(Mybatis)를 사용하다 보면 가끔 만나는 오류 입니다.

오류 메시지는 아래와 같습니다.

Java.lang.NumberFormatException: For input string: "값"
Java.lang.NumberFormatException: For input string: "Y"
...

 

마이바티스(Mybatis)에서 문자열을 가지고 비교를 하는 데 숫자(Number)와 관련된 오류가 발생 한다는 내용입니다.

해당 원인은 OGNL(Object Graph Navigation Language) 의 문제로 알려져 있습니다.

1개의 데이터가 홑따옴표와 함께 표현되어 있으면 해당 데이터를 char 형태로 인식을 합니다.

아래와 같은 경우를 의미 합니다.

<select id="testQuery">
    SELECT * FROM TEST
    WHERE 
    1=1
    <if test="TARGET == '값'">
        AND TARGET = #{TARGET}
    </if>
</select>

 

위 샘플 코드를 보면 TARGET에 대한 값이 홑따옴표인 것을 볼 수 있습니다.

그런데 해당 데이터가 1개의 문자로 되어 있으면 NumberFormatException 이 발생하게 되는 것 입니다.

 * 오류 CASE : 홑따옴표 + 1개의문자

 

그러므로 이와 같은 오류를 방지하기 위해서는 감싸주는 테그를 홑따옴표로 바꾸고, 내부에 비교하는 값을 쌍따옴표로 바꾸면 됩니다.

<select id="testQuery">
    SELECT * FROM TEST
    WHERE 
    1=1
    <if test='TARGET == "값"'>  <!-- 이렇게 쌍따옴표, 홑따옴표를 바꾸어 줍니다 -->
        AND TARGET = #{TARGET}
    </if>
</select>

 

비교하는 문자가 2개이상인 경우에는 홑따옴표로 감싸주어도 사실 문제는 없습니다.

그러나 언제 어디서 1개의 단어를 비교해야 될 지 모르므로 가급적 홑따옴표에 값을 쌍따옴표로 바꾸어 주는게 좀 더 낫지 않을 까 합니다.

이외 가능한 방법 입니다.

1. <if test=”stringValue == &quot;값&quot;”> – 쌍따옴표를 HTML 코드로 변경
2. <if test=”stringValue == ‘값’.toString()”> – toString() 함수를 사용해 String 형으로 변환

 

궁금한점 또는 틀린부분은 언제든 댓글, 메일로 연락주세요! 👻

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글