iBatis Cache 모델

Java/iBatis 2012. 4. 18. 11:35 Posted by 퓨어레드

iBatis Cache 모델

-       개발팀 남한희 대리

1.     캐쉬를 왜 사용 하는가

A.     캐쉬를 사용함으로써 중복 쿼리의 속도를 향상시킴

B.      캐쉬를 사용하여 Database 부하를 줄임

 

2.     iBatis 에 캐쉬모델

A.     iBatis 에서의 캐쉬모델은 데이터베이스를 이용하지 않고 읽어들인 쿼리 결과를 메모리에 저장하고 같은 요청이 왔을 때 리턴하는 방식이므로 데이터베이스와 상관없이 동작한다.

B.      그렇다면 캐쉬 모델을 비우는 시점은 어떻게 결정될까?
iBatis
에서는 캐쉬 모델을 비우는 방법을 두가지 설정 할 수 있다.

                         i.         특정 statement 가 실행 될 때..

                        ii.         특정 시간이 초과 되면

                       iii.         특정 사이즈를 초과 하면 (메모리 모델에 따라 결정)

 

3.     캐시 모델 타입의 종류

A.     MEMORY : Heap 메모리에 저장하는 구조

                         i.         캐쉬 데이터가 GC 에게 삭제되는 형태를 결정 할 수 있다.

1.      WEAK : GC 가 메모리 반환이 필요하면 바로 캐쉬 데이터는 삭제된다.

2.      SOFT : GC 에서 메모리가 없어서 반환 요청을 할 때 캐쉬 데이터를 삭제한다.

3.      STRONG : Statement 와 캐쉬 비우는 시간이 되지 않는 이상 GC 에 반환하지 않는다.

B.      LRU : 사용하지 않는 오래된 캐쉬부터 삭제 하는 구조

                         i.         Size 라는 값을 설정하여 최대 캐쉬 데이터수를 지정한다.

C.      FIFO : 가장 먼저 만들어진 캐쉬부터 삭제 하는 구조

                         i.         Size 라는 값을 설정하여 최대 캐쉬 데이터수를 지정한다.

D.     OSCACHE : Open Symphoy 라는 캐쉬 프레임워크를 사용 하여 캐시를 관리한다.

 

4.     캐시 데이터 처리 방법의 종류

A.     readOnly : 읽기 전용이면 공유 메모리를 리턴한다.

                         i.         False : 읽기 전용이 아니기 때문에 데이터 사용은 복사를 하여야 한다.

B.      serialize : 객체 복사 여부 결정

                         i.         True : 객체를 복사하여 리턴한다.

                        ii.         False : 객체를 복사하지 않고 캐시된 객체 자체를 리턴한다.

C.      readOnly serialize 를 적절히 조합해야 한다.

                         i.         readOnly : true, serialize : false -> 읽기 전용에 객체 자체를 리턴하기 때문에 가장 빠름

                        ii.         readOnly : false, serialize : true ->
객체가 복사되어 리턴하고 리턴된 객체는 쓰기를 할 수 있다.

                       iii.         readOnly : true, serialize : true ->
의미가 없다.

                       iv.         readOnly : false, serialize : false ->
공유된 객체이므로 상당히 위험하다


 

 

 

5.     문법

A.     캐쉬 모델 선언

                         i.         <cacheModel id = “캐시아이디” type=”캐시모델타입” readOnly=”true” serialize=”false”>

</cacheModel>

-
기본 적인 캐시모델 선언이다
.

B.      캐시 적용

                         i.         <select id = “selectCategorys” parameterClass=”int” resultClass=”CategoryVo”
cacheModel=”
캐시아이디
”>
</select>

-
캐쉬가 적용되어 같은 요청이 오면 캐쉬에서 데이터가 나간다
.

C.      Flush 적용

                         i.         <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
</cacheModel>

- insert, update, delete
등이 호출되면 캐쉬가 초기화 된다.

                        ii.         <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushInterval hours=”12” />
</cacheModel>

- 12
시간 마다 캐시를 삭제한다. (hours, minutes, seconds, milliseconds 사용 가능
)


D.     모델 타입 적용

                         i.         MEMORY

1.      메모리는 property 값을 reference-type 을 받는다.

2.      <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
< property name = “reference-type” value = “WEAK” />
</cacheModel>


 

 

                        ii.         LRU

1.      LRU 는 프로퍼티로 size 를 받는다.

2.      <cacheModel id = “categoryCache” type=”LRU” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
< property name = “size” value = “200” />
</cacheModel>

3.      캐시 데이터가 200개가 차면 데이터 삭제가 일어난다. 그렇기에 size 값 설정은 신중하게 하여야 한다.

                       iii.         FIFO

1.      FIFO LRU 와 마찬가지로 size 를 받는다.

2.      <cacheModel id = “categoryCache” type=”FIFO” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
<property name = “size” value = “200” />
</cacheModel>

3.      캐시 데이터가 200개가 차면 데이터 삭제가 일어난다. 그렇기에 size 값 설정은 신중하게 하여야 한다.

 

6.     캐시 전략 수립하기

A.     여러 종류의 캐시 레벨이 존재하기 때문에 데이터의 형태에 따라 적절한 캐시 모델을 사용한다.


7.     캐시 모델 직접 제작하기

A.     Com.ibatis.sqlmap.engine.cache.CacheController 인터페이스를 구현하면 자신만의 캐시 엔진을 만들수 있다.

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis RowHandler  (0) 2012.04.18
iBatis ResultMap 상속  (0) 2012.04.18

iBatis RowHandler

Java/iBatis 2012. 4. 18. 11:34 Posted by 퓨어레드

iBatis RowHandler

-       개발팀 남한희 대리

1.     iBatis RowHandler ..

A.     용량 또는 레코드 수가 많은 레코드셋을 처리할수 있는 방법

B.      레코드를 한번에 다 가져오지 않고 레코드 하나하나씩을 핸들러에서 처리하는 방식

C.      iBatis 특성상 Recordset 을 모두 List 에 저장해야 되는 단점을 극복할수 있는 방법

D.     List 에 전부 저장하지 않고 바로바로 처리 하여 메모리를 절약할수 있고 실행 속도 또한 절약 할 수 있다.

 

 

2.     핸들러 만들기

A.     핸들러 클래스는 com.ibatis.sqlmap.client.event.RowHandler 를 구현해야 한다.

B.      RowHandler 인터페이스의 void handleRow (Object valueObject) 를 구현한다.

C.      handleRow 에 넘어오는 valueObject ResultMap 에 해당하는 Class 가 리턴한다.
해당 클래스로 캐스팅하여 데이터를 처리한다.

D.     핸들러 클래스는 생성을 하여 iBatis 에 넘기는 구조이기 때문에 다른 여러 부가적인 처리가 가능하다.


 

3.     핸들러 호출

A.     핸들러 클래스를 생성한 다음 sqlMapClient 함수중 queryWithRowHandler 를 호출한다.

B.      queryWithRowHandler ([Select ID], [Parameter Data], [RowHandler Interface]);

C.      로우 핸들러는 당연히 Select ID 에만 매칭이 된다.

D.     queryWithRowHandler ("res.getsResource", sData, rowHandler);

 

 

4.     스프링에서의 호출

A.     스프링의 getSqlMapClientTemplete () 에는 해당 함수가 없다.

B.      그러기에 getSqlMapClient () 를 호출하여 직접 sqlMapClient 에 접근하여 호출한다.

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis Cache 모델  (0) 2012.04.18
iBatis ResultMap 상속  (0) 2012.04.18

iBatis ResultMap 상속

Java/iBatis 2012. 4. 18. 11:34 Posted by 퓨어레드

iBatis ResultMap 상속

-       개발팀 남한희 대리

1.     상속과 구성의 차이점을 명확하게 알자!!

A.     상속은 상위를 포함한 하위 확장 개념

B.      구성은 상위를 내포한 포함 개념 (말이 이상하다 따로 설명해야 할 듯..)


2.     ResultMap 상속의 개념

A.     ResultMap 을 상속하는 개념은 비슷한 기존 ResultMap 에서 확장된 ResultMap 이 있을 경우,  코드량을 줄이고 기존 ResultMap 에서 확장된 ResultMap 을 사용 할 경우 사용함


3.     예시

A.     코멘트, 첨부파일, 도메인 모델 등에서 사용

                         i.         코멘트 : 코멘트의 경우 보통 일련번호, 작성자, 내용 등 많은 내용이 비슷하고 이에 FK만 달라지는 경우가 많다. 이럴 경우 공통 ResultMap 에 들어가는 필드는 테이블에 맞춰주고 달라지는 부분만 상속으로 처리한다. (첨부파일도 마찬가지)

                        ii.         도메인 모델 : 기본 ResultMap 을 만들고 추가되는 Domain 모델이 있다면 이 항목을 기본 ResultMap 을 상속받고 추가되는 Domain 모델을 확장하여 ResultMap 을 구성한다.
도메인 모델에선 상속된 ResultMap 으로 데이터를 주입받아 속도 개선에 도움을 준다
.


4.     문법

A.     상속 받는 ResultMap extends=”상위ResultMapID”

B.      기본 ResultMap
<resultMap class="ResellerVo" id="ResellerRm">
<
result property="resellerID" column="resellerID" jdbcType="VARCHAR" />
</resultMap>

C.      ResultMap 상속
<resultMap class="ResellerDm" id="ResellerDmRm" extends="ResellerRm">
<
result property="companys" column="{resellerID=resellerID}" select="company.getsGwCompany" />
</resultMap>

D.     기타

                         i.         하위 ResultMap  에 들어가는 Vo Class 가 상위 ResultMap 에 들어가는 Vo Class 와 꼭 상속 관계일 필요는 없다. (ResultMap 에서만 상속관계이지 실제 클래스가 상속관계일 필요는 없다는 것)


 

 

iBatis 하위 ResultMap 결정

 

5.     선택 가능한 하위 ResultMap

A.     특정 조건으로 하위 ResultMap 을 결정 할수도 있다.

B.      조건은 상위 ResultMap 에서 결정한다.

C.      특정 컬럼의 값으로 하위 ResultMap 을 결정한다.

6.     문법

A.     <resultMap class="ResellerVo" id="ResellerRm">
<result property="resellerID" column="resellerID" jdbcType="VARCHAR" />         
<result property="resellerName" column="resellerName" jdbcType="VARCHAR" />
<result property="regDate" column="regDate" jdbcType="VARCHAR" />

<discriminator column="TYPE" javaType="string">
<subMap value="Book" resultMap="ResellerRm2" />
<subMap value="News" resultMap="ResellerRm3" />
</discriminator>


</resultMap>

B.      Select 가 된 컬럼중 TYPE 이라는 컬럼의 값이 Book 이면 ResellerRm2 을 선택하고
News
라면 ResellerRm3 를 선택함


C.      하위 Resultmap 을 결정 구분을 사용 할 경우 구분 할 수 있는 컬럼이 있어야 한다.

D.     만약 구분 할 수 있는 컬럼이 없다면 alias 를 이용한다.

                         i.         Select field1, field2, field3, ‘Book’ as TYPE FROM TestTable

 

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis Cache 모델  (0) 2012.04.18
iBatis RowHandler  (0) 2012.04.18

Spring Event

Spring/Base 2012. 4. 18. 11:32 Posted by 퓨어레드

Spring Event

-       개발팀 남한희

1.     이벤트 란 무엇일까!!?

A.     이벤트란 사건! 한 객체를 기준으로 데이터가 변경되거나 상황이 변경 되었을 때 사건을 발생시켜 다른 클래스에서 이를 알도록 해주는 방식이다.

B.      윈도우는 이벤트 방식의 프로그래밍을 한다. 버튼이 클릭되었다, 화면이 지워졌다, 마우스가 움직인다 등의 이벤트가 정의 되어 있고, 이 이벤트를 잡아서 프로그래밍을 진행한다.


2.     이벤트의 구현

A.     이벤트 구현은 언어 단에서 지원을 해주는 부분이 있고, 자체적으로 구현을 해야 하는 경우가 있다.

B.      언어 레벨에서 지원을 해주는 언어는 C#! 델리게이터 라는 구분이 있어서 이벤트를 추가하거나 삭제 할수 있다.

C.      자바는 언어 레벨에서의 이벤트를 지원하지 않는다. 그렇기 때문에 이벤트 중심의 프로그래밍을 할 경우 이벤트 처리 엔진이 있어야 한다. 보통의 이벤트 처리 엔진은 디자인 패턴중 옵져버 패턴으로 구성된다. (옵저버 패턴은 따로 알아보기 바람)


3.     Spring Level Event

A.     Spring 에서는 ApplicationContext 에서 이벤트를 사용 할 수 있도록 지원해준다.

B.      Event 를 사용하기 위해선 3가지 구성 요소가 필요하다.

                         i.         이벤트 발생 Bean (옵저버 패턴중 Subject)

                        ii.         이벤트

                       iii.         이벤트 처리 Bean

 

 

 

4.     Spring Level Event 사용 절차

A.     Bean 이 이벤트를 발생시킬지 유무를 결정한다.

B.      발생시킴을 결정하면 발생시킬 이벤트 객체를 만든다.

                         i.         이 객체는 ApplicationEvent 를 상속 받는다. (org.springframework..context.ApplicationEvent)

                        ii.         만약 Event 처리에 추가 데이터가 있다면 추가 데이터를 만들어준다.

public class G2ApplicationEvent extends ApplicationEvent
{
	protected G2EventType eventType;
	protected Object eventData;

	// .. getter/setter 구현, 생성자 구현
}



C.      이벤트 발생 Bean 에서 이벤트 발생 타이밍에서 이벤트를 발생시킨다.

                         i.         이벤트 발생 Bean 에선 먼저 ApplicationContext 를 주입받는다.
@Autowired ApplicationContext applicationContext;
(
주의 : WebApplicationContext 를 주입받아도 되지만 JUnit 테스트에 문제가 있음)

                        ii.         이벤트 발생은 ApplicationContext publishEvent 를 이용한다.
applicationContext.publishEvent (new MyEvent (this, data);

D.     이벤트 처리 Bean 에서 처리할 이벤트를 구현함

                         i.         ApplicationListener implements 한다.

                        ii.         ApplicationListener 은 제너릭 타입이기 때문에 수신 할 이벤트를 적어준다.
implements ApplicationListener<MyEvent>

                       iii.         ApplicationListerner onApplicationEvent(<T> arg0) 을 구현한다.

@Override
public void onApplicationEvent (MyEvent myEvent)
{
// 해당 이벤트 처리를 해준다.
}

                       iv.         만약 여러 이벤트를 처리 할 경우 해당 이벤트로 ApplicationListener 을 추가 구현한다.

                        v.         추가 구현시 당연히 onApplicationEvent 역시 추가되어야 한다.

                       vi.         이벤트를 구분하는 데이터는 onApplicationEvent 의 아규먼트 클래스 타입으로 구분한다. 또한 같은 인터페이스를 제너릭으로 달리 여러 번 구현하기 때문에 주석을 잘 달아주어 해당 이벤트 핸들러가 하는 일을 정확히 명시하도록 한다.!

 

'Spring > Base' 카테고리의 다른 글

Task, Scheduler 등록  (0) 2012.04.18

Java Generic

Java/기본 2012. 4. 18. 11:31 Posted by 퓨어레드

Java Generic

-       개발팀 남한희 대리

1.     Generic 이란?

A.     Java 5.0 부터 지원한 Generic 이란 데이터 형을 템플릿화 하여 좀 더 세련된 코딩을 할 수 있게 해주는 개발 편의 문법

B.      데이터 형을 Templete 한다는 데 가장 큰 의미가 있다.

2.     데이터 형이 결정되지 않는 개발..

A.     보통의 자료 구조에선 여러 데이터형을 처리할수 있어야 하기 때문에 데이터 형을 결정하지 못하는 경우가 많다.

B.      그렇기 때문에 데이터형을 결정하지 못한다면 최상위 객체인 Object 형을 사용하여 하위 캐스팅을 하여 사용 했다.

C.      Object 형을 사용 하였을 경우 가장 큰 문제점은 하위 캐스팅에 대한 부담감이다.

D.     하위 캐스팅을 잘못하였을 경우 Exception 이 발생되기 때문이다.

E.      그렇기 때문에 여러 데이터형을 지원하는 자료구조들도 5.0 이후에는 제너릭을 지원하게 되었다.

3.     문법

A.     클래스를 정의하는 부분에 제너릭 타입을 정의한다.
class MyData<T>

 

B.      T 라는 제너릭이 생성 되었다.

                         i.         사용 할때는 T 로 사용한다.

class MyData<T>
{
    T getData ()
    {
    }

    void setData (T abc)
    {
    }
}



C.      클래스 생성

- 제너릭을 정확히 명시해준다.

MyData<String> myData = new MyData<String> ();

// JDK1.8 부터는 생성객체에는 열거 안해도 된다.
MyData<String> myData = new MyData<> ();

 

 

4.     Generic 이 무조건 답은 아니다.

A.     항상 꼭 Generic 을 사용 하는게 정답은 아니다. 데이터 형이 애매한 경우는 Object 를 사용하고 한번에 한 데이터 형을 결정 해야 하는 경우는 Generic 을 사용하면 매우 깔끔한 코딩을 할 수 있다.

 

B.      Object, Generic 은 개발자의 선택의 문제이므로 개발자가 판단하여 결정하도록 한다.

 

'Java > 기본' 카테고리의 다른 글

Java.. 레이블된 break, continue  (0) 2012.04.18
현재 사용하는 OS 이름 가져오기  (0) 2012.04.18
ByteStream  (0) 2012.04.18
Method 동적 호출  (0) 2012.04.18
자바 타이머 기능  (0) 2012.04.18

JSTL (JSP Standard Tag Library) 1차 정리

Java/JSP 2012. 4. 18. 11:28 Posted by 퓨어레드

JSTL (JSP Standard Tag Library)

-       개발팀 남한희 대리

 

1.     JSTL 이란..

A.     EL 로 표현 불가능한 로직 적인 처리에 필요한 표준 라이브러리

2.     JSTL 선언

A.     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3.     <c:out> 태그

A.     문자열을 출력해주는 태그, 여러 부가 기능들이 있다.

B.      value : 출력할 값
escapeXml : (true, false) HTML
태그를 변환 시킨다.
default :
기본 출력 값
.

C.      <c:out value='${data1}' escapeXml = 'true' default = 'baseStr' />

D.     Default 는 다음과 같이 출력 가능
<c:out value='${data1}'>baseStr</c:out>

4.     <c:forEach> 태그

A.     컬랙션 데이터를 루핑한다.

B.      items : 컬랙션을 돌릴 데이터
var :
루프된 값을 담을 변수명
varStatus :
루핑 횟수 알기.
begin :
루프의 시작 Index (선택적
)
end :
루프의 종료 Index (선택적
)
step :
루프 증가 수
..

C.      forEach 는 중첩해서 사용 가능한다.

D.     <c:forEach var = "data" items="${datas}" varStatus="loopCount">
${loopCount.count} : ${data} <Br />
</c:forEach>

5.     <c:if> 태그

A.     조건을 처리한다.

B.      test : 조건식 (true, false 로 리턴해야 한다.)

C.      EX

                         i.         <c:if test="${data eq 'member'}">
</c:if>

6.     <c:choose> 태그

A.     조건을 분기하여 처리한다.

B.      <c:when> : 하나하나의 조건 - 사용법은 <c:if> 와 똑같다 (else if 의 의미)

C.      <c:otherwise> : 위의 when 에서 조건이 걸리지 않았을 경우 (else 의 의미)

D.     Ex)
<c:choose>
<c:when test="${data eq 'test'}">
</c:when>
<c:when test="${data eq 'test2'}">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>

7.     <c:import> 태그

A.     외부 컨텐츠의 내용을 불러와서 박는다.

B.      url : 파일명 또는 외부 URL
외부 URL 에 있는 Content 를 불러올때 유용..

C.      <c:import url="Header.jsp">
<c:param name="title" value="Test Title" />
</c:import>

8.     <c:url> 태그

A.     <c:url value="URL " />

B.      URL 인코딩을 하려면
<c:url value="/inputComments.jsp" var="inputURL">
<c:param name = "firstName" value="${first}" />
<c:param name = "lastName" value="${last}" />
</c:url>

C.      사용시 : ${inputURL}

9.     <c:catch> 태그

A.     Exception 을 잡을 수 있다.

B.      <c:catch var="myException">
명령어

</c:catch>

<c:if test="${myException != null}">
.. Exception
발생 코드..
</c:if>

 

'Java > JSP' 카테고리의 다른 글

fmt:formatDate 쓰기  (0) 2012.11.02
JSTL 에서 List Size 구하기..  (0) 2012.05.03
EL 중 list 데이터 존재 여부 확인  (0) 2012.05.02
No-Cache 설정  (0) 2012.05.02
EL  (0) 2012.04.18

출처 : http://golee07.tistory.com/339

 

Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{
 textbox.Text = "크로스 쓰레드 해결!";
}));

'C# > WPF' 카테고리의 다른 글

XAML 하위 속성 풀어서 지정하기  (0) 2012.06.13
WPF에서 실행파일이 있는 경로  (0) 2012.04.19
Content 에 URI 로 이미지 넣기  (0) 2012.04.18
WPF 다국어 지원  (0) 2012.04.17

Socket Server 연결 Sample

C#/Network 2012. 4. 18. 10:18 Posted by 퓨어레드

서버 바인딩 후 Accept 샘플

 

IPEndPoint serverBindInf = new IPEndPoint (IPAddress.Any, 9999);

Socket serverSocket = new Socket (AddressFamily.InterNetwork, 
	SocketType.Stream, ProtocolType.Tcp);
  
// ServerSocket Bind..
serverSocket.Bind (serverBindInf);

// Listen..
serverSocket.Listen (10);
 
// Client Accept!
Socket clientSocket = serverSocket.Accept ();
 
// Socket 종료
clientSocket.Close ();
 
serverSocket.Close ();

 

Socket Client 연결 Sample

C#/Network 2012. 4. 18. 10:15 Posted by 퓨어레드

Socket 을 써서 연결하는 샘플

 

IPEndPoint serverEndPoint = new IPEndPoint (IPAddress.Parse ("127.0.0.1"), 9999);

// Client 용 소켓 생성
Socket serverSocket = new Socket (AddressFamily.InterNetwork, 
SocketType.Stream, ProtocolType.Tcp);

// 서버 연결!
try
{
    serverSocket.Connect (serverEndPoint);
}
catch (SocketException ex)
{
    Console.WriteLine ("Unable to connect to server.");
    Console.WriteLine (ex.ToString ());
 
    return;
}

serverSocket.Shutdown (SocketShutdown.Both);
serverSocket.Close ();

 

 

WPF 다국어 지원

C#/WPF 2012. 4. 17. 18:19 Posted by 퓨어레드