일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 빌드
- docker
- 트랜잭션
- 비동기통신
- Spring AOP
- gradle
- git push
- github
- maven
- axios
- 자바 버전
- PathVariable
- 프론트엔드
- RequestBody
- Vue.js
- VUE
- Java
- GIT
- 백엔드
- 도커
- vue life cycle
- fetch
- 개발자
- transaction
- java version
- aop
- RequestParam
- Today
- Total
미소의 세상
Mybatis #, $ 차이 본문
1. #의 사용 (PrepareStatment)
- #을 사용할 경우 오라클의 PreparedStatment를 사용하게 된다.
예제(name=John)
a. mybatis mapper
SELECT NAME FROM TEST WHERE NAME=#{name}
b. 오라클에서 받은 쿼리
SELECT NAME FROM TEST WHERE NAME = ?
실제 수행 쿼리
SELECT NAME FROM TEST WHERE NAME='John'
2. $의 사용(Statment)
- $는 간단히 스트링 자체를 변환(REPLACE)해 버린다
예제(score=99)
a. mybatis mapper
SELECT NAME FROM TEST WHERE SCORE=${score}
b. 오라클에서 받은 쿼리
SELECT NAME FROM TEST WHERE SCORE=99
실제 수행 쿼리
SELECT NAME FROM TEST WHERE NAME=99
3. 차이
두 가지가 똑같아 보이지만 붉게 처리된 부분을 볼 경우 1번은 오라클에서 변수를 바인드 처리 하기 때문에
NAME 값이 달라질 경우 같은 쿼리로 인식하게 됩니다.
(반드시는 아니지만 일반적으로 오라클의 쿼리 파싱, 캐시 등의 이점으로 CPU 및 수행 속도 차이가 나게 됩니다)
2번의 경우 b부분을 봤을때 쿼리 자체가 변경되어 들어가기 때문에 SCORE가 다른값이 올 경우
오라클은 이를 완전 다른 쿼리로 인식하기 때문에 새로 파싱 등의 작업을 하게 되고 속도가 느려질 우려가 있습니다.
그럼 Statment의 경우 어떻때 쓰는게 좋을까요?
SELECT ${column_name} FROM SCORE
위 쿼리같이 Bind를 할수 없는 경우 Statment를 사용하게 됩니다.
하지만 문자열 자체가 변형되기 때문에 보안상 취약할 수 있습니다.
예를 들면 아래와 같은 경우입니다.
user를 'admin'--로 세팅, password='aaa'
SELECT * FROM USER WHERE ID=${user} AND PASSWORD=${password}
실제 수행 쿼리
SELECT * FROM USER WHERE ID='admin'-- AND PASSWORD='aaa'
녹색 부분이 주석처리되어 admin으로 접속이 가능하게 되었습니다.
'SQL' 카테고리의 다른 글
Mybatis resultMap 사용하는 법 (0) | 2022.06.03 |
---|---|
프로시저의 장단점 (0) | 2022.05.11 |
서브쿼리의 종류 (0) | 2022.04.15 |
Mybatis와 비교한 JPA 장단점 (0) | 2022.04.03 |
오라클 자주 사용하는 힌트 정리 (sql 튜닝) (0) | 2022.03.22 |