반응형
MyBatis는 Java 객체와 SQL문 사이의 자동 매핑을 지원하는 ORM 프레임워크이다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 객체를 더 쉽게 다룰 수 있다는 장점이 있는데 MyBatis에서는 SQL쿼리를 작성할 때, #과 $를 사용할 수 있다.
- #을 사용한 경우 : SQL쿼리에 사용될 파라미터를 전처리한다. 이를 통해 SQL Injection 공격을 방지할 수 있다. 또한 자동으로 파라미터의 타입 변환이 이루어지는데 예를 들어, #{name}과 같이 사용하면, 자동으로 String 타입의 name을 인식하여 적절한 형태로 SQL문에 삽입 된다.
- $을 사용한 경우 : SQL쿼리에 그대로 파라미터를 삽입한다. 전처리 과정을 거치지 않기 때문에 SQL Injection 공격에 취약하다. 하지만, 동적인 쿼리를 작성하기에 용이하며, $을 사용하면 동적인 쿼리를 작성할 수 있다. 쿼리문 안에 ${name}을 작성하면, 쿼리문이 실행될 때 ${name}은 그대로 문자열로 삽입된다.
따라서, 파라미터가 사용될 부분이 아닌 경우엔 $를 사용하는 것이 적절하며, 파라미터가 사용될 부분이라면 #을 사용하는 것이 좋다고 한다. 예시코드를 한번 살펴보자.
SELECT * FROM users WHERE name = #{name} AND age > ${age}
위 SQL문에서 name은 #을 사용하여 전처리되므로 SQL Injection 공격에 대한 보안이 강화되지만 age는 $를 사용하여 파라미터를 삽입하므로, SQL Injection 공격에 취약해진다.
위 SQL문을 기반으로 MyBatis가 자동으로 생성한 Java 코드를 살펴보면, 다음과 같이 파라미터 타입에 따라 다른 형태의 SQL문이 생성된다고 한다.
public interface UserMapper {
List<User> selectByNameAndAge(@Param("name") String name, @Param("age") int age);
}
위 코드에서 @Param 어노테이션은 MyBatis에서 파라미터 이름을 인식하기 위한 것이고, #{name}과 ${age}는 각각 @Param("name")과 @Param("age")로 매핑된다.
이렇게 MyBatis에서 #과 $를 적절히 사용함으로써, 보안과 유연성을 모두 고려한 SQL쿼리를 작성할 수 있다고 한다.
반응형