[MyBatis] <choose>, <when>, <otherwise>
목표
MyBatis에서 사용하는 <choose>, <when>, <otherwise> 사용법
<choose>, <when>, <otherwise>를 왜 사용하고 어떻게 사용하는지를 이해합니다.
순서
1. <choose>, <when>, <otherwise> 이해
2. 예제
1. <choose>, <when>, <otherwise> 이해
<if>태그와 같이 조건식이 참일 경우 쿼리문을 실행해주는 역할을 합니다. 다른점은 여러개의 <if>태그 사용경우 조건식이 true를 반환하는 <if>태그는 모두 쿼리문이 실행됩니다. 하지만 <choose> 태그내의 여러개의 <when> 태그문의 경우 조건식이 true를 반환하는 <when>태그를 찾으면 거기서 멈추고 해당 <when>태그의 쿼리만 실행합니다. 다시말해 조건식을 가진 여러개의 <when>태그 오로지 한개의 <when>태그내부 쿼리만 실행됩니다. 대부분의 프로그래밍 언어에서 사용되는 if else와 비슷한 역할을 합니다.
<choose> 태그 안에서 <when>태그와 <otherwise>를 작성합니다. <when>태그는 각각 조건식(test 속성)을 가지며 여러번 작성할 수 있습니다. 실행 시 <when>태그의 조건식을 순서대로 확인하여 true를 반환하는 <when>태그 안의 쿼리문을 실행하게 됩니다. 만약 <when>태그의 조건식중 true 반환한 것이 없다면 <otherwise> 태그 내에 작성된 쿼리문이 실행됩니다. <otherwise>태그는 생략 가능합니다.
<choose>
<when test="조건식1"> 쿼리문1 </when>
<when test="조건식2"> 쿼리문2 </when>
<when test="조건식3"> 쿼리문3 </when>
<when test="조건식4"> 쿼리문4 </when>
<otherwise> 쿼리문5 </otherwise>
</choose>
2. 예제
아래는 MyBatis 공식 홈페이지의 <if>태그 예제를 입니다.
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
아래는 <choose>,<when>을 사용한 예제입니다.
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test=test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
</choose>
</select>
얼핏 똑같은 역할을 한다고 생각할 수 있습니다. 하지만 결과는 확연히 다릅니다. 위의 <if>태그를 사용한 예제의 경우 <if>태그 조건식 둘다 ture면, 각 <if>태그가 가지고 있는 쿼리문 2개를 모두 실행합니다. 하지만 <choose>,<when>예제의 경우 <when>태그의 조건식이 true이면 다음<when>의 조건식을 탐색하지 않고 하나의 쿼리문만 실행하게됩니다.
REFERENCE
DATE
- 2020.03.06