웹 개발2009. 3. 5. 16:40

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


위와 같이 적어주면 관련된 명령 등을 대부분 볼 수 있을 겁니다.
SQL 쿼리문 관련해서는

log4j.logger.java.sql=DEBUG


이렇게 한 줄만 적어주어도 되고요.

위와 같이 찍어보면 #title#은 prepared statement에서 ?로 들어가고, $title$의 경우는 그 값이 그대로 치환되어서 들어가는 것을 확인할 수 있습니다.


Dynamic SQL 사용해보면 XML의 중첩 기능을 사용해서 다양한 구문을 만들어 낼 수 있는게 재미있습니다 :)

Posted by net4all