결론만 간단히 얘기하자면
#{}는 ''가 씌워진 형태가 반환되고,
${}는 ''가 씌워지지 않은 형태가 반환된다.
<#{} 예시>
1
2
3
4
5
|
SELECT CODE,
NAME
FROM TP_TABLE
WHERE CODE = #{CODE}
AND NAME = #{NAME}
|
cs |
이 경우 아래와 같은 결과가 출력된다.
1
2
3
4
5
|
SELECT CODE,
NAME
FROM TP_TABLE
WHERE CODE = 'ABC'
AND NAME = 'ABCD'
|
cs |
<${} 예시>
1
2
3
4
5
|
SELECT CODE,
NAME
FROM TP_TABLE
WHERE CODE = ${CODE}
AND NAME = ${NAME}
|
cs |
1
2
3
4
5
|
SELECT CODE,
NAME
FROM TP_TABLE
WHERE CODE = ABC
AND NAME = ABCD
|
cs |
대개
#는 값에 사용한다.
$는 컬럼명이나 테이블 명에 사용한다.
---------------------------------------------------------------------------------------------------------
아래는 자세한 설명이다.
#{}
1.#{} 사용시 PreparedStatement 생성
2.PreparedStatement 매개 변수 값 안전하게 설정
3. PreparedStatement 가 제공하는 set 계열의 메소드를 사용하여 물음표(?)를 대체할 값을 지정.
4.들어오는 데이터 문자열로 인식하기 때문에 자동 따옴표 붙음
#{} 사용 이유
안전하고 빠르기 떄문에 선호.
Prepared (준비)
여기서 말하는 준비는 컴파일(Parsing) 을 이야기하며, 컴파일이 미리 되어있는 녀석이기에 Statement 에 비해 성능상 이점
${}
1.${} 사용시 Statement 생성
2.Statement 매개변수 값 그대로 전달
3.그대로 전달 하기 떄문에 문자열에 따옴표가 붙지 않는다.
${} 사용 이유
다른 이유도 있겠지만 가장 큰 이유는 이거인거 같다.
바로 ORDER BY 함수를 사용할 때 오히려 자동 따옴표가 붙으면
함수가 안먹기 때문에 ${}를 써야한다.
덧붙여서 GROUP BY, 동적 쿼리에서 컬럼 이름이나 테이블 명을 사용할 때도
알아보니 $는 SQL Injection 에 취약해서 보안 문제가 있다고 한다.
필요한 때가 아니면 #을 쓰는 게 효율적인 측면이나 보안 측면에서 더 유리하다.
댓글