MyBatis는 Java 객체와 데이터베이스 간의 매핑을 쉽게 처리할 수 있도록 도와주는 강력한 ORM 프레임워크입니다. 특히, resultMap
은 SQL 쿼리 결과를 복잡한 Java 객체 구조로 매핑할 때 사용됩니다. 하지만 resultMap
을 정의할 때는 특정한 순서를 따라야 합니다. 이 글에서는 resultMap
정의 시 반드시 지켜야 하는 요소들의 순서에 대해 알아보겠습니다.
resultMap
이란?resultMap
은 MyBatis에서 SQL 쿼리의 결과를 Java 객체로 매핑할 때 사용되는 핵심적인 요소입니다. 복잡한 객체 구조를 매핑하거나, 데이터베이스의 칼럼명과 Java 객체의 필드명이 다를 때 유용하게 사용됩니다. 예를 들어, 연관된 여러 테이블에서 데이터를 가져와 하나의 DTO(Data Transfer Object)로 매핑할 때 resultMap
을 사용합니다.
resultMap
요소의 순서resultMap
을 정의할 때, MyBatis는 XML 파서가 예상하는 특정한 순서를 요구합니다. 이 순서를 지키지 않으면 "The content of element type 'resultMap' must match..."와 같은 오류가 발생할 수 있습니다. 따라서, 올바른 순서로 resultMap
을 정의해야 합니다.
constructor
(선택적)constructor
는 생성자를 통해 객체를 초기화할 때 사용됩니다. 이 요소는 선택적이며, 대부분의 경우 필수는 아닙니다. 이 요소를 사용하면 매핑 시 객체의 특정 생성자를 호출할 수 있습니다.
id
(필수적)id
요소는 기본 키 컬럼을 매핑하는 데 사용됩니다. resultMap
에서는 가장 먼저 정의되어야 하며, 하나 이상의 id
요소가 존재할 수 있습니다. 이 요소는 데이터베이스의 기본 키와 Java 객체의 필드를 연결합니다.
<id property="userId" column="user_id"/>
result
(필수적)result
요소는 일반적인 컬럼 매핑에 사용됩니다. 기본 키가 아닌 컬럼을 Java 객체의 필드에 매핑할 때 사용되며, id
다음에 정의됩니다. 여러 개의 result
요소를 정의할 수 있습니다.
<result property="username" column="user_name"/>
association
(선택적)association
요소는 연관된 객체를 매핑할 때 사용됩니다. 예를 들어, 한 테이블의 데이터와 관련된 다른 테이블의 데이터를 함께 매핑해야 할 때 사용됩니다. 이 요소는 result
요소 다음에 위치해야 합니다.
<association property="address" javaType="com.example.Address">
<id property="addressId" column="address_id"/>
<result property="street" column="street_name"/>
</association>
collection
(선택적)collection
요소는 여러 개의 연관된 객체를 컬렉션 형태로 매핑할 때 사용됩니다. 이 요소는 association
과 유사하지만, 복수의 객체를 리스트나 셋과 같은 컬렉션으로 매핑할 때 사용됩니다. association
다음에 위치해야 합니다.
<collection property="orders" ofType="com.example.Order">
<id property="orderId" column="order_id"/>
<result property="orderDate" column="order_date"/>
</collection>
discriminator
(선택적)discriminator
요소는 결과에 따라 다른 매핑을 선택할 수 있도록 해줍니다. 이 요소는 결과 데이터에 따라 다른 객체 유형으로 매핑해야 하는 경우에 사용되며, collection
다음에 위치합니다.
<discriminator javaType="string" column="user_type">
<case value="ADMIN" resultMap="adminResultMap"/>
<case value="USER" resultMap="userResultMap"/>
</discriminator>
MyBatis의 resultMap
을 정의할 때 요소들의 순서를 올바르게 지키는 것이 중요합니다. 잘못된 순서로 요소를 배치하면 XML 파서에서 오류가 발생하고, 매핑이 올바르게 이루어지지 않을 수 있습니다. id
요소가 가장 먼저 와야 하며, 그 다음에 result
, association
, collection
, discriminator
의 순서로 배치해야 합니다. 이 순서를 잘 지켜야 MyBatis의 강력한 매핑 기능을 제대로 활용할 수 있습니다.