#{}
- 파라미터가 String 형태로 들어와 ""로 감싸진다.
- 쿼리문 작성 시 #{}의 경우에는 PreparedStatement를 생성하게 되는데 파라미터에 ?가 바인딩되어 수행된다.
- 예시로 #{user_id}의 user_id의 값이 abc일 경우 쿼리에는 'abc'의 형태가 된다
- 파싱된 쿼리문은 재활용(캐싱)되기 때문에 효율적이다.
- 쿼리 주입을 예방할 수 있어 보안 측면에서 유리하다.
${}
- 파라미터가 String 형태로 들어와 ""로 감싸지지 않아, 테이블이나 컬럼명을 파라미터로 전달하고 싶을 때 사용한다.
<select id="select" resultType="String" parameterType="Map">
SELECT
name AS name
FROM
user_#{tableId}
WHERE
id = #{id}
</select>
- 해당 컬럼의 자료형에 맞춰 파라미터의 자료형이 변경되기에 항상 쿼리문 파싱을 진행하여 성능상에 단점이 존재한다.
- 쿼리 주입을 예방할 수 없어 보안 측면에서 불리하다.