header-img
Info :
  1. #
  2. $
  3. 차이점
728x90

 

파라미터 매핑을 하는 데에 사용하는 $#

두가지의 차이에 대해 알아보도록 하겠다.

 

#

  • PreparedStatement를 의미
  • 파라미터가 String 형태로 들어와 자동으로(' ') 파라미터 형태가 됨
  • #{user_id} 의 값이 'neeon'이라면 user_id = 'neeon' 형태가 됨
  • 쿼리 주입을 예방할 수 있어 보안 측면에서 유리
  • 정적인 방법을 사용하기 때문에 캐싱을 해서 재활용할 수 있어서 효율적임

 

$

  • Statement를 의미
  • 해당 컬럼의 자료형에 맞추어 파라미터의 자료형이 변경됨
  • 파라미터가 바로 출력됨.
  • 쿼리 주입을 예방할 수 없어 보안 측면에서 불리하므로 사용자의 입력을 전달할 때는 사용하지 않음 (SQL Injection)
  • 테이블이나 컬럼명을 파라미터로 전달하고 싶을 때 사용함

 

차이점

 

1. #{}을 사용한 경우

<select id="select" resultType="String" parameterType="Map">
    SELECT name FROM user WHERE id = #{id}
</select>

 

위의 문법대로 실행하게 되면

SELECT name FROM user WHERE id = ?

 

형태로 나오며.. 변수에 작은 따옴표(')가 붙어 쿼리가 수행되므로, '#{id}'라고 쿼리문을 작성할 필요가 없음.

대신 테이블이나 컬럼명을 #{}으로 받게 되면 작은 따옴표(')가 붙으므로 에러가 발생함

 

2. ${}을 사용한 경우

반면 $을 이용하게 되면 파라미터 값이 바뀔 때마다 새로운 쿼리문의 파싱을 진행해야 해서 성능상 단점이 존재함.

변수에 작은 따옴표(')가 붙지 않아 테이블 이름이나 컬럼이름을 동적으로 결정할 때 사용할 수 있음.

<select id="select" resultType="String" parameterType="Map">
    SELECT name FROM user_${tableName} WHERE id = #{id}
</select>

 

위와 같은 느낌으로 ${}로 선언한 변수에 누가 sql문을 집어넣으면

형변환 없이 바로 뒤에 붙혀버리므로..

SELECT * FROM user WHERE id = 'root' -- 'AND password = ''

 

이런 식으로 쿼리를 자연스럽게 붙혀버릴 수도 있음. ;;

 

 

적재적소에 잘 사용하는 것이 중요하다.

 

 

 

728x90
더보기
BACKEND/SpringBoot