MyBatis 설정시 #, $ 차이점

Back-End/MyBatis 2019. 6. 5. 17:54
728x90
반응형

mybatis를 사용하다 보면 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 [과일가게 개발자]







728x90
반응형
: