iBatis 를 처음 사용하면서 삽질을 통해서 모르는 것들을 하나하나 배워가고 있다. ㅡ0-);
어제는 parameterClass에 Map을 전달하는 과정에서 생기는 특이사항을 제대로 이해하지 못해서 생긴 해프닝을 기록한다.

iBatis에 com.google.common.collect.ImmutableMap 으로 생성한 Map 객체를 parameter로 넘겼다.
이때 들어간 객체들에는 Double형, String 형 두 가지가 있었다. 이 parameter들이 들어가는 위치가 계산식이냐 일반 키워드처럼 들어가느냐에 따라서 Double형과 String형의 표현 방식이다.

iBatis가 SqlMap에 작성한 쿼리에 파라메터를 넣을 때, 파라메터 객체의 속성에 따라서 Double 형은 그대로, String 형은 ''를 씌워서 넣어준다.
난 이걸 제대로 숙지하지 못해서 문제가 발생했다.

//properties 에 기록해둔 message 중에서 하나를 saveRate에 넣음
String saveRate = 3;
//메소드를 이용하여  산출된 수치
Double exchangeRate = 15.36;
 

   Select 절에 alias 형태로 들어갈 경우  
 
SELECT
    #saveRate# as save_rate
    , #exchangeRate# as exchageRate
FROM dual;

위의 형태에서는 String 형이건 Double 형이건 문제가 생기지 않는다. 

   계산을 하는 곳에 파라메터로 전달되거나 ISNULL 처리 등에 사용될 경우 
 

SELECT
    (100 - (5 * #saveRate#)) as product_price_rate
    , ( 14.55 * #exchangeRate# ) as product_exchange_rate
FROM dual;

 위의 형태로 했을 때는 별 문제가 없을까? ㅡ_-)?
 #exchageRate# 는 그대로 15.36 이 들어가면서 계산식에 문제가 없지만, #saveRate#의 경우에는 ( 100 - ( 5 + '3' ) ) 의 형태가 되면서 JDBC를 통해서 Exception 처리가 뜬다. 숫자형이 들어와야하는 곳에 문자열이 들어왔다고 하면서 파라미터가 잘못되었다는 메시지를 뿌린다.
췟... 이걸 제대로 알고 있지를 못해서 혼자 삽질을 하고 있었다. 
  위의 쿼리를 제대로 실행되게 하려면,

SELECT
    (100 - (5 * $saveRate$)) as product_price_rate
    , ( 14.55 * #exchangeRate# ) as product_exchange_rate
FROM dual;

String 형 파라메터를 계산식에 사용할 경우에는 $saveRate$ 처럼 $ $를 이용해서, 파라메터 클래스고 가지고 있는 값을 그대로(parameterClass의 종류에 상관없이) 입력하도록 만들면 된다. 이걸 제대로 이해하고 있지 못한 나의 무지함 때문에, 난 또 그렇게 3~4시간의 삽질을 혼자했던 거다...
크흑....

   결론 
 

1. 쿼리문을 제대로 읽어서 parameter 들이 들어가야하는 곳에 문자열이 들어가는 것인지 숫자형이 들어가는지 파악한다.
2. iBatis를 통해서 받는 parameterClass="Map"인 경우에는 Map에 담긴 객체들이 어떤 것인지 파악한다.
3. String으로 받은 파라메터 객체를 계산식에 사용할 경우에는, $ $를 이용해서 그대로 넣는다.



String 은 Charecter Line을 나타낸다. Character Line 객체는 변형되지 않기 때문에 공통으로 사용할 수 있다.
그 값을 바꾸기 위해서는 필요에 따라 대입을 시켜줘야 한다.

StringBuffer는 Thread를 사용할 수 있는 변형이 가능한 캐릭터라인이다. 
예를 들어,
 StringBuffer z = "start";
라고 한 경우, 
z.append("le")라고 하면 z의 내용은 "startle"가 되며, z.insert(4,"le")라고 하면 z의 내용은 starlet가 된다.

두 클래스 다 직렬화(Serializable)를 지원하는구나. ㅡㅅ-);;

참고 : http://hongsgo.egloos.com/2033998 요 글을 보면, String < StringBuffer < StringBuilder 속도 차이가 있다. 흠... String은 적게 쓰는게 좋군요. ㅡㅅ-);;

참고 : http://cacky.tistory.com/36

  • String : 변경되지 않는 Character 문자열 객체
    문자열이 변경되지 않을 경우에는 String 사용
  • StringBuffer : 값이 변경 가능 // 동기화 가능 : 다중 스레드 일 경우에 사용
    문자열이 변경되고 다중 스레드에서 사용될 경우 사용
  • StringBuilder : 값이 변경 가능 // 동기화 되지 않음 : 단일 스레드일 경우에 사용
    문자열이 변경되고, 단일 스레드에서 사용될 경우 사용

+ Recent posts