코딩 개발/Spring

Ibatis/Mybatis에서 ##, #{}, $$, ${} 차이점 (parameter 사용)

호소세 2023. 9. 24. 15:56
728x90
반응형

Ibatis 나 Mybatis를 이용하여 DB연동을 쉽게 하는 방법이 있습니다.

 

Ibatis가 이전 버전이고 Mybatis가 최신? 버전입니다.

 

이 둘 사이에는 SQL문에서 parameter를 작성하는 방식이 다르더라고요.

 

Parameter 작성 법

1. #Parameter#/ #{Parameter}

이 방법을 사용하는 이유에 대해서 말씀드리겠습니다.

변수를 이용한 바인딩 처리로, 재사용성이 높으며, $를 이용한 변수 사용과는 다르게 String 자료형이 오면 자동으로 '  ' 작은따옴표 처리를 해주게 됩니다.

#을 이용한 변수 사용을 하게 되면 PreparedStatement를 사용하게 됩니다.

#IBatis
SELECT * FROM worker WHERE name = #parameter#
#MyBatis
SELECT * FROM worker WHERE name = #{parameter}

이런 식으로 작성할 것입니다.

 

2. $Parameter$ / ${Parameter}

$를 이용한 변수처리는 자료형에 관계없이 작은따옴표를 Parameter에 감싸지 않는다고 합니다.

작은따옴표로 처리하지 않으면 Column이나 이름을 찾지 못한다는 Error가 발생한다고 합니다.

 

이러한 경우에 Query문에 1=1이라는 조건을 걸게 되면, SQL이 무조건 True로 되기 때문에 비정상적으로 쿼리문이 실행할 수 있는 SQL Injection 공격을 할 수 있기 때문에 작은 따옴표 처리를 직접 해줘야 합니다.

#IBatis
SELECT * FROM worker WHERE name = '$parameter$'
#MyBatis
SELECT * FROM worker WHERE name = '${parameter}'

이렇게 말이죠?

 

3. 권장 사항

$를 이용하여 변수를 할당하면 Prepared Statement를 사용하지 않고 그냥 Statement를 사용한다고 합니다. 그래서 쿼리문이 변경되면 쿼리문을 다시 파싱 하는 작업을 진행하기 때문에 속도가 저하되는 단점이 있습니다.

또한, SQL Injection의 공격을 받을 수 있습니다. 

 

그래서 대부분 SQL 문을 작성할 때 #을 이용한 방식을 사용하라고 권장한다고 합니다.

 

감사합니다 츄르 사려고 코딩하는 집사님


출처 : https://yongku.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81Spring-IbatisMybatis%EC%97%90%EC%84%9C-%EA%B3%BC-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

반응형