반응형
오늘은 MyBatis를 사용해 다중 테이블 조인을 처리하는 방법에 대해 알아봅니다. 이는 복잡한 데이터 관계를 가진 시스템에서 흔히 사용됩니다.
1. 다중 테이블 조인의 기본 이해
다중 테이블 조인은 두 개 이상의 테이블을 결합하여 데이터를 가져오는 SQL 쿼리입니다. MyBatis에서 이를 활용하면 여러 테이블의 데이터를 결합하여 더욱 풍부한 결과를 얻을 수 있습니다.
2. 실습: 사원 정보와 부서 정보를 조인하기
(1) 데이터베이스 테이블
예제를 위해 아래 두 개의 테이블을 사용합니다.
- employees 테이블:
- employee_id
- first_name
- last_name
- department_id
- departments 테이블:
- department_id
- department_name
(2) SQL 쿼리
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = #{departmentName};
(3) 매퍼 파일 작성
<mapper namespace="com.example.mapper.EmployeeMapper">
<select id="findEmployeesByDepartment" parameterType="string" resultType="map">
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = #{departmentName}
</select>
</mapper>
(4) Mapper 인터페이스 작성
package com.example.mapper;
import java.util.List;
import java.util.Map;
public interface EmployeeMapper {
List<Map<String, Object>> findEmployeesByDepartment(String departmentName);
}
(5) 테스트 코드 작성
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 {
String departmentName = "IT";
List<Map<String, Object>> employees = employeeMapper.findEmployeesByDepartment(departmentName);
if (!employees.isEmpty()) {
System.out.println("[" + departmentName + "] 부서 직원 목록:");
employees.forEach(System.out::println);
} else {
System.out.println("[" + departmentName + "] 부서에 직원이 없습니다.");
}
}
}
3. 동작 원리
- MyBatis는 매퍼 XML 파일의 SQL 문과 파라미터를 바인딩하여 쿼리를 생성합니다.
- 조인된 테이블에서 데이터를 가져오며, 결과는 List<Map> 형태로 반환됩니다.
- 파라미터 값에 따라 동적으로 결과가 달라집니다.
4. 실습 확장: 결과를 객체로 매핑하기
매핑 결과를 더 구조화하려면 resultMap을 활용해 객체로 매핑할 수 있습니다.
(1) Employee 객체
public class Employee {
private int employeeId;
private String firstName;
private String lastName;
private String departmentName;
// Getters and setters
}
(2) 매퍼 파일 수정
<resultMap id="EmployeeResultMap" type="com.example.model.Employee">
<id property="employeeId" column="employee_id" />
<result property="firstName" column="first_name" />
<result property="lastName" column="last_name" />
<result property="departmentName" column="department_name" />
</resultMap>
<select id="findEmployeesByDepartment" parameterType="string" resultMap="EmployeeResultMap">
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = #{departmentName}
</select>
5. 오늘의 요약
- MyBatis에서 다중 테이블 조인을 통해 여러 테이블의 데이터를 결합할 수 있습니다.
- 결과는 Map 형태 또는 객체로 매핑하여 사용할 수 있습니다.
- 조인 쿼리는 데이터베이스 설계와 성능에 따라 적절히 설계해야 합니다.
반응형
'개발 > 전자정부프레임워크' 카테고리의 다른 글
MyBatis ResultMap 활용하기 (0) | 2025.01.01 |
---|---|
MyBatis 동적 SQL 활용하기 (0) | 2025.01.01 |
MyBatis의 동적 SQL 처리 - <choose>, <when>, <otherwise> 태그 (0) | 2025.01.01 |
MyBatis의 동적 SQL 처리 - <set> 태그 (0) | 2024.12.31 |
MyBatis의 동적 SQL 처리 - <where>와 <trim> 태그 (0) | 2024.12.31 |