츄르사려고 코딩하는집사입니다.
스프링(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 문을 짤 때, $ 방식보다는 # 방식을 사용하라고 권장을 하고 있습니다.
'IT > 스프링(Spring)' 카테고리의 다른 글
스프링 프레임워크(Spring Framework)에서 DispatcherServlet 통해 화면이 뿌려지는 방법 (0) | 2021.10.20 |
---|---|
스프링 프레임워크(Spring Framework)에서 DispatcherServlet이 뷰(View)를 찾는 방법 (0) | 2021.10.15 |
스프링 프레임워크(Spring FrameWork)에서 프로젝트를 위한 세팅하는 방법 (0) | 2021.10.14 |
스프링(Spring) MVC패턴(Model, View, Controller) Model 2 (0) | 2021.10.09 |
스프링(Spring) MyBatis typeAliases (0) | 2021.04.29 |
스프링(Spring) MyBatis란? (0) | 2021.04.29 |
스프링(Spring) MVC(Model-View-Controller) 패턴 (0) | 2021.04.27 |
스프링(Spring) 빈(Bean)이란? (2) | 2021.04.27 |
최근댓글