#{value}
기본적으로 문자열 형식이기 때문에 자동으로 따옴표가 붙게 된다.
SELECT * FROM DEPT WHERE NAME="홍길동"
${value}
문자열 형식이 아니기 때문에 컬럼의 값이나 문법에 사용되는 sql 곳곳에 사용할 수 있다.
SELECT FROM DEPT WHERE #{NAME} = "홍길동" (X) : NAME이 문자열로 인식되어 값은 False고 검색이 안됨.
SELECT FROM DEPT WHERE ${NAME}="홍길동" (O) : NAME이 컬럼명으로 인식되어 검색가능.
출처 : https://sourcestudy.tistory.com/470
#{value} 는 preparedStatement로 Sql injection을 방지할 수 있으나, ${value}는 Sql injection에 방지할 수 없는 취약점이 발견되었으므로... order by와 같은 절에서만 사용하는 게 좋을 것 같다. 어쩔 수 없이 ${value}를 사용해야하는 경우... SQL injection 처리와 특수문자열 이스케이프 처리를 따로 해주어야 한다.
참고 : sql injection 방지 라이브러리(maven)
발생한 사례 :
AND writer LIKE '%${sname}%'
여기서 ${sname}의 값으로
작은따옴표(')나,
mybatis 파라미터 형식(#{}) 이 대입됬을때
escape가 필요했음!!!