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의 고급 매핑 기법을 적용하여 확장성과 유지보수성이 뛰어난 애플리케이션을 개발해보세요.