mybatis - #, $ 차이

salgu·2022년 4월 18일
0

# 사용

<select id="select" resultType="String" parameterType="Map">
    SELECT
        name AS name
    FROM
        user
    WHERE
        id = #{id}
</select>

위의 쿼리문을 날리면 아래와 같이 파싱됩니다.

SELECT
    name AS name, email AS email
FROM
    user
WHERE
    id = ?

처음과 끝에 따옴표가(') 자동으로 붙습니다.
위와같이 ?로 파싱된 쿼리는 캐싱되어 다음 쿼리가 들어왔을때 파라미터만 바뀌게되어 호율적인 사용이 가능합니다.

$ 사용

<select id="select" resultType="String" parameterType="Map">
    SELECT
        name AS name
    FROM
        user_${id}
    WHERE
        id = #{id}
</select>

값이 넣어진 채로 쿼리문이 수행되고 파라미터의 값이 바뀔 때마다 항상 쿼리문 파싱을 진행해야 합니다.

#보다 캐싱되지않아 성능이 떨어집니다.

그리고 쿼리문에 #{}을 사용한 것과 다르게 작은 따옴표(‘)가 붙지 않기 때문에 아래처럼 테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있습니다.

$를 사용할때 parameter로 따옴표(')가 들어와버리면 파싱된 쿼리문이 의도치 않게 바뀌게 됩니다.
따라서 성능상 이유sql injection문제 때문에 # 을 쓰는것을 권장합니다.

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글