MyBatis resultMap의 매핑 정보 정의 순서

YuJun Oh·2024년 9월 4일
0

MyBatis는 Java 객체와 데이터베이스 간의 매핑을 쉽게 처리할 수 있도록 도와주는 강력한 ORM 프레임워크입니다. 특히, resultMap은 SQL 쿼리 결과를 복잡한 Java 객체 구조로 매핑할 때 사용됩니다. 하지만 resultMap을 정의할 때는 특정한 순서를 따라야 합니다. 이 글에서는 resultMap 정의 시 반드시 지켜야 하는 요소들의 순서에 대해 알아보겠습니다.

1. resultMap이란?

resultMap은 MyBatis에서 SQL 쿼리의 결과를 Java 객체로 매핑할 때 사용되는 핵심적인 요소입니다. 복잡한 객체 구조를 매핑하거나, 데이터베이스의 칼럼명과 Java 객체의 필드명이 다를 때 유용하게 사용됩니다. 예를 들어, 연관된 여러 테이블에서 데이터를 가져와 하나의 DTO(Data Transfer Object)로 매핑할 때 resultMap을 사용합니다.

2. resultMap 요소의 순서

resultMap을 정의할 때, MyBatis는 XML 파서가 예상하는 특정한 순서를 요구합니다. 이 순서를 지키지 않으면 "The content of element type 'resultMap' must match..."와 같은 오류가 발생할 수 있습니다. 따라서, 올바른 순서로 resultMap을 정의해야 합니다.

2.1 constructor (선택적)

constructor는 생성자를 통해 객체를 초기화할 때 사용됩니다. 이 요소는 선택적이며, 대부분의 경우 필수는 아닙니다. 이 요소를 사용하면 매핑 시 객체의 특정 생성자를 호출할 수 있습니다.

2.2 id (필수적)

id 요소는 기본 키 컬럼을 매핑하는 데 사용됩니다. resultMap에서는 가장 먼저 정의되어야 하며, 하나 이상의 id 요소가 존재할 수 있습니다. 이 요소는 데이터베이스의 기본 키와 Java 객체의 필드를 연결합니다.

<id property="userId" column="user_id"/>
2.3 result (필수적)

result 요소는 일반적인 컬럼 매핑에 사용됩니다. 기본 키가 아닌 컬럼을 Java 객체의 필드에 매핑할 때 사용되며, id 다음에 정의됩니다. 여러 개의 result 요소를 정의할 수 있습니다.

<result property="username" column="user_name"/>
2.4 association (선택적)

association 요소는 연관된 객체를 매핑할 때 사용됩니다. 예를 들어, 한 테이블의 데이터와 관련된 다른 테이블의 데이터를 함께 매핑해야 할 때 사용됩니다. 이 요소는 result 요소 다음에 위치해야 합니다.

<association property="address" javaType="com.example.Address">
    <id property="addressId" column="address_id"/>
    <result property="street" column="street_name"/>
</association>
2.5 collection (선택적)

collection 요소는 여러 개의 연관된 객체를 컬렉션 형태로 매핑할 때 사용됩니다. 이 요소는 association과 유사하지만, 복수의 객체를 리스트나 셋과 같은 컬렉션으로 매핑할 때 사용됩니다. association 다음에 위치해야 합니다.

<collection property="orders" ofType="com.example.Order">
    <id property="orderId" column="order_id"/>
    <result property="orderDate" column="order_date"/>
</collection>
2.6 discriminator (선택적)

discriminator 요소는 결과에 따라 다른 매핑을 선택할 수 있도록 해줍니다. 이 요소는 결과 데이터에 따라 다른 객체 유형으로 매핑해야 하는 경우에 사용되며, collection 다음에 위치합니다.

<discriminator javaType="string" column="user_type">
    <case value="ADMIN" resultMap="adminResultMap"/>
    <case value="USER" resultMap="userResultMap"/>
</discriminator>

3. 결론

MyBatis의 resultMap을 정의할 때 요소들의 순서를 올바르게 지키는 것이 중요합니다. 잘못된 순서로 요소를 배치하면 XML 파서에서 오류가 발생하고, 매핑이 올바르게 이루어지지 않을 수 있습니다. id 요소가 가장 먼저 와야 하며, 그 다음에 result, association, collection, discriminator의 순서로 배치해야 합니다. 이 순서를 잘 지켜야 MyBatis의 강력한 매핑 기능을 제대로 활용할 수 있습니다.

0개의 댓글

관련 채용 정보