728x90
요즘 iBatis를 Mybatis로 바꾸는 작업을 많이 하고 있습니다.
ParameterMap은 쿼리실행을 위한 파라미터를 매핑할 때 사용합니다.
최근엔 사용하지 않는 방식입니다.
* 기존 iBatis 방식
[▽iBatis에서 ParameterMap을 사용하는 예시]
<parameterMap id="userMap" class="User">
<parameter property="id" jdbcType="INTEGER" mode="IN"/>
<parameter property="name" jdbcType="VARCHAR" mode="IN"/>
<parameter property="birthdate" jdbcType="DATE" mode="IN"/>
</parameterMap>
* 개선된 Mybatis 방식
Mybatis에서는 이전보다 개선된 방식을 사용합니다.
[▽Mybatis에서 ParameterMap을 대체하는 예시]
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
parameterType 속성을 사용하면 parameterMap을 사용할 필요없이
각 프로퍼티를 자동으로 바인딩해줍니다.
(※참고로 parameterType은 구문에 전달될 파라미터의 패키지 경로를 포함한 전체 클래스명이나 별칭을 의미합니다. )
* #{ } vs ${ }
Mybatis에서는 파라미터를 바인딩 할 때, #{ } 또는 ${ } 를 사용합니다.
일반적으로 #{ }를 사용하고, 테이블명이나 컬럼명을 동적으로 바꾸고 싶을 때는 ${ }를 사용합니다.
( ※ #{ }을 권장합니다.)
#{ }은 ' '(작은따옴표)로 감싸지기 때문에 SQL injection공격을 예방할 수 있습니다.
- #{}: 이 방식을 사용하면 MyBatis는 JDBC PreparedStatement를 사용하여 SQL 쿼리를 실행합니다. 쿼리 내에 ?를 사용하여 파라미터를 바인딩하며, 실제 값은 내부적으로 PreparedStatement에 설정됩니다.
- ${}: 이 방식은 파라미터 값을 직접 SQL 문자열에 삽입합니다.(SQL injection에 취약한 이유입니다.) 이는 문자열 치환으로 작동하며, PreparedStatement를 사용하지 않습니다.
세 줄 요약
1. 요즘엔 ParameterMap 안쓴다
2. Mybatis에서는 #{ }로 바인딩하면 된다.
3. 끝
Reference
- Mybatis 공식 문서 https://mybatis.org/mybatis-3/ko/sqlmap-xml.html
728x90