-
Mybatis에서 #{}와 ${}의 차이점에 대하여Backend/DB 2022. 6. 2. 21:30
Spring에서 Mybatis를 처음 사용할 때에 쿼리를 다 작성하고도,
해당 쿼리를 Mybatis로 옮기는 것이 낯설어서 버벅거리고 있는 중인데요.
동적으로 파라미터를 넘겨줄 일이 생겨서 이 부분에 대해서 어떻게 해결해야 될지 찾아보던 중,
#{} 와 ${}에 대해서 알게 되었습니다.
그런데 이 두 개의 차이점이 무엇일까 너무 궁금했습니다. 그래서 포스팅하게 되었습니다.
1.
<select id=""> some queries .... WHERE apply_status = 1 AND user_uid = #{userUid} some queries .... </select>
2.
<select id=""> some queries .... WHERE apply_status = 1 AND user_uid = ${userUid} some queries .... </select>
1. #{}
#{}의 경우에 parameter가 String으로 형 변환됩니다.
예를 들어서 userUid가 92229라고 쳤을 때에, '92229'가 되는 것입니다. 자동으로 따옴표가 붇는다는 것입니다. (자동으로 데이터 문자열로 인식)
Query Injection 을 예방할 수 있어서 유리합니다.
그리고, #{}를 사용하게 되면 컴파일이 미리 되어있어서 성능상 이점을 챙길 수 있다고 하는데, 이 부분은 실제로 제가 실험해보지를 못해서 보장 드릴 수는 없을 것 같습니다....
2.${}
${}의 경우에는 parameter가 대입하고자 하는 칼럼의 자료형에 맞추어 형 변환이 됩니다. (매개변수 값이 그대로 전달됩니다) 그래서 동적으로 값을 넣어주어야 할 때 사용됩니다. 하지만 쿼리 주입을 예방할 수 없어서 보안적인 측면에서 불리합니다.
동적으로 값을 넘겨주어야 할 때나, order by의 뒤에 사용됩니다.
감사합니다.
'Backend > DB' 카테고리의 다른 글