카테고리 없음
[Mybatis] #{} 와 ${} 설명과 차이점
미니시리
2022. 7. 7. 18:08
Mybatis를 사용하면서 CRUD 로직을 구현한 파라미터를 작성할 때 #{ }, ${ }의 차이가 무엇인지 크게 생각하지 않고 사용하는 경우가 종종 있습니다. 무슨 차이가 있고 #{}를 왜 더 많이 사용하는지와 ${}는 어떨 때 사용하는지를 살펴보겠습니다.
1. #{}
특징
- 파라미터가 String 형태로 들어와 자동적으로 '파라미터' 형태가 된다.
- 쿼리 주입을 예방할 수 있어 보안 측면에서 유리하다.
사용 과정
- #{} 사용 시 PreparedStatement 생성한다.
- PreparedStatement 매개 변수 값 안전하게 설정한다.
- PreparedStatement 가 제공하는 set 계열의 메서드를 사용하여 물음표(?)를 대체할 값을 지정한다.
- 들어오는 데이터 문자열로 인식하기 때문에 자동으로 따옴표가 붙는다.
사용 이유
Prepared는 컴파일(Parsing)을 이야기하며, 컴파일이 미리 되어있기에 Statement 에 비해 안전하고 빠르다.
${}
특징
- 파라미터가 바로 출력된다.
- 해당 컬럼의 자료형에 맞추어 파라미터의 자료형이 변경된다. - 쿼리 주입을 예방할 수 없어 보안 측면에서 불리하다.
- 내부 데이터, 개인정보 등의 노출되면 안 되는 데이터를 전달할 때는 사용하을 지양한다. - 테이블이나 컬럼명, 예약어를 파라미터로 전달하고 싶을 때 사용한다.
- 여기서 #{}는 자동으로 ''가 붙어 문자열이 되므로 이 경우에는 사용할 수 없다.
사용 과정
- ${} 사용 시 Statement 생성한다.
- Statement 매개변수 값 그대로 전달한다.
- 그대로 전달하기 때문에 문자열에 따옴표가 붙지 않는다.
예) select * from Extable where Statementparameter = 홍길동 - 테이블 컬럼 타입이 varchar여도 숫자 그대로 들어가기 때문에
예) select * from Extable where Statementparameter(varchar 타입) = 1
사용 이유
가장 큰 이유는 테이블명이나 컬럼명, 예약어등을 사용할 때 오히려 자동 따옴표가 붙으면 함수가 안먹기 때문에 ${}를 써야합니다.