스프링 기초(인강 보충)_9

bitna's study note·2022년 7월 16일

스프링

목록 보기
19/54

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>
  1. JSP에서 페이지 번호 출력하기

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>
profile
좋은개발자가 되기위한 삽질기록 노트

0개의 댓글