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)을 사용하는 것이 좋을 것 같다.
항상 안전을 중요시하는 습관을 들이는 것이 중요하니 잘 참고하자!
📜참고
'IT > Java' 카테고리의 다른 글
Parameter와 Argument를 구분하는 방법 (0) | 2023.11.02 |
---|---|
substring으로 문자열 첫 글자를 구분해보자 (0) | 2023.10.31 |
==와 equals, 어떨 때 사용해야 하지? (0) | 2023.10.30 |
[Java] 객체 지향 프로그래밍, Java (0) | 2022.10.02 |
Java8에서 변경된 사항들에 대하여 (0) | 2022.10.02 |