본문 바로가기

개발일지/TIL

[231022] Mybatis 파라미터 #과 $의 차이

Mybatis 파라미터 받는 방식

💬 회사를 다니면서 Mybatis 코드를 보게 되었습니다. 코드에 #과 $ 기호를 사용하여 파라미터로 전달하고 있었습니다. 코드를 이해하기 위해 두 기호의 차이가 무엇인지 알아보기로 했습니다. 또한 각각 어디에 사용이 되는지도 궁금했습니다. 이후에 제가 작성하게 되면 적절한 곳에 사용하기 위해서입니다.

 

파라미터 # (Binding Variable)

1. 쿼리문이 파싱이 되면 해당 쿼리문을 재활용
2. 값에 자동으로 ''가 붙음
3. PreparedStatement여서 SQL Injection 공격을 예방할 수 있음

 

 파라미터 $ (Literal Variable)

1. 값이 들어올 때마다 쿼리문을 매번 파싱을 하여 사용
2. 값에 자동으로 ''붙지 않음
    ➡ 문자열 입력 시 ''을 직접 붙여줄 필요가 있습니다.
3. SQL Injection 공격에 취약함
    ➡ "And 1=1" 등을 추가적으로 기입해 다른 조건을 무시하고 모든 데이터를 볼 수도 있습니다. 

언제 사용해야 하는가?

✅ 파라미터 #은 SQL Injection을 공격을 예방할 수 있고 해당 쿼리문을 재활용해 속도적인 측면을 향상시킬 수 있습니다. 그러기 때문에 사용자의 입력을 SQL에 사용할 때 쓰여져야 합니다.

파라미터 $은 SQL Injection에 취약하고 매번 쿼리문을 파싱을 이루어진다는 특징이 있습니다. 그러기 때문에 보안적으로 취약하지 않고 매번 변경이 되어야 하는 Table, Column 명을 SQL에 사용할 때 쓰여져야 합니다.