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
'스프링부트 관련(spring boot, mybatis)' 카테고리의 다른 글
[spring boot] post request에 DTO 사용할때 데이터 넣어도 null 발생 (0) | 2024.05.05 |
---|---|
mybatis에서 ENUM 받아 사용하기 (1) | 2024.02.06 |
Mybatis에서 Pageable 사용하기 (0) | 2024.02.04 |
bindingResult 가 무엇일까? (feat. Valid) (0) | 2024.02.01 |
logger를 사용할 때 static을 붙이고 안붙이고 차이가 무엇일까? (0) | 2024.01.31 |