개인 공부 (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 함수를 사용했다.