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
TOP