[Project] 직원 상세정보 update 쿼리문에 Null 값 허용하기

이슬기·2024년 2월 13일
0

project

목록 보기
31/42

직원 전체 목록에서 신규등록으로 필수 값만 넣어 등록한 뒤, 그 직원의 상세정보 일부만 수정하여 update를 하려고 하면 org.mybatis.spring.MyBatisSystemException이 발생하며 update가 되지 않았다.

그러나 기존 DB에 넣어둔 더미 값은 수정했을 때 update가 잘 되는 현상이 나타났다. 기존 값은 update가 되고 신규등록으로 입력한 값은 update가 되지 않는 update 쿼리문은 아래와 같다.

<update id="empInfoUpdate" parameterType="map">
        update EMPLOYEE
        set
            E_NAME = #{E_NAME},
            E_ADDRESS = #{E_ADDRESS},
            E_AUTH = #{E_AUTH},
            E_STATUS = #{E_STATUS},
            E_EMAIL = #{E_EMAIL},
            E_GENDER = #{E_GENDER},
            E_HIREDATE = #{E_HIREDATE},
            E_ENDDATE = #{E_ENDDATE},
            E_PASSWORD = #{E_PASSWORD},
            E_PHONE = #{E_PHONE},
            E_RANK = #{E_RANK},
            E_BIRTH = #{E_BIRTH},
            DEPT_NAME = #{DEPT_NAME},
            E_OCCUP = #{E_OCCUP},
            E_PROFILE = #{E_PROFILE}
        where E_NO = #{E_NO}
    </update>

기존 값은 update가 되는데 신규등록한 값은 update가 되지 않는 현상이 무엇일지 값들을 비교해보았고 다른 점은 update 쿼리문에 해당하는 모든 값이 직원 정보에 입력되어 있는가 비어있는가 였다.
확인을 위해 신규등록하여 입력되어 있는 값들 중 하나를 DB에서 직접 모든 값을 입력해주었고 그 뒤에 프론트에서 내용을 수정하고 update를 하니 정상적으로 처리가 되었다.

즉, 위 쿼리문의 속성 내용이 반드시 있어야만 update가 성공하는 것이다. 이를 해결하기 위해 if문을 사용하여 null 값도 허용하도록 쿼리문을 수정하였다.

    <update id="empInfoUpdate" parameterType="map">
        update EMPLOYEE
        <set>
            <if test="E_NAME != null">E_NAME = #{E_NAME},</if>
            <if test="E_ADDRESS != null">E_ADDRESS = #{E_ADDRESS},</if>
            <if test="E_AUTH != null">E_AUTH = #{E_AUTH},</if>
            <if test="E_STATUS != null">E_STATUS = #{E_STATUS},</if>
            <if test="E_EMAIL != null">E_EMAIL = #{E_EMAIL},</if>
            <if test="E_GENDER != null">E_GENDER = #{E_GENDER},</if>
            <if test="E_HIREDATE != null">E_HIREDATE = #{E_HIREDATE},</if>
            <if test="E_ENDDATE != null">E_ENDDATE = #{E_ENDDATE},</if>
            <if test="E_PASSWORD != null">E_PASSWORD = #{E_PASSWORD},</if>
            <if test="E_PHONE != null">E_PHONE = #{E_PHONE},</if>
            <if test="E_RANK != null">E_RANK = #{E_RANK},</if>
            <if test="E_BIRTH != null">E_BIRTH = #{E_BIRTH},</if>
            <if test="DEPT_NAME != null">DEPT_NAME = #{DEPT_NAME},</if>
            <if test="E_OCCUP != null">E_OCCUP = #{E_OCCUP},</if>
            <if test="E_PROFILE != null">E_PROFILE = #{E_PROFILE},</if>
            <if test="E_ADDRESS != null">E_ADDRESS = #{E_ADDRESS},</if>
        </set>
        where E_NO = #{E_NO}
    </update>

MyBatis에서는 기본적으로 매핑된 SQL 쿼리의 매개 변수가 null이 아닌 것으로 가정한다. 따라서 매개 변수가 null이면 MyBatis는 SQL을 생성하는 중에 오류가 발생할 수 있다.
이 문제를 해결하기 위해 동적 SQL을 사용하여 Null 체크하면 된다. 각 속성에 대한 Null 체크를 추가하여 해당 속성이 Null이 아닌 경우에만 업데이트 쿼리를 실행시키면 문제가 해결된다.
<if> 요소를 사용하여 조건부로 업데이트 쿼리를 생성하였다.

0개의 댓글

관련 채용 정보