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}를 참고한다.

paging001
Figure 1. Top-N 형식

1.2. 개발 및 유의사항

조회 결과에 대한 처리는 목록 조회와 동일하다. DasUtils.existNextResult() 유틸로 다음 Page의 존재 여부를 알 수 있다.

List<DSmpEmpTst000Dto> list = dSmpEmpTst001.selectList01(input);

output.setHasNext(DasUtils.existNextResult(list) ? "Y" : "N"); // 다음 데이터 존재 여부
java

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

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

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절이 입력돼 있으면 자동으로 컬럼을 불러온다. 직접 입력도 가능하다.

paging002
Figure 2. Next Key 형식

2.2. 개발 및 유의사항

조회 결과에 대한 처리는 목록 조회와 동일하다. DasUtils.existNextResult() 유틸로 다음 Page의 존재 여부를 알 수 있다.

List<DSmpEmpTst000Dto> list = dSmpEmpTst001.selectList02(input);

output.setHasNext(DasUtils.existNextResult(list) ? "Y" : "N"); // 다음 데이터 존재 여부
java

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)
sql

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;
}
java
SWLab Bankware Global
  • 전체
  • BXM
  • BXCM
  • BXCP
  • BXI
제품 선택 시 더 정확한 매뉴얼 가이드를 제공해드립니다.

제품

Copyright© Bankwareglobal All Rights Reserved.