MyBatis
[MyBatis] 파라미터 #과 $의 차이
황칠이
2021. 6. 21. 11:29
MyBatis에서 파라미터를 전달할 때
#{value}와 ${value}로 전달하는 경우를 볼 수 있는데
#를 사용하면 자동으로 '' 작음따옴표가 붙어서 문자열 형태로 사용이 가능하다.
반대로 $는 ''가 붙지 않는다.
mybatis에서 #{}로 변수를 사용하는 경우
다음과 같이 변수를 #{}로 전달하여 사용한다면
SELECT * FROM user_table WHERE userid = #{userid}
mybatis 실행시 쿼리문에 ?가 생기며 파싱된다.
SELECT * FROM user_table WHERE userid = ?
그 다음 PreparedStatement를 생성하여 위의 ?에 파라미터가 바인딩되어 수행된다.
파싱된 쿼리문을 재활용(캐싱)하기 때문에 효율적이다.
주의사항으로
#를 사용하면 자동으로 '' 붙기 때문에 문법오류에 주의하자
2번처럼 자동으로 ''가 붙는 것을 잊어버린다면
SQLSyntaxErrorException 에러가 발생할 수 있다.
mybatis에서 ${}로 변수를 사용하는 경우
변수를 ${}로 전달하여 사용한다면 값이 들어간 채로 쿼리문이 수행된다.
또한 ''이 붙지 않기 때문에 #{}보다 sql Injection에 취약해진다.
예를 들면
다음과 같은 쿼리를 사용한다고 하자
이때 id의 파라미터값으로
'' or 1=1
를 전달하게 된다면
SELECT * FROM user_table WHERE userid = '' or 1=1;
가 되며 조건과 상관없이 user_table의 모든 회원이 출력되게 된다.
만약 똑같은 쿼리를 #{} 사용했다면 문자열 형태로 전달되기 때문에
SELECT * FROM cws_user WHERE userid = ' '' or 1=1';
userid가 '' or 1=1인 문자열을 찾기 때문에 회원은 출력되지 않는다.