일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 타입캐스트
- Netflix Hystrix
- 하이스트릭스
- hystrix
- binding
- 멀티스레드
- mismatch
- parallelStream
- spring cloud
- bind mismatch
- iBatis
- ForkJoinPool
- ##
- generic return
- Type Cast
- $$
- 바인딩
- 자바 병렬스트림
- #
- generic
- Multi Threading
- RESTful API
- 제네릭
- oracle
- iBatis # $
- bindmismatch
- circuit breaker
- java
- 제네릭 리턴
- $
- 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또한 가능하다.
[참조]