[Spring] @Param 어노테이션으로 mapping하기
안녕하세요 코북입니다. 차트 만드는데 계속 이런 오류가 발생했습니다. '이용 가능한 변수들이 4개가 있는데 그중에서 "mb_id"라는 변수를 찾을 수 없다.'라는 내용입니다. Mapper Interface에서 실행한 메소드가 xml에서 변수들을 찾아가지 못해서 발생한 오류인데요. @Param 어노테이션을 사용하여 mapping 할 변수의 이름을 명시해 주었더니 오류가 해결됐습니다.
mapping이란 하나의 값을 다른 값으로 대응시키는 것을 말합니다.
■ Mapper Interface
public int countSum(GraphVO vo, int num1) throws Exception;
■ Mapper.xml
<select id="countSum" resultType="int">
select sum(pos_count) as pos_sum
from POSTURE
where mb_id=#{mb_id} and pos_type=#{pos_type}
and pos_time between DATE_SUB(NOW(), INTERVAL #{num1}+7 DAY) and DATE_SUB(NOW(), INTERVAL #{num1} DAY)
order by pos_time;
</select>
기존에 존재하던 Mapper Interface와 XML파일의 코드입니다. 메소드로 vo라는 변수와 num1이라는 변수를 보내주는데, Mapper.xml은 mb_id값에 vo를 mapping 해야 하는지 num1을 mapping 해야 하는지 알 수가 없습니다. 이때 @Param 어노테이션을 사용해 mapping 할 변수의 이름을 명시해 주면 mapper.xml은 Mapper Interface에서 넘어오는 변수들을 이름에 맞게 mapping 할 수 있게 됩니다.
■ Mapper Interface 수정
import org.apache.ibatis.annotations.Param;
public int countSum(@Param("vo")GraphVO vo, @Param("num1")int num1) throws Exception;
■ Mapper.xml 수정
<select id="countSum" resultType="int">
select sum(pos_count) as pos_sum
from POSTURE
where mb_id=#{vo.mb_id} and pos_type=#{vo.pos_type}
and pos_time between DATE_SUB(NOW(), INTERVAL #{num1}+7 DAY) and DATE_SUB(NOW(), INTERVAL #{num1} DAY)
order by pos_time;
</select>
이렇게 변수 앞에 @Param 어노테이션을 추가하고 괄호() 안에 변수 이름을 명시해주면 Mapper.xml은 넘어오는 변수들이 무엇인지 알 수 있게 됩니다. GraphVO vo를 vo라고 해줬고 int num1은 num1이라고 해줬습니다. xml파일에서 mb_id와 pos_type 변수의 경우 vo에서 꺼내오는 변수들이기 때문에 'vo.' 을 변수 앞에 적어줍니다.
배운 점
Mapper Interface에서 두 개 이상의 변수를 사용하면서 Mapper Interface와 Mapper.xml이 연결되는 원리에 대해 다시 한 번 생각할 수 있는 시간이었습니다. namespace를 맞춰서 연결해준 것처럼 변수 명도 @Param을 통해 연결시켜 주어야 한다는 것을 배웠습니다.
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.