Java를 개발할 때
Mybatis를 많이 사용하고 계십니다.
저도 사용하고 있고요.
그런데 Mybatis를 사용하면서
어느 경우에는 ${}를 쓰고,
어느 경우에는 #{}를 쓰고 있습니다.
이 차이점에 대해서
정확하게 정리를 해 보고자 합니다.
우선 $(달러)에 대해서
정리를 해 보도록 하겠습니다.
$으로 값을 받게 되는 경우,
해당 부분을 상수로 치환해서
처리를 하게 됩니다.
즉, 해당 부분이 로그등에
그대로 노출이 됩니다.
예제 소스를 작성해보겠습니다.
SELECT * FROM USER WHERE col = ${aaa}
위처럼 코딩을 하였습니다.
그리고 aaa의 값이
"홍길동"이였다고 가정을 해 보겠습니다.
그러면 로그에는 다음과 같이 나옵니다.
SELECT * FROM USER WHERE col = 홍길동
이렇게 로그에 그대로 노출이 되다보니
보안에는 안좋을 수 밖에 없습니다.
그러면 이번에는 #(샵)에 대해서
확인해보도록 하겠습니다.
샵을 쓰게 되면
해당 부분은 ?로 로그에 출력이 되고,
bind 되어서
처리가 되는 것입니다.
예제 소스를 봐보도록 하겠습니다.
SELECT * FROM USER WHERE col = #{aaa}
위처럼 코딩을 하였다고 합니다.
그리고 aaa의 값은
역시나 "홍길동"이라고 하면
로그에는 다음과 같이
나오게 됩니다.
SELECT * FROM USER WHERE col = ? Parameters: 홍길동
위처럼 ?로 해서
로그에 출력이 되고,
그 다음에 값이 치환이 됩니다.
그렇기 때문에
중간에 SQL문을 변경하더라도
해당 부분은 건드릴 수가 없기 때문에
보안에는 더 좋다고 할 수 있습니다.
이제 제가 직접 관리중인
소스를 가지고
봐보도록 하겠습니다.
위처럼 코딩이 되어있습니다.
위에는 달러($)로 표시되어 코딩이 되어 있습니다.
그러면 결과는 아래처럼 나오게 됩니다.
저러헥 값이 변경이 되어서
그대로 노출이 되어 나옵니다.
보안에는 안좋을 수 밖에 없습니다.
그러면 이번에는 샵(#)으로
코딩이 된 부분입니다.
아래처럼 코딩이 되어 있습니다.
위처럼 #으로 해서
코딩이 되어 있습니다.
그러면 아래처럼 결과가 나옵니다.
쿼리 부분은 이렇게 나오게 됩니다.
그리고 별도로 이렇게 해당 값이 나오게 됩니다.
이렇게 되기 때문에
보안에는 더 좋을 수 있습니다.
그렇지만 무조건 달러($)로 하는 것이 나쁜 것은 아닙니다.
상황에 따라서 해주시면 되십니다.
예를 들어서 컬럼 명이 가변이라면
달러($)로 해서 하는 것이
더 좋을 것입니다.
이렇게 상황에 따라서
유동적으로 사용해주시면 되십니다.
이상으로 Java 마이바티스에서의 샵(#)과 달러($)의 차이점이였습니다~
이미지들은
실제로 제가 운영중인 소스이다보니
해당 부분 외에는 모두 숨긴 점
이해 부탁드립니다~
'컴퓨터관련 > Java' 카테고리의 다른 글
[Java]날짜 및 시간 비교 메소드 compareTo (0) | 2019.12.09 |
---|---|
[Java]HTTP 통신 시 SSLHandshakeException 에러 (3) | 2019.11.01 |
[Java]이클립스 강제 Pull 받기 (1) | 2019.05.29 |
[Java]자바의 버젼 및 분류 정리 (0) | 2019.05.15 |
[Java]이클립스에서 class파일 생성이 안될 때 (1) | 2019.05.13 |