티스토리 뷰

개발/DB

Mybatis #과 $의 차이

donnert 2014. 11. 10. 18:03

PrepareStatment(#)와 Statment($)를 정확히 모르고 사용하시는 분들이 있어 정리해봤습니다.

 - 간혹 Statment를 숫자일때 사용한다.. 라고 생각하시는 분들고 계시고 정확한 의미를 모르는 분들이 계십니다.  정리된 내용 보시기 바랍니다.


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으로 접속이 가능하게 되었습니다.


'개발 > DB' 카테고리의 다른 글

mysql 사용자 추가 및 권한  (0) 2019.02.07
몽고DB 설치  (0) 2014.01.22
테이블 정보(컬럼 정보, 코멘트 등등)  (0) 2013.11.11
테이블 사이즈 구하기(컬럼 길이, 컬럼 길이 평균)  (0) 2013.03.12
[ORACLE] 달력  (0) 2012.09.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
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
글 보관함