Spring

[SpringBoot] JPA 사용해서 페이지네이션 구현해보기

송 이 2024. 6. 4. 15:27

 

- Memo 엔티티 클래스 생성

@Entity //JPA로 관리되는 객체라는 표시이다.
@Table(name = "tbl_memo")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Memo {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long mno;
	@Column(length = 200, nullable=false)
	private String memoText;
	
	
	public Memo(String memoText) {
		this.memoText = memoText;
	}
}

 

@Id : 기본키 설정

@GeneratedValue(strategy = GenerationType.IDENTITY) : 자동 숫자 증가

@Column(length = 200, nullable=false) : 컬럼 생성, 제약조건 추가

 

 

- 레포지토리 인터페이스 생성

public interface MemoRepository extends JpaRepository<Memo, Long>{
	//save(엔티티), findById(아이디), deleteById(아이디),findAll(),count() 
	List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}

 

 

 

- 컨트롤러 생성 => 페이지네이션 구현 기능

@Controller
public class MyController {
	
	@Autowired
	MemoRepository memoRepository;
	
	
	
	@RequestMapping("/list")
	public String list(@RequestParam("pageNum")Long pageNum, Model model) {
		//전체 게시글 수
		int totalCnt = (int)memoRepository.count();
		//페이지 당 게시글 수 : 10개
		int pagePerboard=10;
		//페이지 블록에 보여질 페이지 번호 수 : 5개
		int pageCount = 5;
		//페이지 블록 시작 페이지 번호
		int start = (int)Math.floor((pageNum-1)/pageCount)*pageCount+1;
		//페이지 블록 끝 페이지 번호(시작번호 + 5)
		int end = start + (pageCount-1);
		//실제 페이지 블록 끝번호
		int realEnd = (totalCnt/10)+1;
		
		System.out.println("pageNum : "+ pageNum);
		model.addAttribute("pageNum",pageNum);
		model.addAttribute("list",memoRepository.findByMnoBetweenOrderByMnoDesc((pageNum*10)-9,pageNum*10));
		model.addAttribute("totalCnt",totalCnt);
		model.addAttribute("start",start);
		model.addAttribute("end",end);
		model.addAttribute("realEnd",realEnd);
		
		return "list";
	}
}

 

 

- View 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>       
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
	<c:if test="${start ne 1 }">
		<span><a href="list?pageNum=${start-5 }">[이전]</a></span>&nbsp;&nbsp;
	</c:if>
	
	<c:forEach var="i" begin="${start }" end="${(end<realEnd)?end:realEnd }">
		<a href="list?pageNum=${i }">${i }</a> &nbsp;&nbsp;
	</c:forEach>
	
	<c:if test="${end<realEnd }">
		<span><a href="list?pageNum=${end+1 }">[다음]</a></span>
	</c:if>
	
	<div>start : ${start }</div>
	<div>end : ${end }</div>
	<div>realEnd : ${realEnd }</div>
</div>
</body>
</html>