본문 바로가기
자료수집

MyBatis에서 샾(#{})과 달러(${})의 차이

by 3604 2022. 7. 21.
728x90

MyBatis에서 샾(#{})과 달러(${})의 차이

출처: https://madplay.github.io/post/difference-between-dollar-sign-and-sharp-sign-in-mybatis

마이바티스(MyBatis)mapper 쿼리문이 담긴 XML 파일에서 달러($) 기호 또는 샾(#) 기호를 사용하고 있음.

 

#{} 사용

 

ㅁ 샾(#{})을 사용한 쿼리문

 

<select id="select"resultType="String"parameterType="Map">

SELECT name AS name

FROM user

WHERE id = #{id}

</select>

 

XML

MyBatis에서 위와 같은#{}이 사용된 쿼리문이 실행되면

아래와 같이 쿼리문에?가 생기며 파싱됨

 

SELECT name AS name, email AS email

FROM user

WHERE id = ?

 

 

SQL

 

쿼리문을 작성할 때#{}을 사용하는 경우PreparedStatement를 생성하게 되는데

위의?에 파라미터가 바인딩되어 수행됨.

이렇게파싱된 쿼리문은 재활용(캐싱)되기 때문에 효율적임.

 

그리고 변수에 작은 따옴표(‘)가 자동으로 붙여 쿼리가 수행되기 때문에

'#{id}'와 같은 식으로 쿼리문을 작성하지 않아도 됨.

이러한 특성으로 테이블 설계가user_1,user_2과 같이 분리되어 구성되어 있을 때, 아래와 같은 식으로는 작성할 수 없음.

 

<select id="select"resultType="String"parameterType="Map">

SELECT name AS name

FROM user_#{tableId}

WHERE id = #{id}

</select>

 

 

 

XML

 

위 쿼리문이 수행되면tableId변수 양쪽에 따옴표가 붙기 때문에 SQLSyntaxErrorException오류가 발생함.

 

${} 사용

 

값이 넣어진 채로 쿼리문이 수행됨. 따라서, 파라미터의 값이 바뀔 때마다 항상 쿼리문 파싱을 진행해야 함.

, 성능상의 단점이 존재함.

 

그리고 쿼리문에#{}을 사용한 것과 다르게 작은 따옴표(‘)가 붙지 않기 때문에

아래처럼 테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있음.

 

<select id="select"resultType="String"parameterType="Map">

SELECT name AS name

FROM user_${id}

WHERE id = #{id}

</select>

 

XML

 

달러(${})를 사용한 경우SQL Injection에 취약한 점이 발생함.

 

 

SQL Injection

 

상황에 따라서 달라질 수 있겠으나 보안을 고려한다면#{}를 사용해야 함.

 

ㅁ 예시

 

<select id="selectUserFromTable"parameterType="Map"resultType="...">

SELECT *

FROM user

WHERE id = '${id}' AND password = '${password}'

</select>

 

XML

만일id파라미터의 값으로admin' --이 입력되는 경우

실제 파싱되는 쿼리문은 아래와 같음.

SELECT *

FROM user

WHERE id = 'admin' -- 'AND password = ''

 

SQL

,where절에서 비밀번호에 대한 조건은 사라지게 되어 id만 입력해도

관리자 계정 정보를 조회할 수 있게 됨.

이처럼 ${}를 사용하게 되는 경우 #{}을 사용하는 것보다 SQL Injection에 취약함.

 

 

 
728x90

'자료수집' 카테고리의 다른 글

hyper-v 가상화 이미지(vhdx)를 virtualbox 가상화 이미지(vhd)로 변환  (0) 2022.07.29
[자료수집] CUDA  (0) 2022.07.28
[데이터베이스] 인덱스란  (0) 2022.07.21
네트워크  (0) 2022.07.19
데이터베이스 활용  (0) 2022.07.01