[MyBatis] #{}, ${}

hamonjamon·2023년 2월 15일
0

#{}

  • 사용 시 PreparedStatement 생성한다.

  • PreparedStatement가 제공하는 set 계열의 메서드를 사용하여 물음표를 대체할 값을 지정한다.

  • 들어오는 데이터를 문자열(String)로 인식하여, 자동 따옴표가 붙는다.

  • SQL Injection을 예방할 수 있어 보안 측면에서 유리함.

  • 사용 이유

    • PreparedStatement란 친구는 수행 시 물음표값에 Parameter가 바인딩되어 수행된다.
    • 이는 Parameter 값이 바뀌어도 같은 쿼리로 인식한다는 의미로, 이렇게 파싱된 쿼리는 재활용되기에(캐싱) 성능 상 이점을 갖는다.
  • 결론

    • #{} 값에 자동으로 따옴표가 붙고 성능이 좋다.

${}

  • 사용 시 Statement를 생성한다.
  • Statement란 친구는 Parameter 값을 그대로 전달하기에 문자열에 따옴표가 붙지 않는다.
  • 항상 쿼리문에 대한 파싱이 진행되어 처리 속도가 저하될 수 있다는 단점이 존재한다.
  • SQL Injection을 예방할 수 없어, 보안 상 불리하다는 단점이 존재한다.
    • SQL Injection : 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위
  • 사용 이유
    • 테이블, 컬럼명을 전달하고자 할 때 사용되곤 한다.
  • 결론
    • ORDER BY하고 싶은 컬럼이 있을 때 파라미터를 통해 ASC, DESC를 설정하고 싶은 경우 #{}를 사용할 경우 따옴표가 붙어 'ASC','DESC'같이 변환되어, 원하는대로 동작되지 않기에 이 경우가 아니라면 굳이 ${}를 써야하나 싶다.

0개의 댓글