[mybatis] 파라미터 바인딩

손종일·2023년 6월 1일

파라미터 바인딩

${} (Dollar Sign - 달러 기호):

값의 문자열 치환을 수행하는 방식입니다.
${변수명} 형태로 사용하며, 변수명은 프로퍼티 이름이나 맵의 키 등을 의미합니다.
MyBatis에서는 ${}로 감싼 표현식을 해당 변수의 값을 가져와서 SQL 문에 그대로 삽입합니다.
예를 들어, ${value}와 같이 사용할 경우, ${value}의 값은 해당 파라미터 객체의 nowSession 프로퍼티를 문자열로 변환하여 SQL 문에 삽입합니다.
이 방식은 문자열 치환만을 수행하므로 SQL 문이 동적으로 생성되거나 파라미터의 타입에 따라 다른 동작을 하지 않습니다. 따라서 자바의 toString() 메서드를 통해 문자열로 변환되는 것이 일반적입니다.
그러나 이 방식은 SQL 인젝션 공격에 취약할 수 있습니다. 외부에서 입력된 값을 직접 SQL 문에 삽입하기 때문에 사용자가 악의적인 SQL 코드를 삽입할 수 있는 가능성이 있습니다. 따라서 외부 입력 값을 사용하는 경우에는 보안에 주의해야 합니다.

#{} (Hash Sign - 해시 기호):

값의 자리 표시자(placeholder)를 나타내며, 파라미터 바인딩을 수행하는 방식입니다.
#{변수명} 형태로 사용하며, 변수명은 프로퍼티 이름이나 맵의 키 등을 의미합니다.
MyBatis에서는 #{}로 감싼 표현식을 해당 변수의 값을 가져와서 안전하게 SQL 문에 바인딩합니다.
예를 들어, #{value}와 같이 사용할 경우, #{value}의 값은 MyBatis가 자동으로 SQL 문에 안전하게 바인딩합니다. 이를 위해 JDBC의 PreparedStatement를 사용하여 값을 삽입하며, 자동으로 값의 타입에 따라 적절한 처리를 합니다.
이 방식은 SQL 인젝션 공격에 안전합니다. 외부 입력 값을 직접 SQL 문에 삽입하지 않고, PreparedStatement의 파라미터로 값을 전달하기 때문에 악의적인 SQL 코드를 삽입할 수 없습니다. 또한, 값의 타입에 따라 자동으로 변환되므로 타입 일치에 대한 신경을 쓰지 않아도 됩니다.
따라서, #{}을 사용하는 것이 보다 안전하고 권장되는 방법입니다. #{}는 파라미터 바인딩을 수행하여 SQL 인젝션 공격을 방지하고, 값의 타입 변환을 자동으로 처리하여 코드 안정성을 높여줍니다. ${}를 사용하는 경우에는 외부 입력 값을 직접 SQL 문에 삽입하므로 보안상 취약하며, 타입 변환에 대한 처리도 직접 해주어야 합니다.

profile
아자아자 화이팅!

0개의 댓글