[스프링 타임리프] 영화 정보 기록 페이지 만들기 2 (페이징)

호연지기·2023년 6월 7일
0
post-thumbnail

페이징 처리를 해보자!

데이터가 많다면 일정한 간격으로 쪼개서 페이징 처리를 해주는 것이 사용자에게 편리하다.
그동안 웹서핑을 하면서 편하게 버튼 눌러가면서 읽기만 했지.....페이징 처리가 이렇게 복잡미묘할 줄이야...

✅ 페이징 처리를 위한 준비

💻 Entity 소스

엔티티 : 데이터베이스 테이블과 매핑되는 자바 클래스

@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 페이지에서 사용한다.

💻 Repository 소스

public interface MovieRepository extends JpaRepository<Movie, Long> {
    //DB CRUD(insert, update, delete, select 용 인터페이스)
    //기본으로 전체 내용 삽입, 전체 내용 수정, 행 삭제
    //전체 내용 검색 및 키 검색용 메소드를 제공.

    //페이지 처리
    Page<Movie> findByMcodeGreaterThan(Long mcode, Pageable pb);
}

엔티티만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없으므로 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리를 생성한다.

✅ 페이징 서비스 처리

💻 PagingUtil 소스

@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 : 모든 필드 값을 파라미터로 받는 생성자를 만드는 어노테이션

💻 Service 소스(getMovieList)

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의 역할

  • 한 페이지당 글 목록 5개씩 출력하도록 지정
  • 페이징 조건 생성 → pb
  • mRepo 데이터 가져오기
  • 페이징용 html 작성한 메소드 가져오기 → getPaging
  • 세션에 페이지 번호 저장
  • ModelAndView로 값 저장 후 home으로 리턴

💻 Service 소스(getPaging)

//페이징 구간 설정
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한다.

📅 DATE

2023.06.07 작성

profile
사람의 마음에 차 있는 너르고 크고 올바른 기운

0개의 댓글