Keep going

MyBatis와 스프링에서 페이징 처리 본문

Records/Spring Framework

MyBatis와 스프링에서 페이징 처리

코딩천재홍 2021. 3. 11. 03:30

페이징 처리를 위해서 필요한 파라미터는 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(210)).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