개발/전자정부프레임워크

MyBatis의 동적 SQL 처리 - <where>와 <trim> 태그

꿈꾸는법사 2024. 12. 31. 15:27
반응형

오늘은 MyBatis에서 동적 SQL 작성을 더 효율적으로 도와주는 <where>와 <trim> 태그를 학습합니다. 이 태그들은 조건문과 SQL 문을 깔끔하게 정리하는 데 유용합니다.


1. <where> 태그란?

  • <where> 태그는 조건문이 추가될 때 자동으로 WHERE 키워드를 생성합니다.
  • 조건문이 없으면 WHERE 키워드를 생성하지 않아 불필요한 SQL 오류를 방지합니다.
  • 선행되는 AND 또는 OR 연산자를 자동으로 처리합니다.

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

(1) 매퍼 파일 작성

다음은 여러 조건으로 직원 정보를 검색하는 예제입니다.

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

    <select id="getEmployeesWithWhere" resultType="com.example.domain.Employee">
        SELECT *
        FROM employees
        <where>
            <if test="employeeId != null">
                employee_id = #{employeeId}
            </if>
            <if test="departmentId != null">
                AND department_id = #{departmentId}
            </if>
            <if test="jobId != null">
                AND job_id = #{jobId}
            </if>
        </where>
    </select>

</mapper>

설명:

  • <where> 태그는 조건이 하나라도 있으면 자동으로 WHERE 키워드를 추가합니다.
  • 조건이 여러 개일 경우 AND를 적절히 처리하여 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> getEmployeesWithWhere(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", null); // 또는 값 설정
        params.put("departmentId", 10); // 또는 null
        params.put("jobId", "IT_PROG"); // 또는 null

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

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

3. <trim> 태그란?

  • <trim> 태그는 SQL 문에서 특정 문자열을 앞뒤로 추가하거나 제거할 수 있습니다.
  • 동적 SQL의 선행 또는 후행 AND, OR 같은 논리 연산자를 제거하는 데 주로 사용됩니다.

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

(1) 매퍼 파일 작성

아래는 department_id와 job_id 조건에 따라 직원 정보를 검색하는 예제입니다.

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

    <select id="getEmployeesWithTrim" resultType="com.example.domain.Employee">
        SELECT *
        FROM employees
        <trim prefix="WHERE" prefixOverrides="AND |OR">
            <if test="departmentId != null">
                AND department_id = #{departmentId}
            </if>
            <if test="jobId != null">
                AND job_id = #{jobId}
            </if>
        </trim>
    </select>

</mapper>

설명:

  • prefix="WHERE": 조건이 추가되면 WHERE 키워드가 앞에 붙습니다.
  • prefixOverrides="AND |OR": 조건문 앞에 붙는 AND 또는 OR을 제거합니다.

(2) Mapper 인터페이스 작성

package com.example.mapper;

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

public interface EmployeeMapper {
    List<Employee> getEmployeesWithTrim(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("departmentId", null); // 또는 값 설정
        params.put("jobId", "IT_PROG"); // 또는 null

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

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

5. 오늘의 요약

  • <where> 태그는 조건문이 추가될 때만 WHERE 키워드를 생성하며, SQL 문을 깔끔하게 유지합니다.
  • <trim> 태그는 SQL의 특정 키워드나 불필요한 논리 연산자를 제거하여 동적 SQL을 보다 유연하게 작성할 수 있습니다.
반응형