iBatis를 사용해서 구문을 만들 때 흔히 걸리는 것이 where title like "#title#%" 와 같은 구문을 적으면 에러를 발생한다는 것일 겁니다.
메뉴얼을 참고로 해서 where title like "$title$%"를 이용하면 title property가 저 자리에 그대로 치환되면서 사용할 수 있기는 합니다. 그런데 말 그대로 치환되는 것이기에 SQL injection 공격으로 인한 위험도 있습니다.
그래서 다른 방법으로 쓸 수 있는 것이 concat으로 프로퍼티와 %를 합쳐서 집어넣는 것입니다.
where title like concat ( #title# , '%' )
라고 적어주면 처음에 나온 의도했던 구문처럼 작동합니다.
참고로 실제로 SQL 구문이 어떻게 들어가고 있는지 보려면 log4j에서 java.sql을 DEBUG로 찍어보면 됩니다. Dynamic SQL을 사용할 때 제대로 작동하는지 확인할 때 변합니다.
log4j.properties 파일 안에
log4j.logger.com.ibatis=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
위와 같이 적어주면 관련된 명령 등을 대부분 볼 수 있을 겁니다.
SQL 쿼리문 관련해서는
log4j.logger.java.sql=DEBUG
이렇게 한 줄만 적어주어도 되고요.
위와 같이 찍어보면 #title#은 prepared statement에서 ?로 들어가고, $title$의 경우는 그 값이 그대로 치환되어서 들어가는 것을 확인할 수 있습니다.
Dynamic SQL 사용해보면 XML의 중첩 기능을 사용해서 다양한 구문을 만들어 낼 수 있는게 재미있습니다 :)
'웹 개발' 카테고리의 다른 글
prototype과 jquery 함께 사용하기. (0) | 2012.02.06 |
---|---|
프로그래밍 초보자가 알아야 하는 9 + 1 가지 (0) | 2011.07.21 |
String 형식을 Timestamp 형식으로 변환시키기 (0) | 2009.03.02 |
Entry의 발자취 : Etag (0) | 2009.01.30 |
proxy server를 apache의 mod_proxy를 이용해서 해결하기. (0) | 2009.01.16 |