본문 바로가기
MyBatis

[MyBatis] 샵#{} 과 달러${} 차이

by 네모세모동동 2024. 12. 9.

#{  }

: PreparedStatement를 만들어서 파라미터를 바인딩

 

파라미터들은 SQL문에서 ?으로 표시되며 구문 분석을 할 때 하나의 필드 값으로 인식한다.

따옴표로 묶은 하나의 값으로 인식한다.

<select>
	SELECT *
	  FROM USER
	 WHERE ID = #{파라미터명}
</select>

 

❗${} 보다는 보안상 더 안전해 많이 사용된다!

 

또한 캐시에 담아 재사용하기 때문에 반복적인 쿼리인 경우라면 더 효율적이다👍

 

 

 

${  }

문자열 그대로 SQL문에 들어간다.

#{}이 PreparedStatement와 비슷하다면 ${}는 Statement와 비슷하다.

 

🚨 ${}에는 싱글 쿼테이션이 붙으면 실행이 안된다!

 

싱글 쿼테이션을 붙여야하는 경우에는 바깥에 붙여줘야한다.  ➡️➡️  '${id}'

하지만 이렇게 하면 보안상 문제가 발생한다.

 

<select>
	SELECT *
	  FROM USER
	 WHERE ID = '${user_id}' AND PASSWORD = '${password}'
</select>

 

위 코드의 파라미터 중 user_id가 admin'-- 와 같이 들어온다면

SELECT *
  FROM USER
 WHERE ID = 'admin'-- ' AND PASSWORD = '${password}'

 

이처럼 ID 하나만으로 로그인이 가능하게 될지도 모른다.

 

보안상 취약하지만 값으로 들어갈 수 없는 곳에 변수를 쓰고 싶은 경우 사용한다. 

예시로 ORDER BY의 부분에 변수를 넣어주고 싶은 경우에 그렇다. ORDER BY에는 따옴표가 붙으면 안되기 때문이다.

<select>
    SELECT *
      FROM USER
     WHERE ID = #{user_id}
     ORDER BY ${컬럼명}
</select>

 


[출처]