MyBatis 설정시 #, $ 차이점
Back-End/MyBatis 2019. 6. 5. 17:54mybatis를 사용하다 보면 SQL문을 작성할때 전달받은 parameter 변수를 지정해주게 되는데
일반적으로 #{변수명} 과 같은 방식으로 작성을 많이 한다.
하지만 mybatis 에서는 #{변수명} 이외에도 ${변수명} 방법도 사용할 수 있다. 이 둘의 차이점은 다음과 같다.
1. #{변수명}
<
sql
id
=
"test"
parameterType
=
"hashmap"
>
SELECT
*
FROM
TB_member
WHERE
id = #{id}
</
sql
>
위와같이 #{변수명} 으로 사용하게 되면 mybatis는 preparedStatement 객체에 자동으로 id를 set 해주게 된다.
즉 SELECT * FROM TB_member WHERE id = ? 형식으로 전환이 되고 해당 변수를 set 해준다.
2. ${변수명}
<
sql
id
=
"test"
parameterType
=
"hashmap"
>
SELECT
*
FROM
TB_member
WHERE
id = ${id}
</
sql
>
해당 방식으로 지정시 해당 변수가 쿼리에 포함이 된다.
즉 SELECT * FROM TB_member WHERE id = 'test' 형식으로 SQL이 실행된다.
컬럼명이나 테이블명이 동적으로 변경되어야 할때 사용하면 좋은데, 해당 방법의 최대 단점은 악의적으로 parameter 조작시 보안에
안전하지 못하다는 것이다.
SQL Injection 공격등에 취약하다.
parameter 변수 등은 가급적이면 #{변수명} 과 같은 방식으로 사용하되, 필요에 따라 ${변수명} 방식으로 사용해도 나쁘지는 않다.
출처: https://fruitdev.tistory.com/70 [과일가게 개발자]