Paging Select

UI에서 대량의 데이터를 적당한 건수만큼 만 조회하는 거래에서 사용한다. 이는 온라인 서비스의 소요 시간과 메모리 사용량을 줄여 서버의 안정성을 보장하기 위함이다.

1. Top-N 방식

형식

  • Input

    입력 IO 를 추가한다. 이 때 페이징 변수도 추가되어야 하기 때문에 입력 IO엔 반드시 Alias Name을 입력해서 추가한다.

    입력 IO 외에 페이징 변수를 추가한다. (DBIO 에디터에서 [Page] 버튼을 클릭하면 자동 추가된다.)

    int pageCount : 한 페이지에 표시할 건수

    int pageNum : 조회할 페이지 번호

  • Output

    Paging도 다건 조회이기 때문에 [List]를 체크한다.

  • SQL

    SQL을 입력하고 [Page] 버튼 → [Top-N 방식]을 클릭하면 페이징을 위한 쿼리가 추가된다. 입력 IO의 변수를 SQL에서 사용할 때 반드시 'AliasName.변수명' 형식으로 사용한다. 아래 화면의 SQL에서 #{input.deptNo}를 참고한다.

chapter3/paging002
Figure 1. Top-N 형식

개발 및 유의사항

조회 결과에 대한 처리는 목록 조회와 동일하다.

DBIO 샘플

입력/출력 IO는 단건 조회 서비스 작성에 썼던 EmployeeIO를 재사용했다. 아래는 샘플에 사용한 SQL 문이다.

            SELECT page.*
            FROM (
                SELECT @rnum := @rnum + 1 as rownum, org.*
                from(
            /* #### Original SQL [[ ################# */
            SELECT EMP_NO        AS empNo /*  */
                   , EMP_NM      AS empNm /*  */
                   , OCPTN_NM    AS ocptnNm /*  */
                   , MNGR_EMP_NO AS mngrEmpNo /*  */
                   , HIRE_DT     AS hireDt /*  */
                   , PAY_AMT     AS payAmt /*  */
                   , DEPT_NO     AS deptNo /*  */
              FROM EMPLOYEE
            where DEPT_NO = #{input.deptNo}
            /* #### Original SQL ]] ################# */
            ) org, (SELECT @rnum:=0) r
            ) page
            WHERE rownum > (#{pageCount} - 1) * #{pageNum} and rownum   <=#{pageCount} * #{pageNum} + 1

컴포넌트 샘플

            // dbio호출시 pageNum, pageCount 를 전달
            List<EmployeeIO>  list = dbio.selectPageEmp(input, pageCount, pageNum)
            if( list.isEmpty() ) {
                // 조회된 데이터가 없는 경우 처리
            }

            for(EmployeeIO data : list) {
                // 조회된 데이터
            }

2. Next Key 방식

형식

  • Input

    입력 IO 를 추가한다. 이 때 페이징 변수도 추가되어야 하기 때문에 입력 IO엔 반드시 Alias Name을 입력해서 추가한다.

    입력 IO 외에 페이징 변수를 추가한다. (DBIO 에디터에서 [Page] 버튼을 클릭하면 자동 추가된다.)

    출력 IO 타입 next : 페이지 쿼리의 key를 담고 있는 IO

    int pageCount : 한 페이지에 표시할 건수

  • Output

    Paging도 다건 조회이기 때문에 [List]를 체크한다.

  • SQL

    SQL을 입력하고 [Page] 버튼 → [Next Key 방식]을 클릭하면 페이징을 위한 쿼리가 추가된다. 입력 IO의 변수를 SQL에서 사용할 때 반드시 'AliasName.변수명' 형식으로 사용한다. 아래 화면의 SQL에서 #{input.feduEmpNm}를 참고한다.

    order key : 목록을 정렬할 key (field). 다건 Select SQL에 ORDER BY절이 입력돼 있으면 자동으로 컬럼을 불러온다. 직접 입력도 가능하다.

chapter3/paging003
Figure 2. Next Key 형식

DBIO 샘플

아래는 샘플에 사용한 SQL 문이다.

            SELECT * FROM
                ( SELECT * 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_IPSA_DT AS feduIpsaDt
                 , A.FEDU_PAY_AMT AS feduPayAmt
                 , A.FEDU_DEPT_NO AS feduDeptNo
              FROM SMP_EMP_TST A
              WHERE A.FEDU_EMP_NM LIKE CONCAT( #{input.feduEmpNo, jdbcType=VARCHAR}, '%')
              ORDER BY A.FEDU_EMP_NO ASC
            /* #### Original SQL ]] ################# */

                    )
                WHERE ( ( #{next.feduEmpNo} IS NULL OR a.fedu_emp_no > #{next.feduEmpNo} ) )
                )
            WHERE ROWNUM <= (#{pageCount} + 1)

컴포넌트 샘플

            ...

            DSmpEmpTst000Dto nextInput = new DSmpEmpTst000Dto();

            /**
             * @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.setGrid01Count(beanOutput.size());
                output.setHasNext(DasUtils.existNextResult(beanOutput) ? "Y" : "N");
            }

            /**
             * @BXMType Loop
             * @Desc output data mapping
             */
            for (DSmpEmpTst000Dto fetchDto : beanOutput) {

                outDtoSub01 = new SmpEmployeeBasicControllerDto();

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

3. 다음데이터 존재 여부 확인

페이징 쿼리를 작성한 경우에는 다음 데이터 존재여부를 확인할 수 있는 API를 제공한다. API는 다음과 같다.

  • 다음데이터 존재 여부 확인 API

                DasUtils.existNextResult({List<dbio 출력 DTO>})
  • 사용 예

                dbioOutput = dSmpEmpTst001.selectPage02(dbioInput, nextInput, pageCount);
                if (DasUtils.existNextResult(dbioOutput)) {
                    output.setHasNext("Y");
                }
                else {
                    output.setHasNext("N");
                }
SWLab Bankware Global
  • 전체
  • BXM
  • BXCM
  • BXCP
  • BXI
제품 선택 시 더 정확한 매뉴얼 가이드를 제공해드립니다.

Copyright© Bankwareglobal All Rights Reserved.