728x90
검색조건을 DB 데이터화 시켜서 관리하려고 하는 경우 테이블명, 컬럼명, 연산자 등을 저장까지는 했는데 꺼내 쓸 때 당황한 경험이 있다. 왜냐하면 그 동안 '#{변수명}'으로만 사용해왔기 때문에 value가 아닌 name으로 사용하면 따옴표가 붙게되어 오류가 발생한다. 이를 해결할 수 있는 문법이 바로 '${변수명}'이다. 두 문법의 차이를 좀 더 자세하게 설명하겠다.
사용 예제
1) #{}
/** #{} 사용예제 */
<select id="" parameterType"" resultType="">
SELECT PAY_ID, AMOUNT, CATEGORY_NM
FROM PAYMENT
WHERE #{column} #{operator} #{value}
</select>
/** #{} 사용결과 */
SELECT PAY_ID, AMOUNT, CATEGORY_NM
FROM PAYMENT
WHERE 'CATEGORY_NM' '!=' 'CARD'
2) ${}
/** ${} 사용예제 */
<select id="" parameterType"" resultType="">
SELECT PAY_ID, AMOUNT, CATEGORY_NM
FROM PAYMENT
WHERE #{column} #{operator} #{value}
</select>
/** ${} 사용결과 */
SELECT PAY_ID, AMOUNT, CATEGORY_NM
FROM PAYMENT
WHERE CATEGORY_NM != CARD
3) 올바른 사용예제
/** 올바른 사용예제 */
<select id="" parameterType"" resultType="">
SELECT PAY_ID, AMOUNT, CATEGORY_NM
FROM PAYMENT
WHERE ${column} ${operator} #{value}
</select>
/** 올바른 사용결과 */
SELECT PAY_ID, AMOUNT, CATEGORY_NM
FROM PAYMENT
WHERE CATEGORY_NM != 'CARD'
#{}와 ${}의 차이
1) #{}
- 파라미터가 String 형태로 된다. [ ex) 'value' ]
- SQL Injection에 강하다.
2) ${}
- 파라미터 그 자체가 된다.
- SQL Injection에 취약하다.
*SQL Injection이란 사용자가 악의적인 목적으로 파리미터값을 조작해서 넘겨서 원하는 데이터를 탈취하는 것이다.
728x90
'Persistence > SQL Mapper' 카테고리의 다른 글
Mybatis에서 파라미터 타입(parameterType) 2개 이상 넘기는 법 (0) | 2021.11.24 |
---|