본문 바로가기
Java/Mybatis

[Mybatis] 마이바티스 동적 쿼리 trim 사용하기

by 산코디 2023. 2. 20.

[Mybatis] 마이바티스 동적 쿼리 trim 사용하기

 

 

안녕하세요.

오늘은 마이바티스에서 일반 쿼리문을 동적 쿼리문으로 사용할 수 있도록 도와주는 기능인 trim 요소에 대해서 포스팅하려고 합니다. 

trim 요소는 사용하고자 하는 쿼리에서 접두어와 접미어를 원하는 내용으로 바꿔주는 기능을 합니다. 정적인 쿼리를 사용하는 경우에는 크게 상관이 없지만, 파라미터를 받아서 동적으로 처리하는 경우에 애매한 경우가 종종 있습니다. 그럴 때 trim을 사용한다면 아주 간단하게 해결할 수 있습니다. 어떤 상황에서 trim을 사용하면 되는지 예제를 통해서 알아보도록 하겠습니다.

 


1. update 문 예제

<update id="update">
    UPDATE Member
       SET
        <if test='age != null'>
            Age 	= #{age}	,
        </if>
        <if test='empNo != null'>
            EmpNo 	= #{empNo}	,
        </if>
        <if test='name != null'>
            Name 	= #{name}
        </if>

    WHERE Idx = #{idx}
</update>

위의 예제 소스 코드는 일반적인 update문입니다. 크게 문제가 돼 보이진 않습니다. 하지만 실행을 하게 되면 에러가 발생할 수 있습니다.

그 이유는 위의 update문과 같은 경우는 update 하고자 하는 칼럼이 Age, EmpNo, Name 이렇게 세 종류가 있는데, 각각 파라미터의 null을 체크하기 위한 if문이 감싸져 처리되고 있습니다. 그렇게 되면 세 항목 중 마지막 항목이 null이어서 처리가 되지 않으면 SET절의 마지막은 ',' 콤마로 끝나게 되면서 에러가 발생합니다. 그렇다고 해서 콤마를 앞쪽에 붙이면 제일 먼저 조건처리되는 칼럼이 null이면 동일하게 에러가 발생을 하게 되죠. 이런 상황을 대비해서 사용하는 것이 trim 기능입니다. 그럼 다음은 위의 예제에서 trim 요소를 사용한 예제를 보도록 하겠습니다. :)

 


2. trim을 사용한 update문 예제

<update id="update">
    UPDATE Member
    
    <trim prefix="SET" suffixOverrides=",">
        <if test='age != null'>
            Age 	= #{age}	,
        </if>
        <if test='empNo != null'>
            EmpNo 	= #{empNo}	,
        </if>
        <if test='name != null'>
            Name 	= #{name}   ,
        </if>
    </trim>

    WHERE Idx = #{idx}
</update>

위의 예시 코드는 trim을 사용하여 update를 동적으로 처리한 예시입니다.

위의 예시를 보게 되면 trim 요소에서 prefix와 suffixOverrides 속성을 사용하고 있는데요. prefix는 쿼리 구문 맨 앞에 설정한 구문이 추가가 되고, suffixOverrides는 쿼리의 가장 마지막 부분에 해당 요소와 매칭되는 구문이 있으면 삭제해 주는 기능을 합니다.

위의 쿼리를 실행하게 되면 

UPDATE Member
   SET
      Age = #{age},
      EmpNo = #{empNo},
      Name = #{name}
 WHERE Idx = #{idx}

위와 같이 SET절에서 'SET' 구분과 마지막에 ',' 콤마가 삭제되어 쿼리가 정상 실행되게 됩니다. 

 

그 밖에도 suffix, suffixOverrides 속성이 있습니다.

 

 

반응형

3. prefixOverrides와 suffixOverrides 사용 예시

<update id="update">
    UPDATE Member
    <trim prefix="SET" prefixOverrides="," suffixOverrides=",">
        <if test='age != null'>
            , Age = #{age}
        </if>
        <if test='empNo != null'>
            , EmpNo = #{empNo}
        </if>
        <if test='name != null'>
            , Name = #{name}  
        </if>
    </trim>

    WHERE Idx = #{idx}
</update>

위의 예시는 suffixOverrides와 함께 prefixOverrides를 사용한 예제 코드입니다.

suffixOverrides가 접미사의 문자가 매칭되어 삭제를 해준다면 prefixOverrides는 접두사에 위치한 문자와 매칭되는 경우 삭제해 주는 기능입니다. 

위의 예시처럼 첫 번째 if문 조건의 쿼리가 ','로 시작을 하고 있는데 이런 경우에 prefixOverrides의 값을 ','로 설정해 준다면 자동으로 매칭되어 삭제해서 에러를 방지할 수 있습니다.


trim의 속성 정리
prefix : 설정한 문자열을 쿼리의 맨 앞에 추가해 주는 기능
suffix : 설정한 문자열을 쿼리의 맨 뒤에 추가해 주는 기능
prefixOverrides : 설정한 문자열이 쿼리의 맨 앞의 문자과 매칭되는 경우 삭제해 주는 기능
suffixOverrides : 설정한 문자열이 쿼리의 맨 뒤의 문자과 매칭되는 경우 삭제해 주는 기능

 


마무리

오늘은 마이바티스의 문법 trim의 기능에 대해 정리해 봤습니다. 마이바티스의 문법은 대부분 사용 방법이 간단하기 때문에 위의 예시들처럼 간단하게 동적 쿼리를 적용할 수 있습니다. 오늘은 update문을 기준으로 처리를 하였으며, update문뿐만 아니라 insert, delete, selec 모두 상황에 따라 활용할 수 있습니다.

 

그럼 오늘도 저의 작고 소중한 글을 읽어주셔서 감사합니다.

 

 


 

반응형