티스토리 뷰
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
- Asynchronous
- 해시
- 동기
- 프로그래머스 Level 3
- 핸들러 인터셉터
- 블로킹
- Handler Interceptor
- 프로그래머스 Level 1
- 인터셉터
- Filter
- 논블로킹
- http://www.nextree.co.kr/p6960/
- blocking
- Synchronous
- 프로그래머스
- a
- 비동기
- non-blocking
- 프로그래머스 Level 2
- 코딩테스트 고득점 Kit
- 스택/큐
- 필터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |