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}를 참고한다.
개발 및 유의사항
조회 결과에 대한 처리는 목록 조회와 동일하다.
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절이 입력돼 있으면 자동으로 컬럼을 불러온다. 직접 입력도 가능하다.
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");
}