일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 샤로수길 데이트
- 반려견 사료등급
- 신포동 맛집
- 쿠팡매크로
- 반려견 더위
- 강아지
- 쿠팡메크로
- 자동화봇
- 티켓팅매크로
- 강아지 유기농
- 반려견 열사병
- 강아지종류
- 반려견
- 샤로수길 맛집
- 홀리스틱 유기농
- 동인천 맛집
- 강아지 종류
- 티켓팅메크로
- 강아지 더위
- 닥스훈트
- 반려견 홀리스틱
- 국비지원 예습
- 부산 맛집
- 강아지 열사병
- 서울대입구 맛집
- 강아지 홀리스틱
- 반려견 종류
- 반려견 유기농 사료
- 강아지 유기농 사료
- 반려견 유기농
- Today
- Total
심심한잉여의 잡동사니
[MyBatis] 샾(#{})과 달러(${})의 차이 본문
마이바티스를 사용한 프로젝트에서 mapper.xml을 작성하다보면
보통은 샵(#{})을 통해 작성하게 되나 필요에 의해 달러(${})를 사용하기도 한다.
이 둘은 용도가 전혀 다르기 때문에 명확히 구분해서 사용하는 것이 좋다.
샵(#{})
<select id="test" resultType="String" parameterType="Map">
SELECT
name AS name
FROM
user
WHERE
test = #{test}
</select>
샵을 사용한 경우 위 코드와 같은 예시로 작성을 주로하게 되며
Mybatis에서 위와 같은 샵(#{})을 사용한 쿼리문을 실행하게 되면서 PreparedStatement를 생성하게 되는데 이를 이용하게 되는데 #{}을 이용한 부분은 파싱되어 파싱된 쿼리문을 재활용하여 효율적으로 사용할 수 있게 된다.
그리고 변수에 작은 따옴표( ' ) 가 자동으로 붙어 쿼리가 수행되기 때문에 '#{test}' 처럼 쿼리문을 작성하지 않아도 된다.
달러(${})
달러(${})를 사용하게 되면 PreparedStatement를 생성하여 ?를 통해 값을 넣는게 아닌 값이 넣어진 채로 쿼리문이 수행된다.
그렇기 때문에 파라메터 값이 바뀔 때 마다 쿼리문 파싱을 진행해야 한다는 성능적 단점이 존재하지만 샵(#{})과는 달리 작은 따옴표( ' )가 붙지 않기 때문에 테이블명이나 컬럼명을 넘어 서브쿼리까지 동적으로 결정하여 사용할 수 있다.
<select id="select" resultType="String" parameterType="Map">
SELECT
${test_col} AS name
FROM
${T_test}
WHERE
id = #{test}
</select>
하지만 달러(${})의 경우 SQL Injection에 취약한 점이 흠이다.
SQL Injection
상황에 따라서 달라질 수 있겠으나 보안을 고려한다면 #{}을 사용해야 한다. 어떤 경우에 보안상 문제가 있냐면
<select id="selectUserFromTable" parameterType="Map" resultType="...">
SELECT
*
FROM
user
WHERE
id = '${id}' AND password = '${password}'
</select>
위와 같은 쿼리문이 있을 시 만일 ${id}에 대한 내용을 ( admin' -- ) 로 바꾸면 어떻게 되는지 상상해보자.
SELECT
*
FROM
user
WHERE
id = 'admin' -- 'AND password = ''
위와 같이 password에 대한 부분이 사라지기 때문에 관리자 계정 정보를 바로 조회할 수 있게 되는것이다.
이처럼 달러(${})의 경우 샵(#{})을 사용하는 경우에 더 위험한 상황이 올 수 있다.
'코딩일기 > 마이바티스' 카테고리의 다른 글
[마이바티스/mybatis] 프로시저 호출 및 결과값 반환 방법 (0) | 2022.08.16 |
---|---|
[Mybatis/마이바티스] 꺽쇠(<,>)가 읽히지 않는 경우 CDATA (0) | 2022.07.27 |