Mybatis #과 $의 차이
프로젝트 진행 중 Mybatis를 사용하는데 SQL 변수를 바인드 할 경우에 사용하는 변수 지정자가
#과 $가 있다.
일반적으로
#의 동적
$는 정적
쿼리를 사용한다고 한다.
이는 PreparedStatement로 SQL을 호출하느냐
또는
Statement로 SQL을 호출 하느냐에 따라 다르다
이는 SP (Stored Produce)를 호출 할 경우 Mepper에 작성하는 SQL이 다른다
# 바인드 변수의 경우에
CALL "SP 명" 으로 사용하나
$ 바인드 변수의 경우에는
EXEC "SP 명" 으로 사용을 한다.
($의 경우 CALL로 하나 EXEC로 하나 다른차이는 없다)
다만 # 바인드 변수를 활용하여 Mybatis에서 PreparedStatement를 호출 하면 기본적으로 SQL에는
EXEC sp_executesql 사용하여 SQL을 실행하게 된다
이 경우 INDEX를 만들어 놓아도 힌트로 적용하지 않는다면 INDEX는 사용하지 않게 되어 심각할 정도의 속도 저하가 발생한다.
그래서 직접 경험해 본 바로는 $ 바인드 변수를 활용하는 것이 좋으며, 기본적으로 Java에서 Sql Server를 사용할 경우에는 INDEX는 힌트를 꼭 기재 하기 바란다.
SP내부에도 INDEX를 힌트를 적용하여 사용하여야 INDEX를 사용하여 쿼리 결과가 나온다.
동적 쿼리를 실행 해야 할 경우에는 SP를 작성하여 내부에 동적쿼리를 작성 하거나 파라미터로 전달하여 사용하는게 Sql Server에서는 최대한의 퍼포먼스를 낼 수 있다고 본다.
이는 나의 경험에서 나온 부분이나, 실제 다른 프로젝트에서는 동일한 현상이 발생하지 않을 수 있다.
혹여나 동일한 현상이 없는데 나는 잘된다고 하시는 분들의 경우 댓글로 이야기를 해 주시면 저 또한 많은 공부가 될거라 본다.