Mybatis_#{}, ${} 차이

SG Jang·2021년 2월 26일
0

길잡이를 자바보자

목록 보기
10/12
post-thumbnail

이번 시간에는 "MyBatis_#{}, ${} 차이"에 대해 다뤄보겠습니다.


우리는 Mybatis를 이용해 xml에서 쿼리문을 작성할때 아래처럼 #{} 방식으로 데이터를 받는 형태를 자주 접하게 된다. 오늘은 데이터를 받을때 사용하는 #{}, ${} 방식에 대해 알아보도록 하자.

SQL을 실행할 수 있는 객체는 PreparedStatement 와 Statement이 있다. 자세하게 설명하다간 글의 요지와 벗어나니 컴팩트하게 정리해보자면

  • PreparedStatement
    여러번 수행하는 동작에서 빠른속도를 지니고 있고, 처음 컴파일한 경우 다시 컴파일하지 않아도 되는 이점을 갖고있다.
  • Statement
    단일로 수행하는 동작에서 빠른속도를 지니고, 매번 컴파일을 진행해야한다.

위 내용을 숙지한뒤 아래 두 방식을 비교해보자.


1. #{} 방식

  • 사용시 PreparedStatement를 생성한다.
  • 들어오는 데이터를 문자열로 인식하기 때문에 자동으로 따옴표를 붙임
  • PreparedStatement 가 제공하는 set 계열의 메소드를 사용하여 물음표(?)를 대체할 값을 지정
  • PreparedStatement 매개 변수 값 안전하게 설정
  • 평가: 반복적인 수행을 하는경우가 많기에 대부분의 경우에서 ${}방식보다 빠르다. 또한 문자열에 자동으로 따옴표를 붙여주기 때문에 SQL Injection과 같은 보안상의 위협에 대비할 수 있다.

2. ${} 방식

  • 사용시 Statement를 생성한다.

  • Statement 매개변수 값을 그대로 전달한다.(= 문자열에 따옴표가 붙지 않는다.)

  • 평가: 매개변수값을 그대로 전달하기 때문에 문자열도 그대로 전달되므로 SQL Injection 같은 보안상의 위험요소가 존재한다. 또한 반복수행이 많은경우가 많아 일반적으로 #{}를 자주 접하지만 굳이..굳이.. 이걸 쓴다면 ORDER BY 함수를 사용할 때 자동으로 따옴표가 붙으면 함수가 동작하지 않기 때문에 ${}를 써야한다.


#{}, ${}
#{}, ${}

0개의 댓글