Mybatis 동적 쿼리, #{}과 ${}의 차이

mybatis를 사용하면서 검색을 구현하려다가 like쿼리에서 에러(Parameter index out of range)가 발생했다. 일반적으로 mybatis에서 인자로 받은 변수는 #{변수명}과 같이 사용한다. 이때 저 변수명은 "문자열"로 출력된다. 만약 문자열이 아니라 안의 글자 값 자체를 그대로 사용하고 싶다면 #대신 $를 사용하면 된다.

LIKE "%#{param}%" // 오류 발생
LIKE "%${param}%"
LIKE CONCAT('%',#{search},'%')

 

#을 사용한 경우

?(preparedStatement) 부분에 인자로 들어온 문자열이 들어간다. 문자열 안에 문자열을 넣어버려서 에러가 발생했다.

 

$를 사용한 경우

검색 그 자체가 바로 들어가는 것을 볼 수 있다.

 

$를 사용할 경우 SQL Injection 공격을 당할수 있으니 주의해야한다.

mysql 기준 문자열을 합치는 함수를 이용해 #를 사용해 문제를 해결했다.

 

++ $를 사용하면 캐싱이 안된다고 한다.

 

참고

https://zorba91.tistory.com/18

 

https://logical-code.tistory.com/25

 

https://dev-jejecrunch.tistory.com/3