Paging Select
UI에서 대량의 데이터를 적당한 건수만큼 만 조회하는 거래에서 사용한다. 이는 온라인 서비스의 소요 시간과 메모리 사용량을 줄여 서버의 안정성을 보장하기 위함이다.
1. Top-N 방식
1.1. 형식
-
Input
-
입력 IO 를 추가한다. 이 때 페이징 변수도 추가되어야 하기 때문에 입력 IO엔 반드시 Alias Name을 입력해서 추가한다.
-
입력 IO 외에 페이징 변수를 추가한다. (DBIO 에디터에서 [페이징] 버튼을 클릭하면 자동 추가된다.)
-
Integer pageNum : 조회할 페이지 번호
-
Integer pageCount : 한 페이지에 표시할 건수
-
-
Output
-
Paging도 다건 조회이기 때문에 [is Array]를 체크한다.
-
-
SQL
-
SQL을 입력하고 [페이징] 버튼 → [Top-N 방식]을 클릭하면 페이징을 위한 쿼리가 추가된다. 입력 IO의 변수를 SQL에서 사용할 때 반드시 'AliasName.변수명' 형식으로 사용한다. 아래 화면의 SQL에서 #{input.feduEmpNm}를 참고한다.
-
1.2. 개발 및 유의사항
조회 결과에 대한 처리는 목록 조회와 동일하다. DasUtils.existNextResult() 유틸로 다음 Page의 존재 여부를 알 수 있다.
List<DSmpEmpTst000Dto> list = dSmpEmpTst001.selectList01(input);
output.setHasNext(DasUtils.existNextResult(list) ? "Y" : "N"); // 다음 데이터 존재 여부
1.3. DBIO 샘플
아래는 샘플에 사용한 SQL 문이다.
SELECT * FROM
( SELECT ROWNUM AS ROW__NUM, A.* FROM
(
/* #### Original SQL [[ ################# */
SELECT
A.FEDU_EMP_NO AS feduEmpNo
, A.FEDU_EMP_NM AS feduEmpNm
, A.FEDU_OCCP_NM AS feduOccpNm
, A.FEDU_MNGR_EMP_NO AS feduMngrEmpNo
, A.FEDU_HIRE_DT AS feduHireDt
, A.FEDU_PAY_AMT AS feduPayAmt
, A.FEDU_DEPT_NO AS feduDeptNo
FROM SMP_EMP_TST A
WHERE A.FEDU_EMP_NM LIKE #{input.feduEmpNm, jdbcType=VARCHAR} || '%'
ORDER BY A.FEDU_EMP_NO ASC
/* #### Original SQL ]] ################# */
) A
WHERE ROWNUM <= ((#{pageNum}*#{pageCount})+1)
)
WHERE ROW__NUM > (#{pageNum}-1)*#{pageCount}
1.4. Bean 샘플
@BxmCategory(logicalName = "Select Paging")
public SSMP1003A002OutDto getEmpInfPagzingTopNWithPage(SSMP1003A002InDto input , SSMP1003A002OutDto output) throws DefaultApplicationException {
logger.debug("============== START ==============");
logger.debug("input = {}", input);
dSmpEmpTst001 = DefaultApplicationContext.getBean(dSmpEmpTst001, DSmpEmpTst001.class);
List<DSmpEmpTst001selectPage01OutDto> dbioOut = null;
int pageNum = input.getPageNum();
int pageCount = input.getPageCount();
DSmpEmpTst001selectPage01InDto dbioInput = new DSmpEmpTst001selectPage01InDto();
{
dbioInput.setFeduEmpNm(input.getFeduEmpNm());
}
int totalCount = dSmpEmpTst001.selectCount01(dbioInput).intValue();
dbioOut = dSmpEmpTst001.selectPage01(dbioInput, pageNum, pageCount);
SSMP1003A002OutDtoSubGrid01 outDtoSub01 = null;
for (DSmpEmpTst001selectPage01OutDto fetchDto : dbioOut) {
outDtoSub01 = new SSMP1003A002OutDtoSubGrid01();
// Generated by code generator [[
outDtoSub01.setFeduEmpNo(fetchDto.getFeduEmpNo());
outDtoSub01.setFeduEmpNm(fetchDto.getFeduEmpNm());
outDtoSub01.setFeduOccpNm(fetchDto.getFeduOccpNm());
outDtoSub01.setFeduMngrEmpNo(fetchDto.getFeduMngrEmpNo());
outDtoSub01.setFeduHireDt(fetchDto.getFeduHireDt());
outDtoSub01.setFeduPayAmt(fetchDto.getFeduPayAmt());
outDtoSub01.setFeduDeptNo(fetchDto.getFeduDeptNo());
// Generated by code generator ]]
output.getGrid01().add(outDtoSub01);
}
{
output.setPageNum(input.getPageNum());
output.setPageCount(input.getPageCount());
output.setTotalCount(totalCount);
}
logger.debug("output = {}", output);
logger.debug("============== END ==============");
return output;
}
2. Next Key 방식
2.1. 형식
-
Input
-
입력 IO 를 추가한다. 이 때 페이징 변수도 추가되어야 하기 때문에 입력 IO엔 반드시 Alias Name을 입력해서 추가한다.
-
입력 IO 외에 페이징 변수를 추가한다. (DBIO 에디터에서 [Page] 버튼을 클릭하면 자동 추가된다.)
-
출력 IO 타입 next : 페이지 쿼리의 key를 담고 있는 IO
-
int pageCount : 한 페이지에 표시할 건수
-
-
Output
-
Paging도 다건 조회이기 때문에 [is Array]를 체크한다.
-
-
SQL
-
SQL을 입력하고 [Page] 버튼 → [Next Key 방식]을 클릭하면 페이징을 위한 쿼리가 추가된다. 입력 IO의 변수를 SQL에서 사용할 때 반드시 'AliasName.변수명' 형식으로 사용한다. 아래 화면의 SQL에서 #{input.feduEmpNm}를 참고한다.
-
order key : 목록을 정렬할 key (field). 다건 Select SQL에 ORDER BY절이 입력돼 있으면 자동으로 컬럼을 불러온다. 직접 입력도 가능하다.
-
2.2. 개발 및 유의사항
조회 결과에 대한 처리는 목록 조회와 동일하다. DasUtils.existNextResult() 유틸로 다음 Page의 존재 여부를 알 수 있다.
List<DSmpEmpTst000Dto> list = dSmpEmpTst001.selectList02(input);
output.setHasNext(DasUtils.existNextResult(list) ? "Y" : "N"); // 다음 데이터 존재 여부
2.3. DBIO 샘플
입력/출력 IO는 단건 조회 서비스 작성에 썼던 DSmpEmpTst000Dto IO를 재사용했다. 아래는 샘플에 사용한 SQL 문이다.
SELECT * FROM
( SELECT * FROM
(
/* #### Original SQL [[ ################# */
SELECT
FEDU_EMP_NO AS feduEmpNo
, FEDU_EMP_NM AS feduEmpNm
, FEDU_OCCP_NM AS feduOccpNm
, FEDU_MNGR_EMP_NO AS feduMngrEmpNo
, FEDU_IPSA_DT AS feduIpsaDt
, FEDU_PAY_AMT AS feduPayAmt
, FEDU_DEPT_NO AS feduDeptNo
FROM SMP_EMP_TST
WHERE FEDU_EMP_NM LIKE #{input.feduEmpNm} || '%'
ORDER BY FEDU_EMP_NO ASC
/* #### Original SQL ]] ################# */
)
WHERE ( ( #{next.feduEmpNo} IS NULL OR a.fedu_emp_no > #{next.feduEmpNo} ) )
)
WHERE ROWNUM <= (#{pageCount} + 1)
2.4. Bean 샘플
@BxmCategory(logicalName = "Select Paging")
public SSMP1003A003OutDto getEmpInfPagzingNextKey(SSMP1003A003InDto input , SSMP1003A003OutDto output) throws DefaultApplicationException {
logger.debug("============== START ==============");
logger.debug("input = {}", input);
dSmpEmpTst001 = DefaultApplicationContext.getBean(dSmpEmpTst001, DSmpEmpTst001.class);
List<DSmpEmpTst000Dto> beanOutput = null;
DSmpEmpTst000Dto dbioInput = new DSmpEmpTst000Dto();
DSmpEmpTst000Dto nextInput = new DSmpEmpTst000Dto();
SSMP1003A003OutDtoSubGrid01 outDtoSub01 = null;
int pageCount;
/**
* @BXMType LogicalArea
* @Desc DTO mapping
*/
{
pageCount = input.getReqCount();
dbioInput.setFeduEmpNm(input.getFeduEmpNm());
nextInput.setFeduEmpNo(input.getNextFeduEmpNo());
nextInput.setFeduEmpNm(input.getNextFeduEmpNm());
}
/**
* @BXMType DbioCall
* @Desc Select multi employee info on page sql(Next-Key)
*/
beanOutput = dSmpEmpTst001.selectPage02(dbioInput, nextInput, pageCount);
/**
* @BXMType LogicalArea
* @Desc output data mapping
*/
{
output.setReqCount(input.getReqCount());
output.setGrid01_COUNT(beanOutput.size());
output.setHasNext(DasUtils.existNextResult(beanOutput) ? "Y" : "N");
}
/**
* @BXMType Loop
* @Desc output data mapping
*/
for (DSmpEmpTst000Dto fetchDto : beanOutput) {
outDtoSub01 = new SSMP1003A003OutDtoSubGrid01();
// Generated by code generator [[
outDtoSub01.setFeduEmpNo(fetchDto.getFeduEmpNo());
outDtoSub01.setFeduEmpNm(fetchDto.getFeduEmpNm());
outDtoSub01.setFeduOccpNm(fetchDto.getFeduOccpNm());
outDtoSub01.setFeduMngrEmpNo(fetchDto.getFeduMngrEmpNo());
outDtoSub01.setFeduHireDt(fetchDto.getFeduHireDt());
outDtoSub01.setFeduPayAmt(fetchDto.getFeduPayAmt());
outDtoSub01.setFeduDeptNo(fetchDto.getFeduDeptNo());
// Generated by code generator ]]
output.getGrid01().add(outDtoSub01);
}
logger.debug("output = {}", output);
logger.debug("============== END ==============");
return output;
}