반응형
// --------------------------------------------
// 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);
}
}
반응형
'Spring Boot > 스프링부트 예제' 카테고리의 다른 글
front + backend 게시판 CRUD 구현 (2) (0) | 2023.10.20 |
---|---|
JPA - 연관관계 매핑 (0) | 2023.10.19 |
JPA - JPQL(Java Persistence Query Language) (1) | 2023.10.17 |
JPA 상세조회, 저장함수, 수정함수, 삭제함수 (0) | 2023.10.17 |
JPA를 활용한 CRUD 구현하기 (0) | 2023.10.16 |