반응형

오늘은 MyBatis에서 동적 SQL을 처리할 때 자주 사용되는 <if>와 <choose> 태그를 학습합니다. 이 태그들은 SQL의 조건문을 동적으로 구성할 수 있도록 도와줍니다.


1. <if> 태그란?

  • <if> 태그는 특정 조건에 따라 SQL 구문을 동적으로 추가하거나 제거할 수 있습니다.
  • Boolean 타입의 조건을 사용하며, 조건이 true일 때만 해당 SQL이 실행됩니다.

2. 실습: <if> 태그 사용하기

(1) 매퍼 파일 작성

아래는 employee_id와 department_id로 직원 정보를 검색하는 예제입니다. 두 필드는 선택적으로 사용할 수 있습니다.

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

    <select id="getEmployees" resultType="com.example.domain.Employee">
        SELECT *
        FROM employees
        WHERE 1=1
        <if test="employeeId != null">
            AND employee_id = #{employeeId}
        </if>
        <if test="departmentId != null">
            AND department_id = #{departmentId}
        </if>
        ORDER BY employee_id
    </select>

</mapper>

설명:

  • WHERE 1=1: 동적 SQL을 쉽게 추가하기 위해 기본 조건으로 사용됩니다.
  • <if test="조건">: 조건이 true일 경우에만 해당 SQL이 추가됩니다.

(2) Mapper 인터페이스 작성

package com.example.mapper;

import com.example.domain.Employee;
import java.util.List;
import java.util.Map;

public interface EmployeeMapper {
    List<Employee> getEmployees(Map<String, Object> params);
}

(3) 테스트 코드 작성

package com.example;

import com.example.domain.Employee;
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.HashMap;
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 {
        Map<String, Object> params = new HashMap<>();
        params.put("employeeId", 101); // 또는 null
        params.put("departmentId", null); // 또는 값 설정

        List<Employee> employees = employeeMapper.getEmployees(params);

        for (Employee employee : employees) {
            System.out.println(employee.getFirstName() + " " + employee.getLastName());
        }
    }
}

3. <choose> 태그란?

  • <choose> 태그는 Java의 switch 문과 유사한 역할을 합니다.
  • 하나의 조건이 true인 경우 해당 조건의 SQL을 실행하며, 나머지 조건은 무시됩니다.
  • <when>: 각 조건을 정의.
  • <otherwise>: 모든 조건이 false일 경우 실행할 SQL.

4. 실습: <choose> 태그 사용하기

(1) 매퍼 파일 작성

다음은 employee_id 또는 department_id 중 하나의 조건으로 직원 정보를 검색하는 예제입니다.

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

    <select id="getEmployeeByChoice" resultType="com.example.domain.Employee">
        SELECT *
        FROM employees
        WHERE
        <choose>
            <when test="employeeId != null">
                employee_id = #{employeeId}
            </when>
            <when test="departmentId != null">
                department_id = #{departmentId}
            </when>
            <otherwise>
                1=1
            </otherwise>
        </choose>
    </select>

</mapper>

(2) Mapper 인터페이스 작성

package com.example.mapper;

import com.example.domain.Employee;
import java.util.Map;

public interface EmployeeMapper {
    Employee getEmployeeByChoice(Map<String, Object> params);
}

(3) 테스트 코드 작성

package com.example;

import com.example.domain.Employee;
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.HashMap;
import java.util.Map;

@Component
public class TestRunner implements CommandLineRunner {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public void run(String... args) throws Exception {
        Map<String, Object> params = new HashMap<>();
        params.put("employeeId", null); // 또는 값 설정
        params.put("departmentId", 10); // 또는 null

        Employee employee = employeeMapper.getEmployeeByChoice(params);

        if (employee != null) {
            System.out.println(employee.getFirstName() + " " + employee.getLastName());
        } else {
            System.out.println("No matching employee found.");
        }
    }
}

5. 오늘의 요약

  • <if> 태그는 조건에 따라 SQL 문을 동적으로 추가/제거할 수 있습니다.
  • <choose> 태그는 여러 조건 중 하나만 실행되도록 설계되었습니다.
  • 동적 SQL 처리를 통해 더 유연하고 재사용 가능한 매퍼를 설계할 수 있습니다.
반응형

+ Recent posts