반응형

@notepad_jj2

츄르사려고 코딩하는집사입니다.


스프링(Spring)은 전자정부 프레임워크로 지정되어 사용되는 프레임워크로, 웹개발을 하면 백엔드에서 많이 사용하곤 합니다. 스프링의 특징 중 JDBC를 사용하여 DB와 연동을 하는데 MyBatis 라이브러리를 사용하게 됩니다. (IBatis는 MyBatis의 이전 버전입니다.)

 

그래서, 데이터 이동을 할 때, IBatis에서는 $$, ##을 사용하고, MyBatis에서는 ${ }, #{ }를 사용합니다.

 

구분 사용
IBatis #Parameter#
$Parameter$
MyBatis #{Parameter}
${Parameter}

 

 

1. #Parameter# / #{Parameter}

변수를 이용한 바인딩 처리로, 재사용성이 높으며, $Parameter$ 및 ${Parameter}과는 다르게 변수 자료형이 String이면 작은 따옴표 처리를 해줍니다. #Parameter# 및 #{Parameter}를 사용할 경우에는 대체적으로, PreparedStatement(pstmt)를 사용하게 됩니다.

 

아래의 SQL문 처럼 사용할 수 있습니다. ##을 사용하면 변수자료형이 String을 인식하여 parameter에 Joe가 들어가면, SELECT NAME FROM A WHERE NAME='Joe'가 나오게 됩니다.

SELECT NAME FROM A WHERE NAME=#parameter# --Ibatis
SELECT NAME FROM A WHERE NAME=?
SELECT NAME FROM A WHERE NAME='Joe'

 

2. $Parameter$ / ${Parameter}

$Parameter$ 및 ${Parameter}는 변수의 자료형과 관계없이 작은 따옴표를 Parameter에 감싸지 않기 때문에, Parameter$ 및 ${Parameter}를 사용할 때 작은 따옴표로 처리를 하지 않으면 Column이나 이름을 찾지 못한다는 Error가 발생합니다.

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

 

아래의 코드처럼 사용할 수 있는데, 여기서 #이 아닌 $로 사용하고, parameter가 Joe라는 값이 저장이 되면 작은 따옴표를 감싸지 않기 때문에 Error가 발생합니다.

SELECT NAME FROM A WHERE AGE=${parameter} --Mybatis
SELECT NAME FROM A WHERE AGE=100
SELECT NAME FROM A WHERE AGE=100

 

3. #Parameter# 및 #{Parameter}와 $Parameter$ 및 ${Parameter}의 큰 차이점

#Parameter# 및 #{Parameter} 같은 경우에는 PreparedStatment를 사용하게 되면서, 변수를 Bind를 하게 됩니다. 이 경우에는 바인딩한 것들을 계속해서 바꿔줄 수 있기 때문에 코드의 재사용성이라는 장점이 있고, 변수를 Bind하면서, SQL Injection을 예방을 할 수 있습니다.

 

$Parameter$ 및 ${Parameter}는 변수에 저장된 값을 Bind하지 않고 Statement를 사용하게 되면서 쿼리문에 들어가는 값을 수정할 수 있고, 이 경우에는 우리가 흔히 알고 있는 SQL Injection의 공격을 받을 수 있습니다. 또한, 쿼리문이 변경되면 쿼리문을 다시 파싱하는 작업을 진행하기 때문에 속도가 저하된다는 단점이 있습니다. 

 

그래서 대부분 Query 문을 짤 때, $ 방식보다는 # 방식을 사용하라고 권장을 하고 있습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기