myBatis - 7. Mapper Element(cache, resultMap, sql)

Mapper 엘리먼트

xml에서 사용가능한 엘리먼트는 총 9가지입니다.

<cache>, <cache-ref>, <resultMap>, <parameterMap>, <sql>, <select>, <insert>, <update>, <delete>

 

1. <cache>

cache와 cache-ref 엘리먼트는 캐시를 설정하는 엘리먼트

cache는 현재 네임스페이스에 대한 캐시 설정, cache-ref는 다른 네임 스페이스에 대한 캐시 설정 참조 시 사용

 

캐시란?

컴퓨터 과학에서 데이터나 값을 미리 복사해놓은 임시 장소를 가리킴
캐시 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나, 값을 다시 계산하는 시간을 절약하고 싶은 경우 사용 캐시에 데이터를 미리 복사해놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근 가능

 

<cache> 설정 속성

default설정

1. mapper XML의 모든 select 구문의 결과를 캐시함

2. mapper XML의 insert, update, delete는 모두 캐시를 지움

3. 가장 오랫동안 사용하지 않은 캐시를 지우는 알고리즘을 사용

4. 애플리케이션이 실행되는 동안 캐시를 유지함. 특정 시점에 사라지거나 하지 않음

5. 캐시는 최대 1024개 까지 저장

6. 캐시는 읽기/쓰기가 모두 가능

 

사용 가능 속성

1. eviction : 캐시 알고리즘 속성, 기본값은 LRU

2. flushInterval : 설정 된 캐시를 얼마동안 유지할지 밀리초 단위로 설정함 양수여야함

3. size : 캐시에 저장할 객체의 수를 지정, 기본값은 1024개

4. readonly : 일기만 가능한 경우 캐시 데이터의 변경이 되지 않음.

 

<cache> 실습

ElementTestService.java

public void selectCacheTest() {
		SqlSession sqlSession = getSqlSession();
		
		mapper = sqlSession.getMapper(ElementTestMapper.class);
		
		for(int i = 0; i < 5; i++) {
			Long startTime = System.currentTimeMillis();
			
			List<String> menuList = mapper.selectCacheTest();
			
			if(menuList != null && menuList.size() > 0) {
				System.out.println(menuList);
			}
			
			Long endTime = System.currentTimeMillis();
			
			System.out.println("지연시간 : " + (endTime - startTime) + "ms");
		}
		
		
		sqlSession.close();
		
	}

ElementTestMapper.java

List<String> selectCacheTest();

ElementTestMapper.xml

<select id="selectCacheTest" resultType="string">
	SELECT
  	     MENU_NAME
  	FROM TBL_MENU
</select>

 

2. <resultMap>

데이터베이스 결과 데이터를 객체에 로드하는 방법을 정의하는 엘리먼트

resultMap 엘리먼트는 마이바티스에서 가장 중요하고 강력한 엘리먼트

ResultSet에서 데이터를 가져올 때 JDBC 코드를 대부분 간소화 해주는 역할을 담당함

 

resultMap 속성

1. id : 매핑 구문에서 결과 매핑을 사용할 때 구분하기 위한 아이디

2. type : 결과 매핑을 적용하는 대상 객체 타입(매핑 구문의 결과 데이터를 저장할 자바 타입을 지정)

3. extends : 자바의 상속처럼 기존에 정의 된 매핑 결과를 상속 받아 추가적인 매핑 정보로 확장할 대 사용 (부모 resultMap 아이디 사용함) 

4. authMapping : 결과 매핑을 자동 매핑 할 것인지 결정, 오토 매핑 설정은 동일한 컬럼명이 있는 경우 위험성을 가지기 때문에 사용을 하지않는 것을 추천

 

resultMap의 하위 엘리먼트

1. <id> : primary key 컬럼을 매핑하기 위한 태그

2. <result> : pk가 아닌 일반 컬럼에 매핑하기 위한 태그

3. <constructor> : 인스턴스화 되는 클래스의 생성자에 결과를 삽입하기 위해 사용, <idArg>, <Arg> 하위 엘리먼트 존재

4. <associatrion> : 복잡한 타입의 연간 관계로 1:! 포함 관계인 경우 사용함

5. <collection> : 복잡한 타입의 관계로 1:N 포함 관계인 경우사용함

 

<resultMap> 실습

ElementTestService.java

public void selectResultMapTest() {
		SqlSession sqlSession = getSqlSession();
		
		mapper = sqlSession.getMapper(ElementTestMapper.class);
		
		List<Menu> menuList = mapper.selectResultMapTest();
		
		if(menuList != null && menuList.size() > 0) {
			for(Menu menu : menuList) {
				System.out.println(menu);
			}
		}
		
		sqlSession.close();
		
	}

	public void selectResultConstructorTest() {
		SqlSession sqlSession = getSqlSession();
		
		mapper = sqlSession.getMapper(ElementTestMapper.class);
		
		List<Menu> menuList = mapper.selectResultConstructorTest();
		
		if(menuList != null && menuList.size() > 0) {
			for(Menu menu : menuList) {
				System.out.println(menu);
			}
		}
		
		sqlSession.close();
		
	}

	public void selectResultMapAssociationTest() {
		SqlSession sqlSession = getSqlSession();
		
		mapper = sqlSession.getMapper(ElementTestMapper.class);
		
		List<MenuAndCategory> menuAndCategoryList = mapper.selectResultMapAssociationTest();
		
		if(menuAndCategoryList != null && menuAndCategoryList.size() > 0) {
			for(MenuAndCategory cac : menuAndCategoryList) {
				System.out.println(cac);
			}
		}
		
		sqlSession.close();
		
	}

	public void selectResultMapCollectionTest() {
		SqlSession sqlSession = getSqlSession();
		
		mapper = sqlSession.getMapper(ElementTestMapper.class);
		
		List<CategoryAndMenu> categoryAndMenuList = mapper.selectResultMapCollectionTest();
		
		if(categoryAndMenuList != null && categoryAndMenuList.size() > 0) {
			for(CategoryAndMenu cam : categoryAndMenuList) {
				System.out.println(cam);
			}
		}
		
		sqlSession.close();
		
	}

ElementTestMapper.interface

List<Menu> selectResultMapTest();

	List<Menu> selectResultConstructorTest();

	List<MenuAndCategory> selectResultMapAssociationTest();

	List<CategoryAndMenu> selectResultMapCollectionTest();

 

ElementTestMapper.xml

<resultMap id="selectResultMap1" type="com.memory.model.vo.Menu">
	<id property="code" column="MENU_CODE"/>
	<result property="name" column="MENU_NAME"/>
	<result property="price" column="MENU_PRICE"/>
	<result property="categoryCode" column="CATEGORY_CODE"/>
	<result property="orderableStatus" column="ORDERABLE_STATUS"/>
</resultMap>

<select id="selectResultMapTest" resultMap="selectResultMap1">
	SELECT
		   MENU_CODE
		 , MENU_NAME
		 , MENU_PRICE
		 , CATEGORY_CODE
		 , ORDERABLE_STATUS
      FROM TBL_MENU
     WHERE ORDERABLE_STATUS = 'Y'
     ORDER BY MENU_CODE
</select>

<resultMap id="selectResultMap2" type="com.memory.model.vo.Menu">
	<constructor>
		<idArg column="MENU_CODE" javaType="_int"/>
		<arg column="MENU_NAME" javaType="string"/>
		<arg column="MENU_PRICE" javaType="_int"/>
		<arg column="CATEGORY_CODE" javaType="_int"/>
		<arg column="ORDERABLE_STATUS" javaType="string"/>
		
	</constructor>
</resultMap>
<select id="selectResultConstructorTest" resultMap="selectResultMap2">
	SELECT
		   MENU_CODE
		 , MENU_NAME
		 , MENU_PRICE
		 , CATEGORY_CODE
		 , ORDERABLE_STATUS
      FROM TBL_MENU
     WHERE ORDERABLE_STATUS = 'Y'
     ORDER BY MENU_CODE
</select>

<resultMap id="selectResultMap3" type="com.memory.model.vo.MenuAndCategory">
	<id property="code" column="MENU_CODE"/>
	<result property="name" column="MENU_NAME"/>
	<result property="price" column="MENU_PRICE"/>
	<result property="orderableStatus" column="ORDERABLE_STATUS"/>
	<association property="category" resultMap="selectCategoryMap1"/>
</resultMap>
<resultMap id="selectCategoryMap1" type="com.memory.model.vo.Category">
	<id property="code" column="CATEGORY_CODE"/>
	<result property="name" column="CATEGORY_NAME"/>
	<result property="refCategoryCode" column="REF_CATEGORY_CODE"/>
</resultMap>

<select id="selectResultMapAssociationTest" resultMap="selectResultMap3">
	SELECT
	       MENU_CODE
	     , MENU_NAME
	     , MENU_PRICE
	     , ORDERABLE_STATUS
	     , CATEGORY_CODE
	     , CATEGORY_NAME
	     , REF_CATEGORY_CODE
	     FROM TBL_MENU
	     JOIN TBL_CATEGORY USING(CATEGORY_CODE)
	    WHERE ORDERABLE_STATUS = 'Y'
	     ORDER BY MENU_CODE
</select>

<resultMap id="selectResultMap4" type="com.memory.model.vo.CategoryAndMenu">
	<id property="code" column="CATEGORY_CODE"/>
	<result property="name" column="CATEGORY_NAME"/>
	<result property="refCategoryCode" column="REF_CATEGORY_CODE"/>
	<collection property="menuList" ofType="com.memory.model.vo.Menu">
		<id property="code" column="MENU_CODE"/>
		<result property="name" column="MENU_NAME"/>
		<result property="price" column="MENU_PRICE"/>
		<result property="categoryCode" column="CATEGORY_CODE"/>
		<result property="orderableStatus" column="ORDERABLE_STATUS"/>
	</collection>
</resultMap>

<select id="selectResultMapCollectionTest" resultMap="selectResultMap4">
	SELECT
	       A.CATEGORY_CODE
	     , A.CATEGORY_NAME
	     , A.REF_CATEGORY_CODE
	     , B.MENU_CODE
	     , B.MENU_NAME
	     , B.MENU_PRICE
	     , B.CATEGORY_CODE
	     , B.ORDERABLE_STATUS
	     FROM TBL_CATEGORY A
	     LEFT JOIN TBL_MENU B ON(A.CATEGORY_CODE = B.CATEGORY_CODE)
	     ORDER BY A.CATEGORY_CODE
</select>

 

3. <sql>

각 매핑 구문에서 공통으로 사용할 수 있는 SQL 문자열의 일부를 정의하고 재사용하기 위해 사용함

ElementTestService.java

public void selectSqlTest() {
		SqlSession sqlSession = getSqlSession();
		
		mapper = sqlSession.getMapper(ElementTestMapper.class);
		
		List<Menu> menuList = mapper.selectSqlTest();
		
		if(menuList != null && menuList.size() > 0) {
			for(Menu menu: menuList) {
				System.out.println(menu);
			}
		}
		
	}

 

ElementTestMapper.interface

List<Menu> selectSqlTest();

 

ElementTestMapper.xml

<sql id="selectSql">
	   MENU_CODE
	 , MENU_NAME
	 , MENU_PRICE
	 , CATEGORY_CODE
	 , ORDERABLE_STATUS
</sql>
<select id="selectSqlTest" resultMap="selectResultMap5">
	SELECT
	  <include refid="selectSql"/>
      FROM TBL_MENU
     WHERE ORDERABLE_STATUS = 'Y'
     ORDER BY MENU_CODE
</select>

 

전체 실습 구동

1. <cache> 테스트

 

2. <resultMap> 전부다 출력값 동일

3.<sql>

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유