반응형
오늘은 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와 같은 속성을 적절히 활용해야 합니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
MyBatis의 동적 SQL 처리 - <where>와 <trim> 태그 (0) | 2024.12.31 |
---|---|
MyBatis의 동적 SQL 처리 - <if>와 <choose> 태그 (0) | 2024.12.31 |
MyBatis의 동적 SQL 사용법 (0) | 2024.12.31 |
MyBatis를 사용한 Oracle 데이터 페이징 처리 (0) | 2024.12.31 |
Spring Security 커스터마이징 (Custom UserDetailsService 구현) (0) | 2024.12.30 |