본문 바로가기
컴퓨터관련/Java

[Java]Mybatis에서의 샵(#)과 달러($)의 차이

by 빛과 어둠사이 2019. 9. 26.
728x90
반응형
SMALL

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 마이바티스에서의 샵(#)과 달러($)의 차이점이였습니다~



이미지들은

실제로 제가 운영중인 소스이다보니

해당 부분 외에는 모두 숨긴 점

이해 부탁드립니다~




728x90
반응형
LIST