본문 바로가기
DB/Mybatis

Mybatis 에서 #{} 과 ${}의 차이

by 꼬바리 2021. 8. 18.

회사에 취직하고나서, 쿼리문을 작성하는데 이상한 점을 발견했다.

바로 Mybatis 를 이용해 XML에 쿼리문을 작성하는데, 파라메터 작성법이 그동안 내가 해왔던 것과는 다른 것이었다.

 

아래는 그동안 내가 써왔던 방식이다.

 

<select id="select_list" parameterType="HashMap" resultType="HashMap">
    SELECT    USER_NM
            , USER_ID
    FROM    USER
    WHERE    USER_ID     = ${USER_ID}
            AND USER_PWD = ${USER_PWD}
</select>

그리고 이건 회사에서 사용하는 방식이다.

 

<select id="select_list" parameterType="HashMap" resultType="HashMap">
    SELECT    USER_NM
            , USER_ID
    FROM    USER
    WHERE    USER_ID     = #{USER_ID}
            AND USER_PWD = #{USER_PWD}
</select>

무슨 차이가 있는지 보이는가? 바로 ${} 가 #{} 로 바뀌었다!

 

왜? 왜 $을 안쓰고 #을 쓸까? 너무 궁금해서 찾아보았다.

 

#{}

파라매터가 String 형태로 들어와 자동적으로 '파라메터' 형태가 된다. 

예를들어, #{user_id}의 user_id의 값이 abc라면 쿼리문에는 USER_ID = 'abc'의 형태가 된다.

쿼리 주입을 예방할 수 있어 보안측면에서 유리하다.

 

${}

파라매터가 바로 출력된다.

해당 컬럼의 자료형에 맞추어 파라매터의 자료형이 변경된다.

쿼리 주입을 예방할 수 없어 보안측면에서 불리하다. 그러므로, 사용자의 입력을 전달할때는 사용하지 않는 편이 낫다.

테이블이나 컬럼명을 파라메터로 전달하고싶을 때 사용한다. #{}은 자동으로 ''가 붙어서 이 경우에는 사용할 수 없다.

 

<select id="select_list" parameterType="HashMap" resultType="HashMap">
    SELECT  ${COLUMN}
    FROM    USER
</select>

 

출처 : https://logical-code.tistory.com/25#%23%7B%7D

728x90
반응형

댓글