Milk's development review

ibatis ##과 $$의 차이 본문

Framework/iBatis, Mybatis

ibatis ##과 $$의 차이

YooMilk 2017. 7. 25. 10:15
반응형

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또한 가능하다.



[참조]

https://okky.kr/article/215103

http://egloos.zum.com/iceken/v/3975521

반응형
Comments