[java] MyBatis에서 고급 매핑 기법

MyBatis는 자바 객체와 SQL 문 사이의 매핑을 담당하는 ORM 프레임워크입니다. 기본적인 CRUD 작업 외에도 MyBatis는 다양한 고급 매핑 기법을 제공하여 개발자들이 더욱 효율적으로 데이터베이스와 상호작용할 수 있도록 도와줍니다. 이번 포스트에서는 MyBatis에서 사용되는 몇 가지 고급 매핑 기법에 대해 알아보겠습니다.

1. 일대일 (One-to-One) 매핑

일대일 매핑은 두 개의 테이블 간에 하나의 관계를 맺는 방법입니다. 예를 들어, 사용자(User)와 주소(Address) 테이블이 있을 때, 각 사용자가 하나의 주소를 가지는 경우 일대일 매핑을 사용할 수 있습니다.

public class User {
    private int id;
    private String name;
    private Address address;
    
    // getters and setters
}

public class Address {
    private int id;
    private String street;
    private String city;
    
    // getters and setters
}

매핑 파일 (UserMapper.xml)

<resultMap id="userAddressMap" type="User">
    <id property="id" column="user_id" />
    <result property="name" column="user_name" />
    <association property="address" resultMap="addressMap" />
</resultMap>

<resultMap id="addressMap" type="Address">
    <id property="id" column="address_id" />
    <result property="street" column="street" />
    <result property="city" column="city" />
</resultMap>

<select id="getUserById" resultMap="userAddressMap">
    SELECT u.id as user_id, u.name as user_name, a.id as address_id, a.street, a.city
    FROM users u
    INNER JOIN addresses a ON u.id = a.user_id
    WHERE u.id = #{id}
</select>

이렇게 하면 User 객체에는 연관된 Address 객체가 매핑됩니다.

2. 일대다 (One-to-Many) 매핑

일대다 매핑은 한 쪽 엔티티가 여러 개의 관련된 엔티티와 관계를 맺는 방법입니다. 예를 들어, 하나의 주문(Order)이 여러 개의 상품(Product)을 가지는 경우 일대다 매핑을 사용할 수 있습니다.

public class Order {
    private int id;
    private List<Product> products;
    
    // getters and setters
}

public class Product {
    private int id;
    private String name;
    
    // getters and setters
}

매핑 파일 (OrderMapper.xml)

<resultMap id="orderProductMap" type="Order">
    <id property="id" column="order_id" />
    <collection property="products" ofType="Product" resultMap="productMap" />
</resultMap>

<resultMap id="productMap" type="Product">
    <id property="id" column="product_id" />
    <result property="name" column="name" />
</resultMap>

<select id="getOrderById" resultMap="orderProductMap">
    SELECT o.id as order_id, p.id as product_id, p.name
    FROM orders o
    INNER JOIN products p ON o.id = p.order_id
    WHERE o.id = #{id}
</select>

이렇게 하면 Order 객체에는 연관된 Product 객체들이 List로 매핑됩니다.

3. 다대다 (Many-to-Many) 매핑

다대다 매핑은 두 개의 엔티티가 다대다 관계를 맺는 방법입니다. 예를 들어, 하나의 교과목(Course)이 여러 명의 학생(Student)을 가지고, 한 명의 학생이 여러 개의 교과목을 수강하는 경우 다대다 매핑을 사용할 수 있습니다.

public class Course {
    private int id;
    private String name;
    private List<Student> students;
    
    // getters and setters
}

public class Student {
    private int id;
    private String name;
    
    // getters and setters
}

매핑 파일 (CourseMapper.xml)

<resultMap id="courseStudentMap" type="Course">
    <id property="id" column="course_id" />
    <result property="name" column="name" />
    <collection property="students" ofType="Student" resultMap="studentMap" />
</resultMap>

<resultMap id="studentMap" type="Student">
    <id property="id" column="student_id" />
    <result property="name" column="name" />
</resultMap>

<select id="getCourseById" resultMap="courseStudentMap">
    SELECT c.id as course_id, c.name, s.id as student_id, s.name
    FROM courses c
    INNER JOIN course_student cs ON c.id = cs.course_id
    INNER JOIN students s ON cs.student_id = s.id
    WHERE c.id = #{id}
</select>

이렇게 하면 Course 객체에는 연관된 Student 객체들이 List로 매핑됩니다.

결론

이러한 고급 매핑 기법을 사용하여 MyBatis를 효율적으로 활용할 수 있습니다. 일대일, 일대다, 다대다 관계를 매핑하기 위해 적절한 매핑 파일과 SQL 문을 작성하여 객체 간의 관계를 매끄럽게 맺을 수 있습니다. MyBatis의 고급 매핑 기법을 적용하여 확장성과 유지보수성이 뛰어난 애플리케이션을 개발해보세요.

참고 자료