#{ }
: 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>
[출처]
'MyBatis' 카테고리의 다른 글
[MyBatis] <![CDATA[ ]]> 사용해서 부등호 처리하기 (0) | 2025.03.06 |
---|---|
[MyBatis] if 조건절 문자열 비교하기 (0) | 2024.11.11 |