SQL에서 사용하는 ${}, #{} 의 차이

SoHEeeeeee·2023년 12월 29일
post-thumbnail

SQL에서 사용하는 ${}와 #{}는 각각 다른 목적으로 사용된다.


👩🏻‍💻${}: 동적 SQL 쿼리

${}는 쿼리 자체를 동적으로 만들 때 사용한다.
JSP나 서버에서 받은 매개변수 값을 쿼리에 그대로 삽입하는 방식이다.

이 덕분에 사용자가 입력한 값이나 프로그램 변수를 쿼리문에 직접 넣을 수 있다.
예를 들어, 테이블 이름이나 정렬 기준처럼 쿼리 구조를 바꾸고 싶을 때 유용하다

${}는 주로 JSP나 서버에서 받은 파라미터들을 쿼리에 직접 넣을 때 사용된다.
JSP나 컨트롤러에서 받은 값들을 ${param.xxx}와 같이 사용하여 쿼리에 동적으로 넣을 수 있다.

☘️예시

SELECT * FROM users WHERE id = ${param.userId}

👨🏻‍💻#{}: 매개변수 바인딩

#{}는 ORM(Object-Relational Mapping) 프레임워크인 MyBatis 등에서 주로 사용한다.
이건 SQL 쿼리를 작성할 때 변수나 값들을 쉽게 넣을 수 있게 도와준다.

프레임워크가 쿼리를 실행할 때,
#{}에 해당하는 값을 적절한 형태로 변환하여 삽입한다.
이는 SQL Injection 공격을 막아주는 핵심적인 방법이다.

☘️예시

 // Java 코드에서 userId를 받음
String userId = "123";

Map<String, Object> params = new HashMap<>();
params.put("userId", userId);
// MyBatis XML에서 userId를 활용한 SQL 쿼리
<select id="getUserById" parameterType="int" resultType="User">
  SELECT * FROM users WHERE id = #{userId}
</select>

🙋🏻‍♀️결론

  • ${}는 쿼리 구조 자체를 동적으로 변경할 때 사용하며, 사용자 입력이 그대로 삽입되어 SQL Injection에 취약할 수 있다. (JSP 등에서 직접 값을 받아서 사용하는 데 활용)
  • #{}는 값을 매개변수로 바인딩하여 쿼리에 삽입하며, SQL Injection을 방지하는 안전한 방식이다.

따라서 특별한 경우가 아니라면 보안을 위해 #{}를 사용하는 것이 권장된다고 한다.

profile
주니어 개발자

0개의 댓글