반응형
1. 문법의 차이
#1) #을 이용한 경우
<select id="select" resultType="String" parameterType="Map">
SELECT name FROM user WHERE id = #{id}
</select>
다음과 같은 SELECT문을 작성하였을경우 아래와 같이 ?에 파라미터가 바인딩 되어 수행된다 이렇게 파싱된 쿼리문은 재활용(캐싱)되므로 효율적이다.
SELECT name FROM user WHERE id = ?
또한 변수에 작은 따옴표(')가 붙어 쿼리가 수행되므로 '#{id}'라고 쿼리문을 작성할 필요가 없다. 대신 다음과 같이 사용할 수 없다. 아래와 같이 사용할 경우 user_'tableName'이 되어버리므로 에러가 발생한다.
<select id="select" resultType="String" parameterType="Map">
SELECT name FROM user_#{tableName} WHERE id = #{id}
</select>
#2) $를 이용한 경우
반면 $를 이용하게 되면 파라미터값이 바뀔 때마다 새로운 쿼리문의 파싱을 진행해야해서 성능상 단점이 존재한다.
또한 쿼리문에 #{}과 다르게 작은 따옴표(')가 붙지 않아서 테이블 이름이나 컬럼이름을 동적으로 결정할때 사용할 수 있다.
<select id="select" resultType="String" parameterType="Map">
SELECT name FROM user_${tableName} WHERE id = #{id}
</select>
2. SQL Injection 차이
보안적으로 #과 $에는 차이가 존재한다. #은 $보다 보안에 안전하다 다음과 같은 예시를 보자
<select id="select" parameterType="Map" resultType="...">
SELECT * FROM user WHERE id = '${id}' AND password = '${password}'
</select>
만약 이때 사용자가 id 값에 root' --를 입력했다고 가정하면 다음과 같은 결과를 초래한다.
SELECT * FROM user WHERE id = 'root' -- 'AND password = ''
사용자는 비밀번호를 입력하지 않았지만 뒷부분이 주석처리되어 로그인에 성공하게되어버린다 따라서 $는 #보다 SQL Injection에 취약하다
반응형
'프로그래밍 > 데이터베이스(DB)' 카테고리의 다른 글
[mybatis] fetchSize와 Cursor (0) | 2022.11.15 |
---|---|
[Mysql] #1. spring과 mybatis연동하기 / spring과 mysql 연동하기 (0) | 2020.04.23 |