[Mybatis] #{}, ${} 의 차이

기록지·2021년 5월 21일
1

교육

목록 보기
2/14

🤖 Mybatis 에서 #{}, ${}의 차이는 무엇인가

1. preparedStatement 와 statement 의 차이점이라고 보면 된다. (쉽게 동적과 정적의 차이)

2. 오라클로 전달할때 '?' 와 '값' 형태로 바인딩된다.

3. preparedStatement 방식인 #{}은 쿼리의 재사용이 가능하지만 statement 방식인 ${}은 재사용이 불가능하며 새로운 쿼리로 인식하기 때문에 성능상의 차이가 존재한다.

->성능상의 차이가 있다고 하지만 ${}가 단점만 존재하는것이 아니라 옵티마이저 수행계획에 이점을 주는 경우도 존재하며 자주 바뀌지않거나 사용자의 입력을 받는경우에 사용해주면 좋다.

4. #{} 은 사용자의 입력을 받거나 데이터가 많은 경우에 주로 사용한다.

(대부분 ${}보다 #{}위주로 작성하는 경우가 많다.

🗣 추가

1. #{} 를 사용하면 쿼리문에 ?가 생기면 파싱된다.

쿼리문을 작성할때 #{}을 사용하는 경우 preparedStatement를 생성하게 되는데 위에 ? 에 파라미터가 바인딩되어 수행된다. 이렇게 파싱된 쿼리문은 재활용(캐싱)되기 때문에 효율적이다.
그리고 변수에 작은 따옴표''가 자동으로 붙여 쿼리가 수행되기때문에 '#{00}'와 같은 쿼리문을 작성하지 않아도 된다.

2. ${} 를 사용하면 값이 넣어진 채로 쿼리문이 수행된다.

파라미터의 값이 바뀔때마다 항상 쿼리문 파싱을 진행해야 한다. 즉, 성능상의 단점이 존재한다.
그리고 쿼리문에 #{}을 사용한 것과 다르게 작은 따옴표가 붙지 않기 때문에 아래처럼 테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있다.**
-> ${}를 사용한 경우 SQL Injection 에 취약한 점이 흠이다.

2개의 댓글

comment-user-thumbnail
2021년 5월 21일

멋져,,,,,

답글 달기

부러,,

답글 달기