Keep going
MyBatis와 스프링에서 페이징 처리 본문
페이징 처리를 위해서 필요한 파라미터는 1)페이지 번호, 2) 한 페이지에당 몇개의 데이터를 보여줄 것인지 결정되어야 한다.
페이지 번호와 몇 개의 데이터가 필요한지 별도의 파라미터로 전달하는 방식이 아닌 하나의 객체로 묶어서 전달하는 방식을 사용하겠다.
org.zerkck.domain 패키지의 Criteria 클래스 (검색 기준)
package org.zerock.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Criteria {
private int pageNum;
private int amount;
public Criteria() {
this(1,10);
}
public Criteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
}
|
cs |
13.1 MyBatis 처리와 테스트
BoardMapper는 인터페이스와 어노테이션을 이용하므로 페이징 처리와 같이 경우에 따라 SQL 구문 처리가 필요한 상황에선 복잡하게 작성된다.
BoardMapper 인터페이스
package org.zerock.mapper;
import java.util.List;
//import org.apache.ibatis.annotations.Select;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
public interface BoardMapper {
// @Select("select * from tb1_board where bno >0")
public List<BoardVO> getList();
public List<BoardVO> getListWithPaging(Criteria cri);
public void insert(BoardVO board);
public void insertSelectKey(BoardVO board);
public BoardVO read (Long bno);
public int delete (Long bno);
public int update(BoardVO board);
}
|
cs |
BoardMapper.xml
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
<![CDATA[
select
bno, title, content
from
(
select /*+ INDEX_DESC(tb1_board pk_board) */
rownum rn, bno, title, content
from
tb1_board
where rownum<= 20
)
where rn > 10
]]>
</select>
|
cs |
작성된 BoardMapper.xml 에서는 XML의 CDATA 처리가 들어간다.
CDATA 섹션은 XML에서 사용할 수 없는 부등호를 사용하기 위함이다.
13.1.1 페이징 테스트와 수정
MyBatis의 '#{ }'를 적용하기 전에 XML 설정이 제대로 동작하는지 테스트를 먼저 진행한다.
BoardMapperTests 메서드
@Test
public void testPaging() {
Criteria cri = new Criteria();
List<BoardVO> list = mapper.getListWithPaging(cri);
list.forEach(board -> log.info(board));
}
|
cs |
SQL에 문제가 없다는 것을 확인했다면 이제 Criteria 객체 내부의 값을 이용해서 SQL이 동작하도록 수정한다.
BoarMapper.xml 최종
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
<![CDATA[
select
bno, title, content
from
(
select /*+ INDEX_DESC(tb1_board pk_board) */
rownum rn, bno, title, content
from
tb1_board
where rownum<= #{pageNum} * #{amount}
)
where rn > (#{pageNum} -1) * #{amount}
]]>
</select>
|
cs |
BoardMapperTests의 testPaging()
@Test
public void testPaging() {
Criteria cri = new Criteria();
//10개씩 3페이지
cri.setPageNum(3);
cri.setAmount(10);
List<BoardVO> list = mapper.getListWithPaging(cri);
list.forEach(board -> log.info(board));
}
|
cs |
13.2 BoardController와 BoardService 수정
페이징 처리는 브라우저에서 들어오는 정보들을 기준으로 동작하기 때문에 BoardController와 BoardService 역시 전달되는 파라미터들을 받는 형태로 수정해야한다.
13.2.1 BoardService 수정
BoardService 인터페이스
package org.zerock.service;
import java.util.List;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
public interface BoardService {
public void register(BoardVO board);
public BoardVO get(Long bno);
public boolean modify(BoardVO board);
public boolean remove (Long bno);
// public List<BoardVO> getList();
public List<BoardVO> getList(Criteria cri);
}
|
cs |
BoardServiceImpl 클래스
package org.zerock.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;
import org.zerock.mapper.BoardMapper;
import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@Log4j
@Service
@AllArgsConstructor
public class BoardServieImpl implements BoardService{
//spring 4.3 이상에서 자동 처리
@Setter(onMethod_ = @Autowired )
private BoardMapper mapper;
@Override
public void register(BoardVO board) {
log.info("register..." + board);
mapper.insertSelectKey(board);
}
@Override
public BoardVO get(Long bno) {
log.info("get......" + bno);
return mapper.read(bno);
}
@Override
public boolean modify(BoardVO board) {
log.info("modify...." + board);
return mapper.update(board) == 1;
}
@Override
public boolean remove(Long bno) {
log.info("remove...." + bno);
return mapper.delete(bno) == 1;
}
@Override
public List<BoardVO> getList(Criteria cri) {
log.info("get List with criteria: " + cri);
return mapper.getListWithPaging(cri);
}
}
|
cs |
BoardServiceTests 클래스
@Test
public void testGetList() {
// service.getList().forEach(board -> log.info(board));
service.getList(new Criteria(2, 10)).forEach(board -> log.info(board));
}
|
cs |
13.2.2 BoardController 수정
기존 BoardController의 list( )는 아무런 파라미터가 없이 처리되었기 때문에 pageNum과 amount를 처리하기 위해 아래와 같이 수정한다.
BoardController 클래스 일부
@GetMapping("/list")
public void list(Criteria cri, Model model) {
log.info("list: " + cri);
model.addAttribute("list", service.getList(cri));
}
|
cs |
BoardControllerTests 클래스 일부
@Test
public void testList() throws Exception{
log.info(
mockMvc.perform(MockMvcRequestBuilders.get("/board/list")
.param("pageNum", "2")
.param("amount", "50"))
.andReturn()
.getModelAndView()
.getModelMap());
}
|
cs |
출처 : 코드로 배우는 스프링 웹 프로젝트 [구멍가게 코딩단]
'Records > Spring Framework' 카테고리의 다른 글
검색처리 (0) | 2021.03.15 |
---|---|
페이징 화면 처리 (0) | 2021.03.11 |
오라클 데이터베이스 페이징 처리 (0) | 2021.03.05 |
화면 처리 (0) | 2021.02.21 |
프레젠테이션(웹) 계층의 CRUD 구현 (0) | 2021.02.16 |
Comments