출처: https://grandma-coding.tistory.com/entry/MyBatis-%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
#는 값에 사용한다.
$는 컬럼명이나 테이블 명에 사용한다.
예를 들어, 어떤 분류에 의한 게시글의 총 개수를 구하고자 한다.
Select count(id) count from board
{field} like '%{query}%'
and pub = #{pub}
위의 경우, {query}%’.
query는 단순 값이지만, #{}으로 꽂을 경우 ‘%’쿼리’%’의 형태가 되어 버린다.
따라서 #{}를 사용할 수 없다. 그러므로 ${}를 사용.
#{}
1.#{} 사용시 PreparedStatement 생성
2.PreparedStatement 매개 변수 값 안전하게 설정
3. PreparedStatement 가 제공하는 set 계열의 메소드를 사용하여 물음표(?)를 대체할 값을 지정.
4.들어오는 데이터 문자열로 인식하기 때문에 자동 따옴표 붙음
#{} 사용 이유
안전하고 빠르기 떄문에 선호.
Prepared (준비)
여기서 말하는 준비는 컴파일(Parsing) 을 이야기하며, 컴파일이 미리 되어있는 녀석이기에 Statement 에 비해 성능상 이점
{} 사용시 Statement 생성
2.Statement 매개변수 값 그대로 전달
3.그대로 전달 하기 떄문에 문자열에 따옴표가 붙지 않는다.
${} 사용 이유
다른 이유도 있겠지만 가장 큰 이유는 이거인거 같다.
바로 ORDER BY 함수를 사용할 때 오히려 자동 따옴표가 붙으면
함수가 안먹기 때문에 ${}를 써야한다.
덧붙여서 GROUP BY, 동적 쿼리에서 컬럼 이름이나 테이블 명을 사용할 때도
알아보니 $는 SQL Injection 에 취약해서 보안 문제가 있다고 한다.
필요한 때가 아니면 #을 쓰는 게 효율적인 측면이나 보안 측면에서 더 유리하다