DevBoi

Prepared statement와 statement의 차이 본문

[Computer Science]

Prepared statement와 statement의 차이

HiSmith 2021. 8. 29. 18:35
반응형

Mybatis 로 개발을 진행하다면, 해당 prepared statement와 일반 statement의 차이에 대해서 알아두어야 할 필요가 있다.

Mybatis에서 단적인 예로, 쿼리의 파라미터에 대한 방법을 다르게 줄 수 있다.

 

1. #{storeNo} , ${storeNo}가 있다.

mybatis에선 해당 #, $를 다르게 쓸수가 있는데, 해당 방법에 대해서는, 어떤 차이가 있는지 살펴보자,

우선 #{} 과 같은 쿼리문은, 같은 쿼리문을 바인드 변수값만 바꿔서 반복적으로 실행하기 위해 사용하는 prepared statement이다.

 

해당 방법은 어떻게 동작할까?

우선 Prepared statement를 동작시키면, 해당 쿼리는 ?가 표함된, 쿼리문을 DBMS로 보내게 된다. 해당 DBMS는 해당 쿼리를 컴파일하여, 아직 DB에 값을 부르지않고, 저장한다. 그 이후에, 바드 변수가 저장이되면, 해당 데이터베이스로 쿼리를 호출하여, 값을 반환 받는다.

 

가장 큰 차이는 그렇다면, 어떤 것일까? 바로 캐시 사용여부이다.

대부분의 쿼리는 (select, insert, update) 문은 틀은 그대로이고, 바인드 변수에 따라서 여러번 실행되는 것이 보통이다.

해당 여러번 실행되는 쿼리에 대한 캐시 사용여부는, 성능 자체, DB부하에도 큰 차이가 있다,

 

실제 쿼리가 수행되는 것은, 커넥션을 맺고, Statement를 create하고, 쿼리를 컴파일하여, 날리는데

이렇게 Prepared statement로 쿼리를 수행하다보면, 컴파일하여, 캐시에 저장해놓기 떄문에 별도로 사전 단계를 거치지 않는다.

그렇게 되면, 해당 단게를 진행하면서 별도로 부하를 주지 않게된다.

또한 매번 컴파일을 하는 과정을 거치지 않기때문에, 부하 및 성능에서 좋은 결과를 보여준다.

 

그러면 mybaits에서 어떤 차이가 있을까?

 

우선 ${}의 사용 방법에 대해서 살펴보자

 

우선 mybatis에서 #{}와 ${}의 차이는, Prepared statment이냐, statement이냐의 차이이다.

 

${} 이 방식은, statement 방식이며, sql injection에 취약하며,캐시를 탈수 없다.

따라서, 해당 방법은 잘 사용하지 않으며, 사용자의 입력을 받아서 지정되는 쿼리로는 사용할수 없다(sql-injection 우려)

해당 방식은 그러면 언제 사용할까? #{} 을 사용하면, 자동으로 ''가 붙어서 컬럼이나 테이블 명을 넘기고 싶을때 불가능하다.

해당 컬럼이나, 테이블명을 파라미터로 넘겨서 사용하고 싶을때 사용하는 방식이다.

 

그러면 실무에서 많이 사용하는 #{}방식은 Prepared statement 방식이다. 제일 많이 사용하며, 캐시를 사용하고

캐시를 사용하여 성능 개선 관 DB부하 줄여주는데 이점이 있기 떄문에 많이 사용하게 된다.

반응형

'[Computer Science]' 카테고리의 다른 글

Clean Code의 정의  (0) 2021.08.29
무 중단 배포 , 블루-그린 방식의 배포  (0) 2021.08.29
TDD 사용방법의 구체화와 장.단점  (0) 2021.08.29
잡다한 기술 지식  (0) 2021.08.25
Mac OS git 설치 및 연동 정리  (1) 2021.08.13