[MyBatis] Where 절에서 null 또는 비어있는 String, List 파라미터 처리법 (feat. Spring Utils)

식빵·2023년 4월 25일
0

Mybatis

목록 보기
8/9
post-thumbnail

where 절의 검색 파라미터 Check

MyBatis 로 작성한 select 문의 where 절 에서 사용될 검색용 파라미터는
아래와 같은 예외적인 사항이 발생할 수 있습니다.


  • 문자열이 파라미터의 경우
    • null?
    • 빈문자열?
    • " " 같이 내부에 아무 값도 없는 문자열

  • List, Array 가 파라미터의 경우
    • null?
    • length == 0

이런 사항들 때문에 주로 MyBatis Where 조건절에서는 <if> 태그를 사용해
쓸 수 없거나 무의미한 파라미터들을 걸러내는 작업을 선행합니다.
저도 일을 하면서 이런 경우가 잦은데요, 지금부터 제가 자주 사용하는 방식을 공유하겠습니다.

참고로 Spring FrameWork 을 사용한다는 전제가 깔려있습니다.
org.springframework.util.* 패키지 내부에는 다양한 유틸성 메소드를 제공하고
MyBatis 로 SQL 작성 시에 상당히 유용합니다 👍


파라미터용 예제 DTO 생성

일단 아래와 같은 DTO 를 생성하고, 이걸 MyBatis
<select> 태그 속성인 parameterType 의 값으로 사용하겠습니다

package me.dailycode.dto

@Getter // getter, setter 는 lombok 을 사용해서 생성
@Setter
public class ParamDTO {
	private Long id;
	private String name;
    private List<String> codeList;
}

<where>

<!-- resultType 속성은 주요 관심사가 아니여서 map 을 사용했습니다. -->
<select id="list" parameterType="me.dailycode.dto.ParamDTO" resultType="map">
  select *
  from test_table
  <where>
    <if test='@org.springframework.util.StringUtils@hasText(name)'>
	  AND name = #{name}
    </if>
    <if test='!@org.springframework.util.CollectionUtils@isEmpty(codeList)'>
      AND A.DETAIL_CODE IN
      <foreach collection="codeList" item="item" separator="," open="(" close=")">
        #{item}
      </foreach>
    </if>
  </where>
</select>
  • 참고: <where> 태그는 맨앞에 AND, OR 가 보이면 이를 동적으로 삭제해줍니다.
  • 첫번째 <if> 태그는 name 이라는 문자열 값이 null, 공백 문자열인지 확인합니다.
  • 두번째 <if> 태그는 codeList 라는 List 가 null 인지, 빈 List 인지 확인합니다.
    • 주의! <if> 태그의 test 속성값 맨 앞에 ! 가 있습니다!!

추천사항
<if test=''> 속성값은 꼭 '(홑따옴표) 로 감싸서 사용하시길 바랍니다.
이렇게 해야 ... 정신건강에 좋습니다 😅

  • <if test="~~">
  • <if test='~~'> 👍
profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글