티스토리 뷰




보통 Spring + Mybatis 프레임웍에서 resultMap은 1개의 Object에 맵핑된다.

이런건 프로시저나 SELECT쿼리에서 1개의 결과셋을 받아 처리한다는 의미가 된다.

mapper가 아래와 비슷하게 코딩되어있을것이다.

<select id="test" resultMap="resultmap">

EXECUTE [dbo].[TEST]

</select>

하지만, 프로시저나 또는 SELECT쿼리에서 두개이상의 Multiple Recordsets 을 보내준다면 어떨까?

결과적으로 1번의 요청, 1번의 네트웍을 통해서, 여러개의 결과를 받을 수있다면, 엄청난 이득일것이다.

네트웍이라는게 CPU연산,메모리엑세스,보조메모리엑세스에 비해 상당히 소모적인 동작이기때문이다.


예로, DDR3 1600MHz 짜리 RAM은 1초에 16억번데이터 전송이 가능하고, 한번에 64Bit까지 전달가능한데.

이는 액세스 한번에 약1나노초(0.000000000625초) 소요 . 이것을 전송용량으로 계산하면 

8Byte x 1,600,000,000 = 12,800,000,000 = 12800MB/s x 2(양방향) = 25.6GB/s

1초에 25기가바이트가 된다.

흔히쓰는 100M광랜같은경우 (요즘 기가랜도있지만..) 전송용량으로 계산하면

100Mbps = 12.5MB/s = 0.01GB/s

1초에 0.01기가 이지만...

여기에 OSI7Layer에 따라서 데이터흐름제어나 순서제어(TCP)를 하고,

원격지에 데이터를 전송하기때문에이론상 속도보다 더욱이 느려진다.


여튼.....

네트웍은 호출횟수, 전송데이터가 적을수록 좋다.

전송데이터를 줄이기어렵다면, 호출횟수만이라도 반드시 줄이는게 좋고. 이로인해 눈에띄는 성능향상을 꾀할 수있다.


기본 Spring+Mybatis Framework의 구조에서 아래코드처럼 수정하자.

물론.... 모두 다하면 구찮으니 네트웍호출이 많은부분을 추려서하자.


*Recordset : DB쿼리의 결과로 SELECT되는 결과셋.

*Multiple Recordsets : DB쿼리의 결과로 2개이상의 Recordset(결과셋)을 반환하는것.



-------------------------------------------------------------------------------------------

**Controller

//앞리스트 : recordsets list, 중간리스트 : 결과배열, Object : 결과Object

List<List<Object>> datas = myService.test();  //Object가 아닌 Map으로도 가능.


List<MyCustomClassA> dataset1 =  getDataset( datas , 0 ); // SelectList 1

List<MyCustomClassB> dataset2 =  getDataset( datas , 1 ); // SelectList 2

String dataset3 = getDataset( datas , 2 ).get(0);// SelectOne 1

Integer dataset4 = getDataset( datas , 3 ).get(0);// SelectOne 2


//캐스팅 method

private <T> List<T> getDataset(List<List<Object>> datasets, int index){

return (List<T>) datasets.get(datasetIndex);

}


**Service interface

List<List<Object>> test();


**Service

public List<List<Object>> test() {

return myMapper().test();

}


**Mapper java

List<List<Object>> test();


**Mapper xml

<resultMap id="myId1" type="MyCustomClassA"></resultMap>

<resultMap id="myId2" type="MyCustomClassB"></resultMap>

<resultMap id="myId3" type="String"></resultMap>

<resultMap id="myId4" type="Integer"></resultMap>


<!-- 여러개 resultMap을 콤마(,)로 구분하여 붙여쓴다. 쿼리결과와 resultMap의 순서가 같아야한다.-->

<select id="test" resultMap="myId1,myId2,myId3,myId4"> 

EXECUTE [dbo].[TEST]

</select>


**DB Procedure (mssql기준)

CREATE PROCEDURE [dbo].[TEST]

AS

BEGIN


    SELECT * FROM TB_CUSTUM_A

    SELECT * FROM TB_CUSTUM_B

    SELECT 'mydata' AS [MYDATA]

    SELECT 12345 AS [MYNUMBER]

END

-------------------------------------------------------------------------------------------


[작성자] devbible.tistory.com

댓글
  • 프로필사진 RubyD 글 잘보았습니다 질문이 있는데요.
    혹시 plsql에서

    다중 테이블을 temp테이블을 사용해서 조회하는 경우에는 다중으로 받아올수가 없나요?

    쿼리툴에서 돌려봤을때는 각 3개의 테이블이 반환되는데

    log를 보면 첫번째 테이블의 쿼리만 나오네요ㅜㅜ..

    테스트성으로 올려주신 샘플처럼
    단순 select 의 합으로는 각 3개의 리턴이 잘되구요.. 혹시 아시면 조언좀 부탁드립니다.
    2017.08.07 13:41
  • 프로필사진 jin 아 이거 두시간이나 찾아 헤메였다가 겨우 해결했네요 감사합니다 ㅎㅎ 2018.04.18 17:29
댓글쓰기 폼