티스토리 뷰

ORM & SQL Mapper

#{}, ${} 차이

wavid 2020. 11. 26. 03:16

MyBatis에서 쿼리문 작성 시 보통 #{}을 주로 사용하고, ${} 사용하는 경우는 거의 없었는데, 둘 차이는 무엇이고 어떤 역할인지 알아보도록 하자.

 

#{} -> 바인딩 변수를 이용한 SQL문 처리 시 사용

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

위와 같이 MyBatis 쿼리를 작성할 경우 MyBatis로 하여금 PreparedStatement를 만들어서 PreparedStatement 파라미터에 값을 셋팅하도록 할 것이다. 결과적으로는 아래와 같이 바인드변수를 입력받는 쿼리가 수행될 것이다.

그리고 저 ?에 실제로 수행하려는 파라미터가 입력이 되어진다고 보면 된다.

 

SELECT * FROM user WHERE id = ?

바인드 변수를 이용한 쿼리문이기 때문에 한번 DB에 캐싱되면 다음에 파라미터값이 변경된 쿼리를 요청할 때에도 하드파싱하지 않고, 소프트파싱을 통해서 해당 쿼리를 수행하기 때문에 성능 측면에서 상당히 유용한 방식이라고 할 수 있다.

또한 변수에 작은 따옴표(‘)가 자동으로 붙여 쿼리가 수행되기 때문에 '#{id}'와 같은 식으로 쿼리문을 작성하지 않아도 된다. 

 

${} -> 단순 문자열 치환 시 사용

${} 이거는 단순히 문자열 치환할 때 사용하는 것이라고 보면 된다.

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

만약 id값이 1이라면 아래와 같은 쿼리가 만들어질 것이다.

SELECT * FROM user_1 WHERE id = 1

쿼리문 안에 ${}를 원하는 값으로 단순 문자열을 치환해주는 역할이라고 보면 된다.

${}를 사용 시 SQL Injection으로 악용될 여지가 있으므로, 주의해야 한다.

<select id="selectUserFromTable" parameterType="Map" resultType="...">
    SELECT * FROM user WHERE id = '${id}' AND password = '${password}'
</select>

위의 쿼리에서 만약 id값이 "admin' --"로 들어갈 경우, 아래와 같은 쿼리가 만들어 질 것이다.

SELECT * FROM user WHERE id = 'admin' -- 'AND password = ''

id가 admin인 어드민의 정보가 조회될 것이고, 뒤에 조건문들은 주석처리가 될 것이다.

 

[참고 및 출처]

madplay.github.io/post/difference-between-dollar-sign-and-sharp-sign-in-mybatis

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함