DB/myBatis

[MyBatis] #{}와 ${}의 차이점

꾹꾹이 2021. 11. 24.
728x90

결론만 간단히 얘기하자면

#{}''가 씌워진 형태가 반환되고,

${}''가 씌워지지 않은 형태가 반환된다.

 

<#{} 예시>

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 에 취약해서 보안 문제가 있다고 한다.

필요한 때가 아니면 #을 쓰는 게 효율적인 측면이나 보안 측면에서 더 유리하다.

 

 

참조:https://java119.tistory.com/39

댓글