본문 바로가기

기초 지식/DB

[MyBatis] 마이바티스의 #{}, ${} 차이

? : 마이바티스에서 #하고 $ 차이 알아요?
Me : .....iBatis에서 #으로 썼었나?

저는 마이바티스를 처음 알고 쓴지가 1년 반 정도 된것 같습니다. 근데 정말 아무 생각 없이 쓰다가 최근데 #하고 $의 차이를 아냐는 질문을 듣고 정신이 나가버렸습니다.

 

질문을 듣자마자 "음..? #{parameter} 이렇게 쓴거 같은데 $도 있었나?" 이렇게 생각이 들고 iBatis에서 $를 쓴거 같기도 하더라구요.

 

그래서 그냥 버전의 차이 아닌가요?라는 답답한 답변을 해버리고 말았습니다. 1년 반동안 정말 아무 생각도 없이 쓰기만 했네요 ㅎㅎ

 

<select ~~~>
    SELECT ${COLUMN}
    FROM USER
    WHERE user_id = #{userId}
</select>

 

MyBatis에서 $,#을 사용한 예시입니다. 위의 SQL을 보기전에 $하고 #을 차이를 보고 다시 쿼리를 보시죠.

 

${}

  • 파라미터가 바로 출력됩니다.
  • 쿼리 주입을 예방할 수 없어서 SQL injection 공격을 막을 수 없어서 보안 측면에서 불리합니다.
  • 파라미터가 바로 출력되기 때문에 COLUMN명이나 테이블명을 주입하는데 사용합니다.

#{}

  • 파라미터가 String형태로 들어와서 ''로 감싸져서 출력됩니다.
  • 쿼리 주입을 예방할 수 있어서 보안 측면에서 유리합니다.

보안 측면의 차이 때문에 #{parameter} 형태로 보통 사용합니다. 저는 테이블하고 컬럼명을 주입할 일이 별로 없더라구요.

 

애초에 ${}로 사용한 코드를 본적이 없어서 내용을 몰랐던 것 같습니다. 앞으로는 아주 사소한 것들에도 관심을 가져야겠습니다.

반응형