。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

업무

[MyBatis] #{}과 ${}

quarrrter 2024. 1. 24. 09:20

#{}

쿼리문을 작성할 때 #{}을 사용하는 경우 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