#{}
쿼리문을 작성할 때 #{}을 사용하는 경우 PreparedStatement를 생성하게 되는데 ?에 파라미터가 바인딩되어 수행된다. 이렇게 파싱된 쿼리문은 재활용(캐싱)되기 때문에 효율적이다.
그리고 변수에 작은 따옴표(‘)가 자동으로 붙여 쿼리가 수행되기 때문에 '#{id}'와 같은 식으로 쿼리문을 작성하지 않아도 된다.
${}
값이 넣어진 채로 쿼리문이 수행된다. 그렇기 때문에 파라미터의 값이 바뀔 때마다 항상 쿼리문 파싱을 진행해야 하며 성능상의 단점이 존재한다.
그리고 쿼리문에 #{}을 사용한 것과 다르게 작은 따옴표(‘)가 붙지 않기 때문에 아래처럼 테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있고 SQL 인젝션에 취약하다.
SQL Injection 문제
<select id="selectUserFromTable" parameterType="Map" resultType="...">
SELECT
*
FROM
user
WHERE
id = '${id}' AND password = '${password}'
</select>
id가 --' 라면 실제 파싱되는 쿼리문
SELECT
*
FROM
user
WHERE
id = 'admin' -- 'AND password = ''
password 에 대한 조건이 사라짐
'업무' 카테고리의 다른 글
log4j2 (3) | 2024.01.28 |
---|---|
mybatis 개발 (1) | 2024.01.26 |
마이바티스 문법 모음 (0) | 2024.01.23 |
[SQL] SELECT 쿼리 실행 순서 처리 과정 (0) | 2024.01.22 |
[MyBatis] 설정파일 (0) | 2024.01.22 |