-DeptRepository : 레포지토리 클래스 : DB CRUD 함수가 있는 인터페이스

-> 복사할 때는 세미콜론 빼고 복사함!
◈ 사용법
@Query(value="sql 문", nativeQuery=true)


-> 복사할 때는 세미콜론 빼고 복사함!

countQuery = "SELECT count(*) FROM TB_DEPT D\n" +
"WHERE D.DNAME LIKE '%'|| :dname ||'%'"
->DeptService
public Page<Dept> findAllByDnameContaining(String dname,
Pageable pageable) {
// DB like 검색 함수 실행 : 페이징 처리
Page<Dept> page
= deptRepository
.findAllByDnameContaining(dname, pageable);
return page;
}
->DeptController
☆ 전체 조회 + like 검색 + 페이징 처리
@Slf4j
@Controller
@RequestMapping("/basic")
public class DeptController {
// 서비스 클래스 가져오기
@Autowired
DeptService deptService;
// 전체 조회 + like 검색 + 페이징 처리
// 복습 : 매개변수 전달 방식 : 1) 쿼리스트링 : @RequestParam
// 2) 파라메터방식 : @PathVariable
@GetMapping("/dept")
public String getDeptAll(
@RequestParam(defaultValue = "") String dname,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "3") int size,
Model model) {
// TODO: 페이징 처리 객체에 값 저장 : Pageable
// 1) 현재페이지번호 : page
// 2) 1페이지 당 개수 : size
Pageable pageable = PageRequest.of(page, size);
// TODO: DB like 검색 서비스 함수 실행
Page<Dept> pageRes
= deptService
.findAllByDnameContaining(dname, pageable);
// Page 객체에는 굉장히 많은 속성이 있음 : 현제페이지 번호 등
// 자바 자료구조(컬렉션프레임워크) : List, Map<키, 값>
// 결과를 jsp 전송
}
}
-> 결과를 jsp로 전송
model.addAttribute("dept",pageRes.getContent()); // 1)부서정보 배열
model.addAttribute("currentPage",pageRes.getNumber()); // 2)현재 페이지 번호
model.addAttribute("totalItems",pageRes.getTotalElements()); // 3)전체 테이블 건수
model.addAttribute("totalPages",pageRes.getTotalPages()); // 4)전체 페이지 개수
// 공식 : 블럭 시작페이지 번호 = (Math.floor(현재페이지번호/1페이지당개수)) * 1페이지당개수 (:size)
long blockStartPage = (long) Math.floor((double) (pageRes.getNumber())/size) * size;
model.addAttribute("startPage" , blockStartPage); //5) 블럭시작 페이지 번호
// 공식 : 블럭 끝페이지 번호 = 블럭 시작페이지번호 + 1페이자당개수 - 1
long blockEndPage = blockStartPage * size - 1;
// 블럭 끝페이지 번호 != , > 전체페이지 번호 : 이 경우가 발생할 수 있음
// 블럭 끝페이지 번호 = 전체피이지 번호 (같게 값 보정)
blockEndPage = (blockEndPage >= pageRes.getTotalPages())?pageRes.getTotalPages()-1:blockEndPage;
model.addAttribute("endPage", blockEndPage);
return "basic/dept/dept_all.jsp";
-> dept_all.jsp
<c:forEach var="data" items="${dept}">
=> 반복문 dept 로 변경
-Add 버튼 추가
<%-- TODO: Add 버튼 --%>
<div class="text-center">
<a href="/basic/dept/addition" class="btn btn-primary">Add</a>
</div>

(전체조회 컨트롤러 함수)
<%-- TODO: 페이지번호 --%>
<%-- 복습 : class="d-flex justify-content-center" : 중앙정렬 --%>
<div class="d-flex justify-content-center">
<ul class="pagination">
<%-- TODO: startPage : 0부터 시작 (블럭 시작페이지번호)--%>
<%-- TODO: endPage : (블럭 끝페이지번호)--%>
<%-- TODO: currentPage : 현재페이지번호 0부터 시작 --%>
<%-- 이전 버튼 : 시작페이지가 0이면 버튼 비활성화 아니면 활성화 --%>
<li class="page-item ${(startPage+1==1)? 'disabled' : ''}">
<a href="/basic/dept?page=${startPage-1}&size=${3}" class="page-link">이전</a>
</li>
<%-- TODO: 반복문으로 실행 --%>
<%-- 사용법 : <c:forEach var="data" begin="시작값" end="끝값">반복문</c:forEach>--%>
<c:forEach var="data" begin="${startPage}" end="${endPage}">
<li class="page-item"><a class="page-link" href="/basic/dept?page=${data}&size=${3}">${data+1}</a></li>
</c:forEach>
<%-- 다음 버튼 : 끝페이지가 전체페이지와 같으면 비활성화 아니면 활성화 --%>
<li class="page-item ${(endPage+1==totalPages)? 'disabled' : ''}">
<a href="/basic/dept?page=${endPage+1}&size=${3}" class="page-link">다음</a>
</li>
</ul>
</div>

(disabled : 비활성화)