반응형

이번 시간에는 MyBatis에서 동적 SQL을 더 세밀하게 제어할 수 있는 <choose>, <when>, <otherwise> 태그를 배워봅니다. 이 태그는 SQL 조건문을 보다 유연하게 작성할 때 사용됩니다.


1. <choose>, <when>, <otherwise> 태그란?

  • SQL에서 if-else 또는 switch-case 문과 유사한 역할을 합니다.
  • 하나의 조건만 만족하면 해당 블록만 실행되며, 여러 조건문을 간결하게 작성할 수 있습니다.
  • <otherwise>는 모든 조건이 충족되지 않을 때 기본 동작을 정의합니다.

2. 실습: <choose>, <when>, <otherwise> 사용하기

(1) 매퍼 파일 작성

아래는 직원 리스트를 조회하는 동적 SQL 예제입니다.

<mapper namespace="com.example.mapper.EmployeeMapper">

    <select id="selectEmployees" resultType="map">
        SELECT employee_id, first_name, last_name, email, phone_number
        FROM employees
        WHERE 1 = 1
        <choose>
            <when test="departmentId != null">
                AND department_id = #{departmentId}
            </when>
            <when test="jobId != null">
                AND job_id = #{jobId}
            </when>
            <otherwise>
                AND hire_date >= TO_DATE('2023-01-01', 'YYYY-MM-DD')
            </otherwise>
        </choose>
    </select>

</mapper>

설명:

  • departmentId가 제공되면 해당 부서의 직원을 조회합니다.
  • jobId가 제공되면 해당 직무의 직원을 조회합니다.
  • 두 조건이 모두 제공되지 않으면 기본적으로 2023년 1월 1일 이후에 고용된 직원을 조회합니다.

(2) Mapper 인터페이스 작성

package com.example.mapper;

import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface EmployeeMapper {
    List<Map<String, Object>> selectEmployees(@Param("departmentId") Integer departmentId,
                                              @Param("jobId") String jobId);
}

(3) 테스트 코드 작성

package com.example;

import com.example.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public class TestRunner implements CommandLineRunner {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public void run(String... args) throws Exception {
        Integer departmentId = null; // 부서 ID
        String jobId = "IT_PROG"; // 직무 ID

        List<Map<String, Object>> employees = employeeMapper.selectEmployees(departmentId, jobId);

        if (!employees.isEmpty()) {
            for (Map<String, Object> employee : employees) {
                System.out.println("직원 정보: " + employee);
            }
        } else {
            System.out.println("조회된 직원이 없습니다.");
        }
    }
}

3. 동작 원리

  • departmentId와 jobId는 동적 파라미터로 전달되며, 조건에 따라 SQL이 결정됩니다.
  • departmentId와 jobId가 모두 null인 경우 <otherwise> 블록이 실행되어 기본 조건이 적용됩니다.

4. <choose> 태그의 장점

  1. 명확한 조건 처리: 여러 조건 중 하나만 실행되므로 중복 실행을 방지합니다.
  2. 코드 가독성: SQL 조건문을 간결하게 표현할 수 있습니다.
  3. 유연성 제공: 다양한 시나리오를 동적으로 처리할 수 있습니다.

5. 오늘의 요약

  • <choose> 태그는 SQL에서 switch-case와 유사한 역할을 수행합니다.
  • <when>은 각 조건을 정의하며, <otherwise>는 기본 동작을 설정합니다.
  • 이 구조를 활용하면 다양한 조건을 효과적으로 처리할 수 있습니다.
반응형

+ Recent posts