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;
} 
