본문 바로가기

Java, Spring/18일

18일차 4

iBatis의 다른 기능 알아보자.

iBATIS-SqlMaps-2_ko.pdf, iBATIS-SqlMaps-2-Tutorial_ko.pdf 참고.

.

.

.

resultMap

Dto와 Database Column명이 일치하지 않을 경우 mapping시키기 위함.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
	<!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 -->
	<typeAlias alias="boardDto" type= "board.model.BoardDto"/>
	
 	<resultMap class="boardDto" id="dto" >
	<!--<result property="Dto안의 필드이름" column="데이터베이스컬럼명" />  -->
		<result property="seq" column="seq" />
		<result property="title" column="subject" /> <!-- test위해 바꿔 봤어 -->
		<result property="name" column="name" />
		<result property="writeday" column="writeday" />
		<result property="readcount" column="readcount" />
		<!-- resultMap에서는 남는 column이 있으면 에러나 -->		
		<!-- <result property="content" column="content" />-->
	</resultMap>
		
	<select id="getList" resultMap="dto">
	<![CDATA[
		SELECT seq, title as subject, name, to_char(writeday,'YYYY/MM/DD') as writeday, readcount
		FROM   board
		ORDER  BY seq DESC		
	]]>
	</select>
	
	<!-- 생략 -->

우리는 일치하지만 test를 위해 일부러 title을 subject로 해본거지.

주의! column갯수가 일치해야해. resultMap에서는 남는 column이 있으면 에러나..

그런데 이 resultMap을 다른 곳(예를 들어 getView)에서도 써야 한다면 Map을 여러 개 만드는것 보다 차라리 getList에서도 그냥 가상으로 컬럼을 만들어 주는게 좋겠지. (getView에서는 content필요없지만 그냥 받는거지)

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
	<!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 -->
	<typeAlias alias="boardDto" type= "board.model.BoardDto"/>
	
 	<resultMap class="boardDto" id="dto" >
	<!--<result property="Dto안의 필드이름" column="데이터베이스컬럼명" />  -->
		<result property="seq" column="seq" />
		<result property="title" column="subject" /> <!-- test위해 바꿔 봤어 -->
		<result property="name" column="name" />
		<result property="writeday" column="writeday" />
		<result property="readcount" column="readcount" />	
		<result property="content" column="content" />
	</resultMap>
		
	<select id="getList" resultMap="dto">
	<![CDATA[
		SELECT seq, title as subject, name, to_char(writeday,'YYYY/MM/DD') as writeday, readcount
					, content 
		FROM   board
		ORDER  BY seq DESC			
	]]>
	</select>
	
	<!-- 생략 -->

.

.

.

cacheModel

- 게시판에서 많이 쓰는 ‘리스트보기’ cache사용하기.


SqlMapConfig.xml에 캐쉬쓰겠다고 설정.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig   
	PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"   
	"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

  <settings cacheModelsEnabled="true" /> <!-- cache를 쓰겠다고 -->
  <transactionManager type="JDBC" commitRequired="false">
    <dataSource type="SIMPLE"> <!-- SIMPLE : 일반JDBC방식 -->
      <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
      <property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:xe"/>
      <property name="JDBC.Username" value="oraclejava"/>
      <property name="JDBC.Password" value="oraclejava"/>
    </dataSource>
  </transactionManager>

  <sqlMap resource="ibatis/query.xml"/> 

</sqlMapConfig>

query.xml cacheModel설정 & getList에 적용

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
	<!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 -->
	<typeAlias alias="boardDto" type= "board.model.BoardDto"/>
	
	<cacheModel id="boardcache" type="LRU"> <!-- LRU알고리즘사용 -->
		<flushInterval hours="24" /> <!-- 기존의 cache를 24시간 유지 -->
		<property name="reference-type" value="WEAK" />		
	</cacheModel>	
	
	<select id="getList" resultClass="boardDto" cacheModel="boardcache"> 
	<![CDATA[
		SELECT seq, title, name, to_char(writeday,'YYYY/MM/DD') as writeday, readcount
		FROM   board
		ORDER  BY seq DESC		
	]]>
	</select>
	
	<!-- 생략 -->

LRU알고리즘(Least Recently Used: 최근에 가장 오래동안 사용하지 않은 값을 캐시에서 먼저 삭제) Queue지 선입선출(FIFO:First In First Out)
많이 쓰는 쿼리일 경우 계속 사용되는 거지.

이제 데이터가 바뀌어도 리스트는 변하지 않지. 동접자가 많을 경우 이런 처리는 아주 유용해.


데이터가 변경되면 cache삭제해야지. inserBoard 실행시 메모리 비우게 해보면

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
	<!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 -->
	<typeAlias alias="boardDto" type= "board.model.BoardDto"/>
	
	<cacheModel id="boardcache" type="LRU"> <!-- LRU알고리즘사용 -->
		<flushInterval hours="24" /> <!-- 기존의 cache를 24시간 유지 -->
		<property name="reference-type" value="WEAK" />	
		
		<!--  데이터가 변경 될 경우 메모리를 비우겠다  -->
		<flushOnExecute statement="insertBoard" />		
	</cacheModel>	
	
	<select id="getList" resultClass="boardDto" cacheModel="boardcache"> 
	<![CDATA[
		SELECT seq, title, name, to_char(writeday,'YYYY/MM/DD') as writeday, readcount
		FROM   board
		ORDER  BY seq DESC		
	]]>
	</select>
	
	<!-- 생략 -->

테스트해보면 update, delete하고 http://localhost/springibatisboard/BoardList.do 실행하면 적용이 안되지만 insert할 때는 적용이돼.

나머지 update, delete의 경우도 메모리삭제되게하자.
조회수에 적용하면 cache사용하는 의미가 없지.

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
	<!-- resultClass,parameterClass에 매번 "board.model.BoardDto"쓰기 귀찮아 -->
	<typeAlias alias="boardDto" type= "board.model.BoardDto"/>
	
	<cacheModel id="boardcache" type="LRU"> <!-- LRU알고리즘사용 -->
		<flushInterval hours="24" /> <!-- 기존의 cache를 24시간 유지 -->
		<property name="reference-type" value="WEAK" />	
		
		<!--  데이터가 변경 될 경우 메모리를 비우겠다  -->
		<flushOnExecute statement="insertBoard" />		
		<flushOnExecute statement="updateBoard" />		
		<flushOnExecute statement="deleteBoard" />		
		
	</cacheModel>	
	
	<select id="getList" resultClass="boardDto" cacheModel="boardcache"> 
	<![CDATA[
		SELECT seq, title, name, to_char(writeday,'YYYY/MM/DD') as writeday, readcount
		FROM   board
		ORDER  BY seq DESC		
	]]>
	</select>
	
	<!-- 생략 -->

.

.

컴파일 잘 안될때

stop시키고

Clean Tomcat Work Directory… 하고 다시 Clean..

.

.

.

.

간단한 동적 SQL (Dynamic Query) 가능. $ $이용.

등등의 기능은 필요할 때 pdf문서 참고해서 해.

,

,

,

,

'Java, Spring > 18일' 카테고리의 다른 글

18일차 1 - Spring JDBC, Connection Pool  (0) 2012.09.20
18일차 2 - iBatis  (0) 2012.09.20
18일차 3  (0) 2012.09.20
18일차 5  (0) 2012.09.20