본문 바로가기

MyBatis

MyBatis parameter 설정시 #, $ 차이점

반응형

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 변수등은 가급적이면 #{변수명} 과 같은 방식으로 사용하되, 필요에 따라 ${변수명} 방식으로 사용해도 나쁘지는 않다.
다만 사용자 조작등의 조작이 가능하므로 코드상에서 변수값등을 컨트롤하는등의 대응이 필요하다.