myBatis 파라미터 바인딩시 주의점 myBatis(ibatis)

매핑구문에 파라미터를 전달할때 값 기반으로 전달한 파라미터를 사용하면 아무런 문제 없이 처리된다.

String parameterName = "value";
session.selectList("com.test.mapper.TestSql", parameterName)


이렇게 파라미터를 주고


<select id="TestSql" parameterType="String" resultType="com.test.mapping.Account">
     SELECT *
     FROM Account
     WHERE AccountName = #{parameterName}
</select>


이렇게 매퍼를 사용하면 정상적으로 처리된다. 하지만 $를 이용해 바인딩하는 경우에는 에러가 발생한다.


<select id="TestSql" parameterType="String" resultType="com.test.mapping.Account">
     SELECT *
     FROM Account
     WHERE ${parameterName} = '가나다'
</select>


이렇게 하면 속성을 찾을 수 없다면서 오류가 발생한다. 이러한 경우에는 문자열로 바로 파라미터를 전달하지 않고 map에 넣어서 전달한다.


Map<String, Object> parameters = new HashMap<String, Object>();


parameters.put("parameterName", "value");
session.selectList("com.test.mapper.TestSql", parameterName)


이렇게 파라미터를 전달하면


<select id="TestSql" parameterType="String" resultType="com.test.mapping.Account">
     SELECT *
     FROM Account
     WHERE ${parameterName} = '가나다'
</select>


이러한 구문도 정상적으로 처리된다. #로 파라미터를 바인딩 할때와 $로 파라미터를 바인딩 할때 구조상에 차이가 있는가 보다.


덧글

  • alex 2011/02/10 16:37 # 삭제 답글

    저도 테스트하다보니 같은 현상이 있어서 검색하다 들렸습니다. ^^
    좋은 하루 되세요
  • 11 2011/03/15 09:53 # 삭제 답글

    해결못하고 있었는데 도움 받고 갑니다. 고맙습니다.
  • 프렐루드 2011/07/21 18:07 # 답글

    도움이 되어서 다행이네요
  • 멀더 2011/09/06 10:35 # 삭제 답글

    $로 바인딩 되는건은 그냥 문자로 치환되고
    #로 바인딩 되는건은 setParameter 로 바인됭 되는 차이입니다.
  • 지나가다 2017/03/13 20:33 # 삭제 답글

    $는 사용하지 않는게 좋습니다.
    문자열 그대로 치환되기 때문에 SQL인젝션 해킹의 위험이 있습니다.
    때문에 대부분 실제 프로젝트에서는 mybatis에서 $ 사용을 금지합니다.
  • 감사감사 2017/03/22 14:37 # 삭제 답글

    고맙습니다.
    덕분에 고민을 덜었습니다.

    시퀀스를 조건에따라 달리 사용해야 하는데 #으로는 ?로만 보이고 오류가 발생하더군요.
    $를 사용하지 못하게하면 또다른 고민을 하게되겠네요.
댓글 입력 영역