[MyBatis] <choose>, <when>, <otherwise>

김피자·2023년 12월 12일

MyBatis

목록 보기
1/1

myBatis에서 if-else문의 역할을 할 수 있는 <choose>태그에 대해 대해 알아보자.

orderBy를 수행하는 Mapper를 수정하던 중 아래와 같은 조건문을 보게되었다.


수정 전

<if test="order == `AAA`"> //1번
	쿼리 1
</if>
<if test="order != null and order !=`` and order != `AAA`"> //2번
	쿼리 2
</if>
<if test="order == null and order ==`` "> //3번
	쿼리 3
</if>

위 조건을 자세히 보면 불필요한 중복 검사가 일어나는 것을 알 수 있다.


불필요한 중복 검사

2번에서 order != null and order != '' 인 것을 검사한 후, 3번에서 다시 한 번 order == null and order == `` 인 것을 검사하고 있다.
또한, AAA 조건을 확인한 후에도 계속해서 2번과 3번 조건을 검사하고 있는 것을 볼 수 있는데 사실 AAA 조건이 충족되면 나머지 조건들을 확인할 필요가 없는 것인데 이렇게 구현되면 불필요한 중복 검사는 물론 코드의 가독성이 떨어질 수 있다 생각하였다.


<choose>, <when>, <otherwise>

<choose> 태그는 <if>처럼 조건이 참일 경우 쿼리를 실행해주는 역할을 한다.

<choose> 태그 내 여러개의 <when>태그의 경우 조건이 true를 반환하는 <when>태그를 찾으면 거기서 멈추고 해당 <when>태그의 쿼리만 실행한다.
조건을 가진 여러개의 <when>태그들 중 true인 태그의 내부 쿼리만 실행하게 된다는 말이다. (if문에서 해당 조건이 참이면 그 안의 내부 로직만 수행되고 조건을 빠져나가는 것 처럼)

<choose> 태그 안에서는 <when><otherwise>를 사용한다.
<when>태그는 각각 조건식(test 속성)을 가지며 여러번 작성할 수 있다. 실행 시 <when>태그의 조건식을 순서대로 확인하여 true를 반환하는 <when>태그 안의 쿼리문을 실행하게되며, 만약 <when>태그의 조건 중 true를 반환하는 것이 없다면 <otherwise> 태그 내에 작성된 쿼리문이 실행된다.
<otherwise>태그는 생략 가능


예시

<choose>
	<when test="조건1"> 쿼리 1 </when> --- if
    <when test="조건2"> 쿼리 2 </when> --- else if
    <when test="조건3"> 쿼리 3 </when> --- else if
	<otherwise> 쿼리 4 </otherwise> --- else
</choose>

수정 후

기존의 조건문을 개선하기 위해 <choose>태그를 사용하여 수정했다.

<choose>
    <when test="order == `AAA`">
        쿼리 1
    </when>
    <when test="order != null and order != ``">
        쿼리 2
    </when>
    <otherwise>
        쿼리 3
    </otherwise>
</choose>

끝!

profile
제로부터시작하는코딩생활

0개의 댓글