일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- bindmismatch
- iBatis # $
- 자바 병렬스트림
- oracle
- $
- 하이스트릭스
- bind mismatch
- binding
- ##
- java
- hystrix
- Multi Threading
- generic
- ForkJoinPool
- mismatch
- circuit breaker
- 바인딩
- 제네릭 리턴
- 제네릭
- generic return
- RESTful API
- parallelStream
- Netflix Hystrix
- 타입캐스트
- Type Cast
- 멀티스레드
- iBatis
- spring cloud
- $$
- #
- Today
- Total
Milk's development review
ibatis ##과 $$의 차이 본문
ibatis의 sql문에는 보통 변수처리를 해준다.
그때 사용하는 binding 방법이 ##과 $$을 이용한 방법이다.
결론부터 말하자면 다음과 같다.
1. DB관점에서 ##은 소프트 파싱, $$은 하드파싱
2. JDBC관점에서 ##은 파라미터 바인딩, $$은 문자열 replace
정도로 말할 수 있겠다.
한 가지 짚고 넘어가야 할게 ibatis의 모든 sql문은 preparedStatement로 수행된다.
즉, ##이든 $$이든 preparedStatement로 sql문이 수행된다.
예를 들어 아래와 같은 쿼리가 있다고 하자.
UPDATE test SET column1 = #var1# // var1은 String "aaa" , column2 = #var2# // var2는 String "bbb" WHERE column3 = $var3$ // var3은 String "ccc" |
위의 쿼리 sql문장은 아래와 같이 수행될 것이다. |
UPDATE test SET column1 = ? , column2 = ? WHERE column3 = ccc pstmt.setString(1, "aaa"); pstmt.setString(2, "bbb"); pstmt.execute(); |
DB입장에서는 $$은 이미 문자열로 치환되어서 쿼리가 수행되기 때문에 $$값이 달라지면 하드파싱하게 된다.
반면 ##은 변수를 이용한 바인딩 처리를 하기 때문에 이미 캐싱된 쿼리가 있다면 재사용이 가능하다.
그리고 눈여겨 볼점이 하나 있는데 ##의 경우 바인딩 될 변수의 자료형이 String이면 작은따옴표로 감싸지지만,
$$는 변수의 자료형과 관계없이 작은따옴표로 감싸지지 않는다.
즉, String의 경우 $$는 작은 따옴표 처리를 해주지 않으면 에러가 발생할 것이고 SQL Injection또한 가능하다.
[참조]