Backend/DB

Mybatis에서 #{}와 ${}의 차이점에 대하여

GreatSaiyaman 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의 뒤에 사용됩니다.

감사합니다.