728x90
파라미터 매핑을 하는 데에 사용하는 $와 #
두가지의 차이에 대해 알아보도록 하겠다.
#
- PreparedStatement를 의미
- 파라미터가 String 형태로 들어와 자동으로(' ') 파라미터 형태가 됨
- #{user_id} 의 값이 'neeon'이라면 user_id = 'neeon' 형태가 됨
- 쿼리 주입을 예방할 수 있어 보안 측면에서 유리
- 정적인 방법을 사용하기 때문에 캐싱을 해서 재활용할 수 있어서 효율적임
$
- Statement를 의미
- 해당 컬럼의 자료형에 맞추어 파라미터의 자료형이 변경됨
- 파라미터가 바로 출력됨.
- 쿼리 주입을 예방할 수 없어 보안 측면에서 불리하므로 사용자의 입력을 전달할 때는 사용하지 않음 (SQL Injection)
- 테이블이나 컬럼명을 파라미터로 전달하고 싶을 때 사용함
차이점
1. #{}을 사용한 경우
<select id="select" resultType="String" parameterType="Map">
SELECT name FROM user WHERE id = #{id}
</select>
위의 문법대로 실행하게 되면
SELECT name FROM user WHERE id = ?
형태로 나오며.. 변수에 작은 따옴표(')가 붙어 쿼리가 수행되므로, '#{id}'라고 쿼리문을 작성할 필요가 없음.
대신 테이블이나 컬럼명을 #{}으로 받게 되면 작은 따옴표(')가 붙으므로 에러가 발생함
2. ${}을 사용한 경우
반면 $을 이용하게 되면 파라미터 값이 바뀔 때마다 새로운 쿼리문의 파싱을 진행해야 해서 성능상 단점이 존재함.
변수에 작은 따옴표(')가 붙지 않아 테이블 이름이나 컬럼이름을 동적으로 결정할 때 사용할 수 있음.
<select id="select" resultType="String" parameterType="Map">
SELECT name FROM user_${tableName} WHERE id = #{id}
</select>
위와 같은 느낌으로 ${}로 선언한 변수에 누가 sql문을 집어넣으면
형변환 없이 바로 뒤에 붙혀버리므로..
SELECT * FROM user WHERE id = 'root' -- 'AND password = ''
이런 식으로 쿼리를 자연스럽게 붙혀버릴 수도 있음. ;;
적재적소에 잘 사용하는 것이 중요하다.
728x90