Database/MyBatis

[MyBatis] #{ } 과 ${ } 차이

헹창 2020. 9. 4.
반응형

[MyBatis] #{ } 과 ${ } 차이

 

 

전자정부프레임워크 이클립스에서 쿼리문을 작성할 때 MyBatis를 이용해 XML에 쿼리문을 작성한다.

 

데이터 CRUD 로직을 구현하면서 파라메터를 작성할 때 #{ }으로 작성할 지, ${ }로 작성해야할 지, 차이가 무엇인지 크게 생각하지 않고 작성하는 경우가 많을 것이다.

 

 

과연 무슨차이가 있는 지, 왜 #{} 를 대체로 더 많이 사용하는지 어떨 때 ${}을 사용하는 지 살펴보자.

 

 

 

#{ }

 

1. 파라메터가 String 형태로 들어와 자동적으로 '파라메터' 형태가 된다.

 

예를들어, 

 

<select id="getOprInfo" parameter="java.lang.String" returnData="HashMap">
	SELECT USER_ID
		 , USER_NM
	  FROM M_OPR
	 WHERE USER_ID = #{userId}
</select>

 

다음 쿼리문에서 #{userId}의 userId 값이 "master"라면 쿼리문은 다음과 같이 USER_ID = 'master'의 형태로 실행된다.

 

<select id="getOprInfo" parameter="java.lang.String" returnData="HashMap">
	SELECT USER_ID
		 , USER_NM
	  FROM M_OPR
	 WHERE USER_ID = 'master'
</select>

 

2. 쿼리 주입을 예방할 수 있어 보안측면에서 유리하다.

 

 

 

 

${ }

 

1. 파라메터가 바로 출력된다.

 - 해당 컬럼의 자료형에 맞추어 파라메터의 자료형이 변경된다.

 

 

2. 쿼리 주입을 예방할 수 없어 보안측면에서 불리하다.

- 내부 데이터, 개인정보 등의 노출되면 안되는 데이터를 전달할 때는 사용하을 지양한다.

 

 

3.테이블이나 컬럼명, 예약어를 파라메터로 전달하고 싶을 때 사용한다.

- 여기서 #{}는 자동으로 '' 가 붙어 문자열이 되므로 이 경우에는 사용할 수 없다.

 

 

예를 들어,  사용자 조회 시 USER_ID 정렬에 따라 조회를 하고 싶을 경우라고 생각하자.

 

 

파라메터는 'DESC'   혹은 'ASC '   문자열이 날라올 것이다. 

 

<select id="getOprInfoList" parameter="java.lang.String" returnData="HashMap">
	SELECT USER_ID
		 , USER_NM
	  FROM M_OPR
	 ORDER BY USER_ID ${sortOrder}
</select>

 

 

위와 같이 ${sortOrder}를 사용하는 경우는 ORDER BY USER_ID DESC 형태로 실행이 되지만,

 

#{sortOrder}를 사용하게된다면 ORDER BY USER_ID 'DESC' 형태로 실행이 되어 에러가 난다.

 

 

 

 

 

728x90
반응형

댓글

추천 글