[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' 형태로 실행이 되어 에러가 난다.
'Database > MyBatis' 카테고리의 다른 글
[MyBatis] 중복 쿼리 줄여주는 sql, include, property 태그 문법 살펴보기 (3) | 2022.07.12 |
---|---|
[MyBatis] For input string: "문자" 오류 해결방법 (1) | 2021.08.27 |
[MyBatis] List 파라메터 foreach 사용 (INSERT, DELETE) - MySQL (0) | 2020.09.15 |
[MyBatis] 시퀀스 자동증가(NEXTVAL) 사용한 INSERT foreach 쿼리 (1) | 2020.04.08 |
[MyBatis] List 파라메터 foreach 사용 (INSERT, DELETE, MERGE, UPDATE) - Oracle (0) | 2019.08.13 |
댓글