본문 바로가기

Language/Spring

[SQL Mapper] Mybatis의 태그 [association, collection, sql, include]

association과 collection 태그
  • 두 개의 태그는 객체의 연관 관계를 나타날 때 사용
  • association (연계, 제휴)
    • 제휴는 1:1로 맺는 것이기 때문에 객체 간의 연관 관계가 1:1 관계일 때 사용
  • collection (무리, 더미)
    • 무리, 더미는 여러 가지가 모인 것이기 때문에 객체 간의 연관 관계가 1:N 관계일 때 사용

 

association, collection 태그의 속성
property (필수)
  • 연관된 객체의 속성명을 지정
  • 연관된 객체를 매핑할 대상의 필드명과 일치해야 함
  • 예시 설명 : customer는 Order 객체 내의 필드명이고, 이 필드는 Customer 객체와 연관 관계를 맺음
<association property="customer" column="customer_id" />

 

column (필수)
  • SQL 쿼리에서 사용되는 컬럼명을 지정
  • 연관된 객체를 매핑할 때 어떤 기준으로 삼을 지 정의(Foreign Key)
  • 예시 설명 : customer_id는 데이터베이스 테이블의 컬럼으로, 이를 통해 Customer 객체와 매핑
select (선택)
  • 연관된 객체를 조회하기 위한 별도의 SELECT 쿼리를 지정 가능
  • 이 속성을 사용하면 연관된 객체를 별도의 쿼리로 조회
  • 예시 설명 : selectCustomerByIdcustomer_id 컬럼에 해당하는 값을 기반으로 연관된 Customer 객체를 조회하는 별도의 SQL 쿼리
    → 즉, selectCustomerById의 쿼리가 실행되어 customer_id에 해당하는 customer 정보가 association에 지정된 customer에 담김
<association property="customer" column="customer_id" select="selectCustomerById" />

<select id="selectCustomerById" resultType="kr.co.gmcorp.vo.Customer">
    SELECT 
        customer_id, 
        customer_name, 
        customer_email
    FROM 
        customer
    WHERE 
        customer_id = #{customerId}
</select>

 

resultMap (선택)
  • 연관된 객체를 조회할 때 사용할 resultMap을 지정
  • 이 속성은 select 속성과 함께 사용될 때 유용하며, 연관된 객체를 어떻게 매핑할지를 정의하는 resultMap을 지정 가능
  • 예시 설명 : customerResultMap은 Customer 객체를 매핑하기 위한 resultMap으로, 이 resultMap을 사용하여 Customer 객체를 생성하고 매핑
<association property="customer" column="customer_id" resultMap="customerResultMap" />

 

columnPrefix (선택)
  • 연관된 객체의 컬럼명에 접두어(prefix)를 추가 할 수 있음
  • 이 속성은 연관된 객체가 여러 개의 컬럼을 가져올 때, 컬럼명에 접두어를 추가하여 구별 가능
  • columnPrefix는 연관된 객체의 컬럼명이 다른 테이블에서 동일한 이름을 가질 때 충돌을 피하는 데 유용
  • 예시 설명 : customer_id 컬럼이 cust_customer_id로 매핑 됨
<association property="customer" column="customer_id" columnPrefix="cust_" />

 

javaType (선택)
  • 매핑되는 속성에 대한 Java 객체의 타입을 명시적으로 설정하는 데 사용
  • 연관된 객체의 타입을 MyBatis가 자동으로 추론할 수 없거나, 특정 타입으로 명시적으로 지정하려는 경우에 유용
  • association이 매핑하는 객체가 기본적인 Java 타입 (예: String, Integer 등)이 아니거나, 복잡한 타입(사용자 정의 객체 또는 List, Map 같은 Collection)일 경우 javaType을 통해 명시적으로 설정
  • 즉, 이 속성은 association의 property에 해당하는 객체가 어떤 Java 타입인지 MyBatis에 알려주는 역할

예시1)

  • customer라는 속성이 Customer 클래스로 매핑되도록 지정
  • javaType을 사용하여 명확하게 Java 클래스 타입을 지정했기 때문에 MyBatis가 자동으로 추론하는 것보다 더 확실하게 타입을 설정 가능
<association property="customer" column="customer_id" javaType="kr.co.gmcorp.vo.Customer" />

 

예시2)

  • 연관된 객체가 List 타입임을 지정
  • 예를 들어, 한 명의 고객이 여러 개의 주문을 가질 수 있기 때문에 orders는 List로 설정
<association property="orders" column="customer_id" javaType="java.util.List" />

 

ofType (선택)
  • javaType과 동일한 역할
  • 단, ofType은 collection 태그에서 명시적으로 타입을 지정해주는 속성
  • <association>의 명시적 타입 지정 = javaType
  • <collection>의 명시적 타입 지정 = ofType
속성 정리

 

  • property : 연관된 객체의 필드명 지정 (Java 필드명)
  • column : SQL 쿼리에서 연관된 객체를 매핑할 컬럼 지정 (DB 컬럼명)
  • select : 연관된 객체를 조회하는 별도의 SQL 쿼리 지정
  • resultMap : 연관된 객체를 매핑할 때 사용할 resultMap 지정
  • columnPrefix : 연관된 객체의 컬럼에 접두어를 추가하여 구별 가능
  • javaType
    • 연관된 객체의 Java 타입을 명시적으로 지정
    • 이 속성을 사용하면 MyBatis가 객체의 타입을 자동으로 추론하는 대신 명시된 타입으로 매핑
    • 1:1 관계에서 단일 객체의 타입을 지정 (association)
  • ofType : 1:N 관계에서 컬렉션의 각 요소의 타입을 지정 (collection)