데이터가 많다면 일정한 간격으로 쪼개서 페이징 처리를 해주는 것이 사용자에게 편리하다.
그동안 웹서핑을 하면서 편하게 버튼 눌러가면서 읽기만 했지.....페이징 처리가 이렇게 복잡미묘할 줄이야...
엔티티
: 데이터베이스 테이블과 매핑되는 자바 클래스
@Entity
@Table(name="movietbl")
@Data
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mcode;
@Column(nullable = false, length = 100 )
private String mname;
@Column(nullable = false, length = 50)
private String mdirector;
@Column(nullable = false, length = 50)
private String mnation;
@Column(nullable = false, length = 100)
private String mgenre;
@Column(nullable = false, length = 100)
private String mactor;
@Column(nullable = false, length = 10)
private String mopen;
@Column(length = 2000)
private String msynopsis;
@Column(length = 50)
private String moriname;
@Column(length = 50)
private String msysname;
}
영화 정보를 기록하는 엔티티 클래스를 만든다. 엔티티의 속성값을 html 페이지에서 사용한다.
public interface MovieRepository extends JpaRepository<Movie, Long> {
//DB CRUD(insert, update, delete, select 용 인터페이스)
//기본으로 전체 내용 삽입, 전체 내용 수정, 행 삭제
//전체 내용 검색 및 키 검색용 메소드를 제공.
//페이지 처리
Page<Movie> findByMcodeGreaterThan(Long mcode, Pageable pb);
}
엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없으므로 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리를 생성한다.
@AllArgsConstructor
public class PagingUtil {
private int totalPage; //전체 페이지 개수
private int pageNum; //현재 보이는 페이지 번호
private int pageCnt; //페이지당 보여질 번호 개수
private String urlStr; //링크 url
public String makePaging(){
String pageHtml = null;
StringBuffer sb = new StringBuffer();
//현재 그룹
int curGroup = (pageNum % pageCnt) > 0?
pageNum/pageCnt +1 :
pageNum/pageCnt;
//그룹의 시작번호
int start = (curGroup * pageCnt) - (pageCnt -1);
//그룹의 끝번호
int end = (curGroup * pageCnt) >= totalPage ?
totalPage : curGroup * pageCnt;
//page html 작성
if(start != 1){
sb.append("<a class='pno' href='/" + urlStr + "pageNum=" + (start -1) + "'>◀</a>");
}
for(int i = start; i <= end; i++){
if(pageNum == i){
sb.append("<font class='pno'>" + i + "</font>");
}
else{
sb.append("<a class='pno' href='/" + urlStr + "pageNum=" + i + "'>" + i +" </a>");
}
}
if(end != totalPage){
sb.append("<a class='pno' href='/" + urlStr + "pageNum=" + (end + 1) + "'>▶</a>");
}//<a class='pno' href='/?pageNum=6>▶</a>
//Stringbuffer -> String 변환
pageHtml = sb.toString();
return pageHtml;
}
}
웹 페이지에서 처리된 페이징 버튼을 표현한다.
@AllArgsConstructor
: 모든 필드 값을 파라미터로 받는 생성자를 만드는 어노테이션
public class MovieService {
@Autowired
private MovieRepository mRepo;
private ModelAndView mv;
public ModelAndView getMovieList(Integer pageNum, HttpSession session){
log.info("getMovieList()");
if(pageNum == null){
pageNum =1;
}
int listCnt = 5; //한 페이지당 5개씩 목록 출력
//페이징 조건 생성(Pageable)
Pageable pb = PageRequest.of((pageNum -1), listCnt, Sort.Direction.DESC, "mcode");
//of(시작번호, 목록개수, 정렬방식, 키필드명)
Page<Movie> result = mRepo.findByMcodeGreaterThan(0L, pb);
//페이지 형태의 결과를 목록형태로 변환
List<Movie> mList = result.getContent();
//전체 페이지
int totalPage = result.getTotalPages();
//페이징용 html 작성 //getPaging 서비스 메소드 생성
String paging = getPaging(pageNum, totalPage);
//세션에 페이지 번호 저장
session.setAttribute("pageNum", pageNum);
mv = new ModelAndView();
mv.addObject("mList", mList);
//페이징용 html 추가
mv.addObject("paging", paging);
//뷰네임 지정
mv.setViewName("home");
return mv;
}
}
getMovieList
의 역할
pb
mRepo
데이터 가져오기getPaging
ModelAndView
로 값 저장 후 home
으로 리턴//페이징 구간 설정
private String getPaging(Integer pageNum, int totalPage) {
log.info("getPaging()");
String pageHtml = null;
int pageCnt = 2;
String urlStr = "?";
PagingUtil paging = new PagingUtil(totalPage, pageNum, pageCnt, urlStr);
pageHtml = paging.makePaging();
return pageHtml;
}
PagingUtil
에서 가져온 정보로 pageHtml
을 생성하고 return한다.
2023.06.07 작성