DB/Mybatis
Mybatis 에서 #{} 과 ${}의 차이
꼬바리
2021. 8. 18. 12:01
회사에 취직하고나서, 쿼리문을 작성하는데 이상한 점을 발견했다.
바로 Mybatis 를 이용해 XML에 쿼리문을 작성하는데, 파라메터 작성법이 그동안 내가 해왔던 것과는 다른 것이었다.
아래는 그동안 내가 써왔던 방식이다.
<select id="select_list" parameterType="HashMap" resultType="HashMap">
SELECT USER_NM
, USER_ID
FROM USER
WHERE USER_ID = ${USER_ID}
AND USER_PWD = ${USER_PWD}
</select>
그리고 이건 회사에서 사용하는 방식이다.
<select id="select_list" parameterType="HashMap" resultType="HashMap">
SELECT USER_NM
, USER_ID
FROM USER
WHERE USER_ID = #{USER_ID}
AND USER_PWD = #{USER_PWD}
</select>
무슨 차이가 있는지 보이는가? 바로 ${} 가 #{} 로 바뀌었다!
왜? 왜 $을 안쓰고 #을 쓸까? 너무 궁금해서 찾아보았다.
#{}
파라매터가 String 형태로 들어와 자동적으로 '파라메터' 형태가 된다.
예를들어, #{user_id}의 user_id의 값이 abc라면 쿼리문에는 USER_ID = 'abc'의 형태가 된다.
쿼리 주입을 예방할 수 있어 보안측면에서 유리하다.
${}
파라매터가 바로 출력된다.
해당 컬럼의 자료형에 맞추어 파라매터의 자료형이 변경된다.
쿼리 주입을 예방할 수 없어 보안측면에서 불리하다. 그러므로, 사용자의 입력을 전달할때는 사용하지 않는 편이 낫다.
테이블이나 컬럼명을 파라메터로 전달하고싶을 때 사용한다. #{}은 자동으로 ''가 붙어서 이 경우에는 사용할 수 없다.
<select id="select_list" parameterType="HashMap" resultType="HashMap">
SELECT ${COLUMN}
FROM USER
</select>
728x90
반응형