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 쿼리를 지정 가능
- 이 속성을 사용하면 연관된 객체를 별도의 쿼리로 조회
- 예시 설명 : selectCustomerById는 customer_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)
'Language > Spring' 카테고리의 다른 글
[SQL Mapper] Mybatis의 ResultMap과 ResultType (0) | 2024.12.17 |
---|---|
[STS] JSP 사용법 (0) | 2024.12.10 |
[SQL Mapper] Mybatis 개념 및 구조 (2) | 2024.12.02 |
[JPA] N+1 문제 (1) | 2024.11.18 |
[JPA] 엔티티 관계의 로딩 전략 - 즉시 로딩 / 지연 로딩 (1) | 2024.11.18 |