반응형
// --------------------------------------------
// JPA 페이징 처리 : 요청 페이징 객체 - Pageable(매개변수)
//                 결과 페이징 객체 - Page     (리턴값)
// --------------------------------------------

📂 DeptRepository.java

✅ 쿼리 메소드 페이징 처리

Page<Dept> findAllByDnameContaining(String dname, Pageable pageable);

📂 DeptService.java

 //--------------------------------------------
    // 페이징 예제
    //--------------------------------------------
    // 1)
    public Page<Dept> findAllByDnameContaining(String dname, Pageable pageable) {
        Page<Dept> page
                = deptRepository.findAllByDnameContaining(dname, pageable);

        return page;
    }

    // 2) 기본 제공되는 전체조회 함수 : 페이징처리 기능 추가
    public Page<Dept> findAllPage(Pageable pageable) {
        Page<Dept> page
                = deptRepository.findAll(pageable);

        return page;
    }

📂 DeptController.java

//--------------------------------------------
    // 페이징 예제
    //--------------------------------------------
    // 1)
    @GetMapping("/dept/dname/{dname}/paging")
    public ResponseEntity<Object> getDeptDnamePage(@PathVariable String dname, Pageable pageable) {
        try {
            Page<Dept> page
                    = deptService.findAllByDnameContaining(dname, pageable);
//          todo : Map 자료구조 정보 저장 : 1) 부서 객체, 2) 페이징 정보 (3개)
            Map<String, Object> response = new HashMap<>();
            response.put("dept", page.getContent());                        // 부서 객체
            response.put("currentPage", page.getNumber());                  // 현재페이지 번호
            response.put("totalItems", page.getTotalElements());            // 전체 테이블 건수
            response.put("totalPage", page.getTotalPages());                // 전체페이지 수

            if (page.isEmpty() == false) {
//                성공
                return new ResponseEntity<>(response, HttpStatus.OK);
            } else {
//                데이터 없음
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }

        } catch (Exception e){
            log.debug(e.getMessage());
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    // 2) findAll() + 페이징
    // page=현재페이지번호(0~n), size=전체페이지수
    @GetMapping("/dept/all/paging")
    public ResponseEntity<Object> getDeptAllPage(Pageable pageable) {
        try {
            Page<Dept> page
                    = deptService.findAllPage(pageable);
//          todo : Map 자료구조 정보 저장 : 1) 부서 객체, 2) 페이징 정보 (3개)
            Map<String, Object> response = new HashMap<>();
            response.put("dept", page.getContent());                        // 부서 객체
            response.put("currentPage", page.getNumber());                  // 현재페이지 번호
            response.put("totalItems", page.getTotalElements());            // 전체 테이블 건수
            response.put("totalPage", page.getTotalPages());                // 전체페이지 수

            if (page.isEmpty() == false) {
//                성공
                return new ResponseEntity<>(response, HttpStatus.OK);
            } else {
//                데이터 없음
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }

        } catch (Exception e){
            log.debug(e.getMessage());
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

✅ 결과 - 1번 예제

GET http://localhost:8000/dept/dname/S/paging

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 18 Oct 2023 06:28:37 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
  "content": [
    {
      "insertTime": "2023-10-18 06:28:21",
      "updateTime": null,
      "dno": 20,
      "dname": "RESEARCH",
      "loc": "DALLAS"
    },
    {
      "insertTime": "2023-10-18 06:28:21",
      "updateTime": null,
      "dno": 30,
      "dname": "SALES",
      "loc": "CHICAGO"
    },
    {
      "insertTime": "2023-10-18 06:28:21",
      "updateTime": null,
      "dno": 40,
      "dname": "OPERATIONS",
      "loc": "BOSTON"
    }
  ],
  "pageable": {
    "sort": {
      "empty": true,
      "sorted": false,
      "unsorted": true
    },
    "offset": 0,
    "pageNumber": 0,
    "pageSize": 20,
    "paged": true,
    "unpaged": false
  },
  "last": true,
  "totalElements": 3,
  "totalPages": 1,
  "size": 20,
  "number": 0,
  "sort": {
    "empty": true,
    "sorted": false,
    "unsorted": true
  },
  "first": true,
  "numberOfElements": 3,
  "empty": false
}
응답 파일이 저장되었습니다.
> 2023-10-18T152837.200.json

Response code: 200; Time: 302ms (302 ms); Content length: 609 bytes (609 B)

✅ 결과 - 2번 예제

GET http://localhost:8000/dept/all/paging

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 18 Oct 2023 07:18:52 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
  "totalItems": 4,
  "totalPage": 1,
  "dept": [
    {
      "insertTime": "2023-10-18 07:18:02",
      "updateTime": null,
      "dno": 10,
      "dname": "ACCOUNTING",
      "loc": "NEW YORK"
    },
    {
      "insertTime": "2023-10-18 07:18:02",
      "updateTime": null,
      "dno": 20,
      "dname": "RESEARCH",
      "loc": "DALLAS"
    },
    {
      "insertTime": "2023-10-18 07:18:02",
      "updateTime": null,
      "dno": 30,
      "dname": "SALES",
      "loc": "CHICAGO"
    },
    {
      "insertTime": "2023-10-18 07:18:02",
      "updateTime": null,
      "dno": 40,
      "dname": "OPERATIONS",
      "loc": "BOSTON"
    }
  ],
  "currentPage": 0
}
응답 파일이 저장되었습니다.
> 2023-10-18T161852.200.json

Response code: 200; Time: 424ms (424 ms); Content length: 451 bytes (451 B)

✅ @Query 페이징 처리

📂 DeptRepository.java

 // 2) @Query : 페이징 처리(오라클 쿼리 : countQuery 속성 추가)
    @Query(value = "SELECT D.* FROM TB_DEPT D " +
            "WHERE D.DNAME LIKE '%'|| :dname || '%'",
            countQuery = "SELECT COUNT(*) FROM TB_DEPT D " +
                    "WHERE D.DNAME LIKE '%'|| :dname || '%'",
            nativeQuery = true)
    Page<Dept> selectByDnamePage(@Param("dname") String dname, Pageable pageable);

    // 3) @Query 페이징 + 조인(부서 + 사원) : DeptEmpDto
        @Query(value = "SELECT D.*, E.ENO, E.ENAME, E.SALARY " +
                "FROM TB_DEPT D, TB_EMP E " +
                "WHERE D.DNO = E.DNO",
                countQuery = "SELECT COUNT(*) " +
                        "FROM TB_DEPT D, TB_EMP E " +
                        "WHERE D.DNO = E.DNO",
                nativeQuery = true)
        Page<DeptEmpDto> selectNativeJoinPage(Pageable pageable);

📂 DeptService.java

// --------------------------------------------
// @Query : 페이징 처리
// --------------------------------------------
// 2)
public Page<Dept> selectByDnamePage(String dname, Pageable pageable) {
    Page<Dept> page
            = deptRepository.selectByDnamePage(dname, pageable);

    return page;
}

// 3) @Query 페이징 + 조인(부서 + 사원) : DeptEmpDto
public Page<DeptEmpDto> selectNativeJoinPage(Pageable pageable) {
    Page<DeptEmpDto> page
            = deptRepository.selectNativeJoinPage(pageable);

    return page;
}

📂 DeptController.java

// --------------------------------------------
    // @Query : 페이징 처리
    // --------------------------------------------
    // 2)
    @GetMapping("/dept/dname/{dname}/page")
    public ResponseEntity<Object> selectByDnamePage(String dname, Pageable pageable) {
        try {
            Page<Dept> page
                    = deptService.selectByDnamePage(dname, pageable);
//          todo : Map 자료구조 정보 저장 : 1) 부서 객체, 2) 페이징 정보 (3개)
            Map<String, Object> response = new HashMap<>();
            response.put("dept", page.getContent());                        // 부서 객체
            response.put("currentPage", page.getNumber());                  // 현재페이지 번호
            response.put("totalItems", page.getTotalElements());            // 전체 테이블 건수
            response.put("totalPage", page.getTotalPages());                // 전체페이지 수

            if (page.isEmpty() == false) {
//                성공
                return new ResponseEntity<>(response, HttpStatus.OK);
            } else {
//                데이터 없음
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }

        } catch (Exception e){
            log.debug(e.getMessage());
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    // 3) @Query 페이징 + 조인(부서 + 사원) : DeptEmpDto
    @GetMapping("/dept/native/join/page")
    public ResponseEntity<Object> selectNativeJoinPage(Pageable pageable) {
        try {
            Page<DeptEmpDto> page
                    = deptService.selectNativeJoinPage(pageable);
//          todo : Map 자료구조 정보 저장 : 1) 부서 객체, 2) 페이징 정보 (3개)
            Map<String, Object> response = new HashMap<>();
            response.put("dept", page.getContent());                        // 부서 객체
            response.put("currentPage", page.getNumber());                  // 현재페이지 번호
            response.put("totalItems", page.getTotalElements());            // 전체 테이블 건수
            response.put("totalPage", page.getTotalPages());                // 전체페이지 수

            if (page.isEmpty() == false) {
//                성공
                return new ResponseEntity<>(response, HttpStatus.OK);
            } else {
//                데이터 없음
                return new ResponseEntity<>(HttpStatus.NO_CONTENT);
            }

        } catch (Exception e){
            log.debug(e.getMessage());
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

 

반응형

+ Recent posts