MyBatis 매퍼에서 #{}와 ${}의 차이
조회 1 · 댓글 0
MyBatis 매퍼 XML을 짜다 보면 값을 #{}로 넣을지 ${}로 넣을지 헷갈리는 순간이 옵니다. 공식 FAQ 설명은 명확합니다. MyBatis는 #{...}를 JDBC PreparedStatement의 파라미터 마커로 해석하고, ${...}는 문자열 치환(string substitution)으로 해석합니다. 즉 #{}는 ?로 바인딩되어 값이 안전하게 세팅되고, ${}는 SQL 문자열에 그대로 끼워 넣습니다. 문서 권고도 "가능하면 항상 #{...}를 쓰라"입니다.
그럼 ${}는 언제 쓸까요. 파라미터 마커를 못 넣는 자리, 예를 들면 테이블명이나 컬럼명 같은 동적 메타데이터가 필요할 때입니다. 정렬 컬럼을 파라미터로 받아 ORDER BY에 넣는 경우가 대표적입니다. 값과 컬럼을 섞어 이렇게 씁니다.
SELECT * FROM ${tableName}
WHERE ${column} = #{value}주의: ${}는 문자열을 escape 없이 그대로 넣기 때문에 사용자 입력을 바로 받으면 SQL 인젝션 위험이 있습니다. 문서도 "이 필드에는 사용자 입력을 막거나 직접 escape와 검증을 하라"고 못박습니다. 정렬 컬럼 같은 값은 미리 정한 화이트리스트에서만 고르게 하는 편이 안전합니다.
로그인 후 답글을 남길 수 있습니다.