반응형

오늘은 MyBatis를 사용해 다중 테이블 조인을 처리하는 방법에 대해 알아봅니다. 이는 복잡한 데이터 관계를 가진 시스템에서 흔히 사용됩니다.


1. 다중 테이블 조인의 기본 이해

다중 테이블 조인은 두 개 이상의 테이블을 결합하여 데이터를 가져오는 SQL 쿼리입니다. MyBatis에서 이를 활용하면 여러 테이블의 데이터를 결합하여 더욱 풍부한 결과를 얻을 수 있습니다.


2. 실습: 사원 정보와 부서 정보를 조인하기

(1) 데이터베이스 테이블

예제를 위해 아래 두 개의 테이블을 사용합니다.

  1. employees 테이블:
    • employee_id
    • first_name
    • last_name
    • department_id
  2. 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. 동작 원리

  1. MyBatis는 매퍼 XML 파일의 SQL 문과 파라미터를 바인딩하여 쿼리를 생성합니다.
  2. 조인된 테이블에서 데이터를 가져오며, 결과는 List<Map> 형태로 반환됩니다.
  3. 파라미터 값에 따라 동적으로 결과가 달라집니다.

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 형태 또는 객체로 매핑하여 사용할 수 있습니다.
  • 조인 쿼리는 데이터베이스 설계와 성능에 따라 적절히 설계해야 합니다.
반응형

+ Recent posts