본문 바로가기
쿤즈 Dev/Spring Boot

[Spring Boot] Mybatis 변수 사용시 #{ } 와 ${ } 의 차이

by :)Koon 2021. 5. 5.

Spring Boot에서 데이터베이스를 접근할 때 많이 사용하는 방법은 Mybatis를 사용하는 방법과 Jpa를 사용하는 방법이 있습니다.

 

 

이번 포스팅에서는 Mybatis를 사용하면서 마주하게 되는 #{}와 ${}의 차이를 알아보도록 하겠습니다.


Mybatis 문법

Mybatis는 기본적으로 xml 파일에 쿼리문을 넣어서 사용합니다. 따라서 쿼리의 종류에 따라 xml를 묶어서 사용할 수 있고 Database 쿼리만 따로 관리할 수 있어서 편리한 이점이 있습니다.

 

다음과 같은 쿼리를 사용해야 한다고 생각해 보겠습니다.

SELECT *
FROM usertbl
WHERE user_id = 'test';

여기서 문자열로 받는 test는 Java 클래스와 연동시켜서 보통 사용하고 값을 넘겨줍니다. 그래서 XML 맵퍼를 사용해서 Mabatis 문법으로 만들면 다음과 같습니다.

 

<select id="findByUserId" resultType="User">
	SELECT *
	FROM user
	WHERE user_id = #{userId}
</select>

 

이때 사용하는 문법이 바로 #{} 입니다. 만약 ${}를 사용한다면 어떻게 될까요?


Mybatis 사용시 #{}와 ${}의 차이점

아래는 #{}을 사용한 방법과 ${}를 사용했을 때 넘어가는 쿼리 실행문입니다.

 

* #{} 사용

SELECT * FROM usertbl WHERE user_id = 'test';

* ${} 사용

SELECT * FROM usertbl WHERE user_id = test;

차이점이 보이시나요? 바로 작은따옴표라 불리는 Single Quotation의 차이입니다. 이 둘의 차이점으로 인해 나타나는 결과는 다릅니다.

 

동일한 쿼리문에 몇가지를 추가해보도록 하겠습니다.

<select id="findByUserId" resultType="User">
	SELECT *
	FROM user
	WHERE user_id = #{userId}
	ORDER BY user_id ${order}
</select>

예를 들어서 ORDER BY 하고 싶은 컬럼이 있고 이를 ASC, DESC와 같이 설정하고 싶다고 가정해 보겠습니다. 이런 경우에 ASC, DESC를 'ASC', 'DESC'와 같이 작은따옴표가 들어갈 경우에는 정상적으로 쿼리가 동작하지 않습니다.

 

즉 #{}와 같이 사용되는 경우는 String 형태로 값을 넣어주고 따옴표가 자동 삽입됩니다. 반면에 ${}와 같이 사용하면 값이 바로 출력됩니다. 따라서 컬럼명 혹은 예약어를 바로 주입할 때 보통 사용할 수 있습니다.


이번 포스팅에서는 스프링 부트 (Spring Boot)에서 Mybatis를 사용하던 중에 궁금증이 생길 #{}와 ${}의 사용법에 대해서 알아보았습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글