Mybatis에서 ${}과 #{}의 차이

Mybatis에서 동적 SQL 작성에 필수적인 ${}와 #{}의 차이점과 사용 방법을 설명한다.

${}는 문자열 치환으로 SQL Injection 위험이 있어 안전하지 않다.

반면, #{}는 PreparedStatement를 이용한 값 바인딩으로 SQL Injection을 방지하며, 안전하고 디버깅이 쉽다.

일반적으로 보안을 위해 #{} 사용이 바람직하다.

 

 

 

✨시작하며

Mybatis는 데이터베이스와의 상호 작용을 돕기 위해 동적 SQL 작성에 유용한 기능을 제공해 준다.
여기서 주로 사용되는 $과 #의 차이점에 대해 알아두고, 상황에 따라 적절한 방법으로 사용하는 것이 좋겠다고 생각되어 정리하게 되었다.

 

 

 

${}와 그 사용 예시

${}은 파라미터가 문자열로 치환되기 때문에 SQL Injection이 발생할 수 있다.
따라서 이것은 안전하지 않은 방법으로 간주되며, 파라미터와 함께 사용해서는 안 된다.

SELECT * FROM users WHERE name = ${name}

 

 

 

#{}와 그 사용 예시

#{}은 PreparedStatement를 사용하여 값 바인딩을 진행하므로 SQL Injection을 방지할 수 있다.
안전하여 특정 유형의 값만 처리할 수 있고, 디버깅이 쉽다!

SELECT * FROM users WHERE name = #{name}

 

 

 

차이점을 정리해 보자

  ${}(Dollar Sign) #{}(Sharp Sign)
바인딩 방식 Statement PreparedStatement
안전성 낮음 높음
SQL Injection 발생 가능성 있음 차단

 

일반적으로는 보안과 안전성을 위해 #{}(Sharp Sign)을 사용하는 것이 바람직하고, 동적 테이블 이름이나 칼럼 이름 등에만 ${}(Dollar Sign)을 사용하는 것이 좋을 것 같다.
항상 안전을 중요시하는 습관을 들이는 것이 중요하니 잘 참고하자!

 

 

 

📜참고