BackEnd/Spring
[Spring] mybatis의 <ResultMap>, <association> 태그
ryuneng
2025. 1. 18. 00:06
반응형
❓ <ResultMap>
- join 매핑 등 복잡한 구문을 간단하게 서술할 수 있도록 만들어주는 태그
- 컬럼이름과 값을 저장하는 객체의 프로퍼티명(멤버변수명)을 매핑시킨다.
✔️ 주요 속성
<resultMap type="com.example.vo.Product" id="ProductResultMap">
<!-- ... -->
</resultMap>
1. type
- 조회결과를 저장할 클래스의 전체 이름
2. id
- 식별자를 지정한다.
✔️ 주요 태그
<resultMap type="com.example.vo.Product" id="ProductResultMap">
<id column="product_no" property="no"/>
<result column="product_name" property="name"/>
</resultMap>
1. <id>
- 특정 컬럼값을 멤버변수에 매핑시킨다.
- 기본키 컬럼
2. <result>
- 특정 컬럼값을 멤버변수에 매핑시킨다.
- 기본키 컬럼을 제외한 나머지 컬럼
❓ <association>
- 복잡한 타입의 연관 관계를 나타낸다.
(대부분 객체 타입)
- "has-one" 타입의 관계를 다루는 태그
- 복잡한 타입의 연관 관계 ex)
상품 - 제조사
사원 - 소속부서
게시글 - 작성자
class Product {
int no;
String name;
int price;
Company company; // 복잡한 타입의 연관관계
ProductCategory category; // 복잡한 타입의 연관관계
}
- 상품객체에는 제조사정보를 표현하는 Company company 멤버변수(프로퍼티)가 있다.
- company 프로퍼티에는 Company 객체가 연결되어야 한다.
- CompanyMapper의 getCompanyByNo SQL 구문은 제조사 번호를 전달받아서 제조사정보를 조회하고, 조회된 정보를 Company 객체에 담아서 반환한다.
<association>
태그로 Product객체의 Company company 프로퍼티에 대입될 객체를
CompanyMapper의 getCompanyByNo SQL 구문을 실행시켜서 획득한 Company 객체를 대입시킨다.
* 한마디로, 매퍼에 있는 다른 SQL문을 실행해서 그 실행결과를 property에 담는다.
* 쿼리가 단순해지는 장점이 있는 반면, 쿼리가 3번 실행된다는 단점이 있다.
✔️ 주요 속성
1. column
- 컬럼명, 위의 예시에서는 getCompanyByNo SQL 구문 실행에 필요한 값이 들어있는 컬럼명이다.
즉, shop_products 테이블에서 제조사 번호가 들어있는 company_no 컬럼이다.
전달할 값이 복합키인 경우에는 column="{prop1=column1, prop2=column2}"와 같이 작성한다.
2. property
association />
태그로 실행시킨 다른 SQL 구문의 결과값을 저장할 프로퍼티 이름
즉, Product 객체의 Company company 필드의 company다.
3. select
- 실행시킬 다른 SQL 구문의 식별자 ID
같은 Mapper일 때는 ID값만 적고, 다른 Mapper일 때는 패키지명+매퍼인터페이스명 + ID값을 적는다.
<association />, <collection />
1. <association /> : 복잡한 타입의 연관관계를 나타내며, "has-one"타입의 관계를 나타낸다.
2. <collection /> : 복잡한 타입의 콜렉션 연관관계를 나타내며, "has-many"타입의 관계를 나타낸다.
class Product {
int no;
String name;
int price;
Company company; - 복잡한 타입의 연관관계
ProductCategory category; - 복잡한 타입의 연관관계
List<Review> reviews; - 복잡한 타입의 콜렉션 연관관계
}
<ResultMap>
, <association>
사용 예시
참고) select * 은 간단한 예시를 위해 사용했으나, 실제 코드에서는 지양해야 함
<!-- resultMap 정의 -->
<resultMap type="com.example.vo.Product" id="ProductResultMap">
<id column="product_no" property="no"/>
<result column="product_name" property="name"/>
<result column="product_description" property="description"/>
<result column="product_price" property="price"/>
<association property="company" column="company_no"
select="com.example.mapper.CompanyMapper.getCompanyByNo" />
<association property="category" column="product_category_no"
select="com.example.mapper.ProductCategoryMapper.getProductCategoryByNo" />
</resultMap>
<!-- resultMap 사용 -->
<select id="getProductByNo" parameterType="int" resultMap="ProductResultMap">
select
*
from
shop_products
where
product_no = #{value}
</select>
<ResultMap>
사용을 권장하지는 않음
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-mybatis-ResultMap-association