Ibatis/Mybatis에서 ##, #{}, $$, ${} 차이점 (parameter 사용)
Ibatis 나 Mybatis를 이용하여 DB연동을 쉽게 하는 방법이 있습니다.
Ibatis가 이전 버전이고 Mybatis가 최신? 버전입니다.
이 둘 사이에는 SQL문에서 parameter를 작성하는 방식이 다르더라고요.
Parameter 작성 법
1. #Parameter#/ #{Parameter}
이 방법을 사용하는 이유에 대해서 말씀드리겠습니다.
변수를 이용한 바인딩 처리로, 재사용성이 높으며, $를 이용한 변수 사용과는 다르게 String 자료형이 오면 자동으로 ' ' 작은따옴표 처리를 해주게 됩니다.
#을 이용한 변수 사용을 하게 되면 PreparedStatement를 사용하게 됩니다.
#IBatis
SELECT * FROM worker WHERE name = #parameter#
#MyBatis
SELECT * FROM worker WHERE name = #{parameter}
이런 식으로 작성할 것입니다.
2. $Parameter$ / ${Parameter}
$를 이용한 변수처리는 자료형에 관계없이 작은따옴표를 Parameter에 감싸지 않는다고 합니다.
작은따옴표로 처리하지 않으면 Column이나 이름을 찾지 못한다는 Error가 발생한다고 합니다.
이러한 경우에 Query문에 1=1이라는 조건을 걸게 되면, SQL이 무조건 True로 되기 때문에 비정상적으로 쿼리문이 실행할 수 있는 SQL Injection 공격을 할 수 있기 때문에 작은 따옴표 처리를 직접 해줘야 합니다.
#IBatis
SELECT * FROM worker WHERE name = '$parameter$'
#MyBatis
SELECT * FROM worker WHERE name = '${parameter}'
이렇게 말이죠?
3. 권장 사항
$를 이용하여 변수를 할당하면 Prepared Statement를 사용하지 않고 그냥 Statement를 사용한다고 합니다. 그래서 쿼리문이 변경되면 쿼리문을 다시 파싱 하는 작업을 진행하기 때문에 속도가 저하되는 단점이 있습니다.
또한, SQL Injection의 공격을 받을 수 있습니다.
그래서 대부분 SQL 문을 작성할 때 #을 이용한 방식을 사용하라고 권장한다고 합니다.
감사합니다 츄르 사려고 코딩하는 집사님