개인 공부 (23.07~
MyBatis 파라미터 바인딩 방법 2가지
Song쏭
2023. 8. 18. 23:57
1. #{ } 사용
prepared statement를 사용하여 값을 바인딩하며
SQL Injection의 위험을 줄인다.
그러나, 'LIKE' 절의 와일드카드와 함께 사용하면 예상대로 작동하지 않을 수 있다.
2. ${ } 사용
문자열 치환을 사용하여 값이 직접 SQL문에 삽입된다.
따라서 SQL Injection의 위험이 있다.
그러나, 이 경우 'LIKE'절의 와일드카드와 함께 잘 작동한다.
예제
어떠한 값을 조회하는 sql이 있다.
조건으로 와일드카드가 값 내부에 포함된다면
MyBatis는 해당 위치의 바인딩 파라미터인 #{ } 를 올바르게 인식하지 못한다.
Parameter index out of range (1 > number of parameters, which is 0). 이러한 오류가 발생한다.
(MyBatis가 '%#{location}%' 구조에서 '#{location}'을 올바르게 파라미터로 인식하지 못하여
"오류가 발생했습니다. 파라미터가 제공되지 않았습니다."와 같은 오류 메시지가 출력된 것이다.)
이러한 문제를 해결하기 위해서는
concat 함수나 ${ }를 사용해야한다.
where address like concat('%', #{location}, '%')
where address like '%${location}%'
다만, ${ } 사용은 SQL Injection위험이 있다고하여
나는 concat 함수를 사용했다.