7월 17일
1.본격적인 페이징 처리하기
(1)Criteria 클래스 만들기
com.keduit.domain 패키지에 Criteria 클래스를 만듬.
DTO개념이다.
package com.keduit.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
//파라미터수집은 자바빈이 한다. 그래서 자바빈의 규칙에 따라 Getter 와 Setter가 필요하다. 그래서 아래와 같이 어노테이션 붙여줌
@Getter
@Setter
@ToString
public class Criteria {
private int pageNum;
private int amount;
//생성자로 초기값 주기
//생성자가 다른 생성자 호출할 때 사용, 다른 생성자 호출 시 첫 줄에서만 사용 가능
public Criteria() {
this(1,5);
}
public Criteria(int pageNum, int amount) {
super();
this.pageNum=pageNum;
this.amount=amount;
}
}
(2)boardMapper.xml 에 page처리하는 sql구문을써줘야함.
이때 pageNum 과 amount가 필요한데,
pageNum 은 페이지번호 amount 1페이지당 보여지는게시물의 총숫자
아래와 같이 인라인뷰 기법으로 페이지당 1~5,6~10,11~15....
이렇게 범위정하여 출력이 가능함.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--dtd라는건 xml문서가 어떻게 구성되는지,어떤 태그들을 몇번 쓸수 있게했는지 알수있는 문서이다.xml 태그들을 지원한다.-->
<mapper namespace="com.keduit.mapper.BoardMapper">
<!-- select이라는 태그를 쓰면 결과데이터를 어떻게 처리할지에 대해 명시해 줘야함 -->
<!-- <![CDATA[]]>처리는 xml태그에서 부등호부분에 문제를 일으키기때문에 이부분을 xml태그처리를 하지말라는 의미 -->
<select id="getListWithPaging" resultType="com.keduit.domain.BoardVO">
<![CDATA[
select * from
(
select /*+ INDEX_DESC(t_board PK_BPARD)*/ rownum rn, bno, title, writer, regdate, updatedate
from t_board
where bno > 0 and rownum >0 and rownum <= (#{pageNum} * #{amount})
)
where rn > (#{pageNum}-1)* #{amount}
]]>
</select>
</mapper>
(3)BoardMapper 인터페이스 작성하기
package com.keduit.mapper;
public interface BoardMapper {
//파라미터를 받아서 페이징 SQL을 처리하는게 필요하다.
List <BoardVO> getListWithPaging(Criteria cri);
}
(4)BoardService 인터페이스 작성하기
package com.keduit.service;
//비즈니스 계층이기 때문에 DB용어가 아니라 고객과 소통하기 위한 변수명을 지어준다.
public interface BoardService {
List<BoardVO> getList(Criteria cri);
}
(5)BoardServiceImpl 클래스 작성하기
package com.keduit.service;
@Service //스프링아 해당클래스는 빈으로 등록해죠
@Log4j
@RequiredArgsConstructor //해당 어노테이션은 final로 선언한 변수를 찾아서 주입해줌
@ToString
public class BoardServiceImpl implements BoardService{
private final BoardMapper mapper;
@Override
public List<BoardVO> getList(Criteria cri) {
return mapper.getListWithPaging(cri);
}
}
(6)BoardMapperTest 하기
package com.keduit.mapper;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardMapperTest {
@Autowired
private BoardMapper boardMapper;
@Test
public void testPaging() {
Criteria cri =new Criteria();
List <BoardVO> list = boardMapper.getListWithPaging(cri);
list.forEach(b -> log.info(b));
}
}
(7)BoardController 작성하기
package com.keduit.controller;
@Controller //스프링의 Controller빈으로 인식할수 있게함.
@RequiredArgsConstructor //해당 어노테이션은 final로 선언한 변수를 찾아서 주입해줌
@RequestMapping("/board/*")
@Log4j
//아래 모든코드가 테스트코드까지 성공했으면, service에서 Controller 까지 넘어가는 거는 문제없다는게 유추됨
public class BoardController {
private final BoardService service;
@GetMapping("/list")
public void list(Criteria cri, Model model) {
log.info(cri);
log.info("list..........");
model.addAttribute("list",service.getList(cri));
}
}
2.화면 페이징 처리
(1)페이지 처리에 필요한 정보들
현재페이지번호,이전과 다음으로 이동 가능한 링크의 표시여부,화면에서 보여지는 페이지의 시작번호와 끝번호
(2)PageDTO 작성하기
위에 필요한 요소를 계산하기위한 클래스이다.
package com.keduit.domain;
@ToString
@Getter
public class PageDTO {
private int startPage, endPage;
private boolean prev, next;
private int total;
private Criteria cri;
public PageDTO(Criteria cri, int total) {
this.cri=cri;
this.total=total;
this.endPage= (int)(Math.ceil(cri.getPageNum()/10.0))*10;
this.startPage=endPage-9;
this.prev= this.startPage>1;
int realEnd= (int)Math.ceil((total*1.0)/cri.getAmount());
this.endPage=realEnd<=endPage? realEnd:endPage;
this.next=this.endPage < realEnd;
}
}
(3)BoardMapperTest 해보기
위에 PageDTO 계산이 잘되는지 확인할 필요가 있음
package com.keduit.mapper;
@RunWith(SpringJUnit4ClassRunner.class)//이 클래스로 잘돌아가는지 test해볼꺼야
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")//참고할 경로는 여기야
@Log4j //화면에 뿌려주는건 Log4j가 관리 할거야
public class BoardMapperTest {
@Autowired
private BoardMapper boardMapper;
@Test
public void testPageDTO() {
Criteria cri=new Criteria();
cri.setPageNum(25);
PageDTO pageDTO = new PageDTO(cri,251);
log.info(pageDTO);
}
}
(4)BoardController의 list Getmapping에 PageDTO 부분 추가하기
@GetMapping("/list")
public void list(Criteria cri, Model model) {
log.info(cri);
log.info("list..........");
model.addAttribute("list",service.getList(cri));
model.addAttribute("pageMaker",new PageDTO(cri, 123)); //123은 임의의 토탈 글 수량
}
(5)list.jsp 수정
table이 끝나는 부분에 아래와 같이 넣어주기
<h3>${pageMaker}</h3>
<div class='pull-right'>
<ul>
<c:forEach begin="${pageMaker.startPage}"
end="${pageMaker.endPage}" var="num">
<li>${num}</li>
</c:forEach>
</ul>
</div>
list.jsp 만 추가수정해줌
<ul class="pagination">
<c:if test="${pageMaker.prev}">
<li class="page-item">
<a class="page-link" href="#" tabindex="-1">Previous</a>
</li>
</c:if>
<c:forEach begin="${pageMaker.startPage}"
end="${pageMaker.endPage}" var="num">
<li class="page-item ${pageMaker.cri.pageNum==num?"active":""}"><a class="page-link" href="#">${num}</a></li>
</c:forEach>
<c:if test="${pageMaker.next}">
<li class="page-item">
<a class="page-link" href="#" tabindex="-1">Next</a>
</li>
</c:if>
</ul>