반응형

오늘은 MyBatis에서 <foreach> 태그를 사용하여 배열이나 컬렉션 데이터를 처리하는 방법을 학습합니다. 이 태그를 활용하면 다수의 데이터를 SQL로 전달하거나 동적으로 여러 조건을 추가할 수 있습니다.


1. <foreach> 태그란?

MyBatis의 <foreach> 태그는 배열, 리스트, 맵 등의 컬렉션 데이터를 처리할 때 사용됩니다. 주요 기능은 다음과 같습니다:

  • SQL IN 조건에 다수의 값을 전달.
  • INSERT 문에 다수의 데이터를 한 번에 처리.
  • 동적으로 쿼리를 생성.

2. 실습: SQL IN 조건에 다수의 값 전달하기

(1) 매퍼 파일 작성

다음은 특정 부서 ID(department_id) 목록에 해당하는 직원 정보를 조회하는 예제입니다.

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

    <!-- 다수의 부서 ID를 기반으로 직원 조회 -->
    <select id="getEmployeesByDepartments" resultType="com.example.domain.Employee">
        SELECT * 
        FROM employees
        WHERE department_id IN
        <foreach item="deptId" index="index" collection="departmentIds" open="(" separator="," close=")">
            #{deptId}
        </foreach>
        ORDER BY employee_id
    </select>

</mapper>

<foreach> 태그 속성 설명:

  • item: 반복 시 각 항목을 참조할 이름.
  • collection: 전달받은 컬렉션 이름.
  • open: 시작 문자 (예: 괄호 열기).
  • separator: 각 항목 사이의 구분자.
  • close: 끝 문자 (예: 괄호 닫기).

(2) Mapper 인터페이스 작성

인터페이스에서 메서드를 정의합니다.

package com.example.mapper;

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

public interface EmployeeMapper {
    List<Employee> getEmployeesByDepartments(List<Integer> departmentIds);
}

(3) 테스트 코드 작성

테스트 코드로 부서 ID 목록에 따른 직원 정보를 조회합니다.

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.Arrays;
import java.util.List;

@Component
public class TestRunner implements CommandLineRunner {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public void run(String... args) throws Exception {
        // 부서 ID 목록 생성
        List<Integer> departmentIds = Arrays.asList(10, 20, 30);

        // 직원 조회
        List<Employee> employees = employeeMapper.getEmployeesByDepartments(departmentIds);

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

3. 실습: 다중 INSERT 처리

(1) 매퍼 파일 작성

다음은 여러 직원 데이터를 한 번에 INSERT하는 예제입니다.

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

    <!-- 다수의 직원 데이터 삽입 -->
    <insert id="insertEmployees">
        INSERT INTO employees (employee_id, first_name, last_name, department_id, salary)
        VALUES 
        <foreach item="employee" index="index" collection="employees" separator=",">
            (#{employee.employeeId}, #{employee.firstName}, #{employee.lastName}, #{employee.departmentId}, #{employee.salary})
        </foreach>
    </insert>

</mapper>

(2) Mapper 인터페이스 작성

인터페이스에서 메서드를 정의합니다.

package com.example.mapper;

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

public interface EmployeeMapper {
    void insertEmployees(List<Employee> employees);
}

(3) 테스트 코드 작성

다중 INSERT 테스트를 실행합니다.

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.ArrayList;
import java.util.List;

@Component
public class TestRunner implements CommandLineRunner {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public void run(String... args) throws Exception {
        // 직원 데이터 생성
        List<Employee> employees = new ArrayList<>();
        employees.add(new Employee(101, "John", "Doe", 10, 5000.0));
        employees.add(new Employee(102, "Jane", "Smith", 20, 6000.0));

        // 직원 데이터 삽입
        employeeMapper.insertEmployees(employees);

        System.out.println("직원 데이터가 성공적으로 삽입되었습니다.");
    }
}

4. 오늘의 요약

  • <foreach> 태그는 다수의 데이터를 SQL 문에서 유연하게 처리하는 데 사용됩니다.
  • IN 조건 및 반복적으로 INSERT 문을 생성할 때 유용합니다.
  • 컬렉션 데이터를 처리하기 위해 item, collection, separator와 같은 속성을 적절히 활용해야 합니다.
반응형

+ Recent posts