study/mybatis

[mybatis] mybatis numberformatexception

박허디 2025. 3. 19. 23:29
        <form th:action="@{/}" method="get">
            <select id="selectSrch" name="selectSrch">
                <option value="">전체</option>
                <option value="T">제목</option>
                <option value="C">내용</option>
            </select>
            <input id="writeSrch" type="text" name="writeSrch">
            <button type="submit" id="btnSrch">확인</button>
         </form>

-- HTML --

   /* 게시판 전체 조회 */
    public List<Map<String, Object>> boardMain(Map<String, Object> requestMap) {

        if (requestMap.get("selectSrch") != null) {  // 검색조건 값 String으로 변환
            String selectSrch = String.valueOf(requestMap.get("selectSrch"));
            requestMap.put("selectSrch", selectSrch);
            log.warn("selectSrch type: " + selectSrch.getClass() );
        } else {
            log.warn("null");
        }

        return boardMapper.boardMain(requestMap);
    }

-- SERVICE --

    <select id="boardMain" parameterType="map" resultType="map">
        <!-- BoardMapper.boardMain : 게시판 조회 -->
        SELECT
            NO,
            TITLE,
            COMMENT
        FROM
            BOARD
        WHERE
        1=1
        <if test="selectSrch == null or selectSrch == ''">
        </if>
        <if test="selectSrch == '' and writeSrch != null and writeSrch != ''">
            AND (TITLE LIKE CONCAT('%', #{writeSrch}, '%') OR COMMENT LIKE CONCAT('%', #{writeSrch}, '%'))
        </if>
        <if test="selectSrch == 'T' and writeSrch != null and writeSrch != ''">
            AND TITLE LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
        </if>
        <if test="selectSrch == 'C' and writeSrch != null and writeSrch != ''">
            AND COMMENT LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
        </if>

-- XML --

 

다음과 같이 소스를 작성해 놨었는데 분명 서비스에서 selectSrch 값을 String으로 변환시켜 줬는데도 프로그램을 실행시키면 

[Request processing failed: org.mybatis.spring.MyBatisSystemException] with root cause 
java.lang.NumberFormatException: For input string: "C"
	at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)

이런 식으로 NumberFormatException 이 떴다. 

 

이유는 OGNL(Object Graph Navigation Language) 인터프리터 문제였다.

Mybatis에서 사용하고 있는 OGNL 중에서 한 글자에 ' '를 씌우면 Char 형식으로 인식한다

한 글자를 String으로 인식시키려면 " "를 써야 한다.
두 글자 이상부터는 ' ' , " " 아무거나 상관없다고 한다.

// 예시
'T' => Char 형식
"T" => String 형식
'TT' , "TT" => String 형식

 

따라서 위 코드에서 다음과 같이  ' 와 "를 바꿔주면 해결이 된다. 

    <select id="boardMain" parameterType="map" resultType="map">
        <!-- BoardMapper.boardMain : 게시판 조회 -->
        SELECT
            NO,
            TITLE,
            COMMENT
        FROM
            BOARD
        WHERE
        1=1
        <if test='selectSrch == null or selectSrch == ""'>
        </if>
        <if test='selectSrch == "" and writeSrch != null and writeSrch != ""'>
            AND (TITLE LIKE CONCAT('%', #{writeSrch}, '%') OR COMMENT LIKE CONCAT('%', #{writeSrch}, '%'))
        </if>
        <if test='selectSrch == "T" and writeSrch != null and writeSrch != ""'>
            AND TITLE LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
        </if>
        <if test='selectSrch == "C" and writeSrch != null and writeSrch != ""'>
            AND COMMENT LIKE CONCAT('%', #{writeSrch, jdbcType=VARCHAR}, '%')
        </if>

다음과 같이 수정하면 NumberFormatException  이 뜨지 않는다.