스프링 10일차

선장원·2021년 12월 4일
1

Spring

목록 보기
11/16

10일차 (12/03)

페이징하고 검색기능 만들기는 했는데
이해는 되는데 이걸 정리하기 너무 어렵다

Spring

paging

상수선언

일단 상수를 선언한다

	private static final int PAGE_LIMIT = 3; // 한페이지에 보여질 글 개수 
	private static final int BLOCK_LIMIT = 3; // 한화면에 보여질 페이지 개수

위 값을 paging메서드와 pagingList메서드에서 사용한다

PageDTO

PageDTO를 만들고

	private int page;
	private int maxPage;
	private int startPage;
	private int endPage;

PageDTO에 값을 담는 메서드인 paging메서드를 실행하고(컨트롤러에서)
page에 현재 페이지 값
max페이지에 최대 페이지값
strart페이지에 처음나오는 페이지 값(3개씩 나온다고 하면 1,4,7,10~~)
end페이지에 마지막 페이지

페이징 메소드

	public PageDTO paging(int page) {
		int boardCount = br.boardCount(); // 필요한 총 글 갯수
		// 전체페이지 계산
		int maxPage = (int)(Math.ceil((double)boardCount / PAGE_LIMIT)); // ceil() : 소수점이 붙으면 값을 올려준다
		// 2페이지를 요청했을 때 1페이지, 4페이지를 요청했을 때 4페이지, 8페이지를 요청했을 때 7페이지
		// 1, 2, 3 >> 1
		// 4, 5, 6 >> 4
		// 7, 8, 9 >> 7
		int startPage = (((int)(Math.ceil((double)page / BLOCK_LIMIT))) - 1) * BLOCK_LIMIT + 1; // BLOCK_LIMIT은 페이지에 보이는 페이지수 
		int endPage = startPage + BLOCK_LIMIT - 1;
		if(endPage > maxPage)
			endPage = maxPage; 
		PageDTO paging = new PageDTO();
		paging.setPage(page);
		paging.setStartPage(startPage);
		paging.setEndPage(endPage);
		paging.setMaxPage(maxPage);
		
		System.out.println("paging.toString(): "+ paging.toString());
		
		return paging;
	}

count 메서드를 실행해서 총 글의 갯수를 가져오고
그 값을 이용해서 총 페이지 수와 스타트 페이지 엔드페이지를 구한다

ceil()

자바의 math기능 중에 cail은 소수점이 있으면 값을 올림해준다.

이거는 페이지를 구하는 메소드

페이징 리스트 메소드

paging메서드를 구하고 pagingList메서드를 실행해서 출력할 글을 가져온다

Map을 선언해서 limit에서 사용할 처음 글과 글의 갯수를 입력한다

리스트에 담아오기 위해 맵을 만든 것을 맵퍼로 보내서 sql 문법을 사용한다

limit

글을 가져올 때 처음 글을 정하고 몇개를 가져올 것인가를 정한다
select * from 테이블명 limit 처음글, 글의갯수

뭐 설명하기가 힘드네

컨트롤러

	@RequestMapping(value="paging", method=RequestMethod.GET)
	// value는 파라미터이름 , required는 필수 여부
	public String paging(@RequestParam(value="page", required=false, defaultValue="1")int page, Model model) {
		PageDTO paging = bs.paging(page);
		List<BoardDTO> boardList = bs.pagingList(page);
		model.addAttribute("bList", boardList);
		model.addAttribute("paging", paging);
		return "board/findAll";
	}

서비스

	private static final int PAGE_LIMIT = 3; // 한페이지에 보여질 글 개수 
	private static final int BLOCK_LIMIT = 3; // 한화면에 보여질 페이지 개수


	public List<BoardDTO> pagingList(int page) {
		// TODO Auto-generated method stub
		// 1페이지 limit 0,3 / 2페이지 3,3 / 3페이지 6,3
		int pagingStart = (page-1) * PAGE_LIMIT;
		Map<String, Integer> pagingParam = new HashMap<String, Integer>();
		pagingParam.put("start", pagingStart);
		pagingParam.put("limit", PAGE_LIMIT);
//		List<BoardDTO> pagingList = br.pagingList(pagingStart);
		List<BoardDTO> pagingList = br.pagingList1(pagingParam);
		for(BoardDTO b: pagingList) {
			System.out.println(b.toString());
		}
		return pagingList;
	}

	// 필요한 총 페이지 갯수 계산
	// 현재 사용자가 요청한 페이지가 2페이지라면 화면에는 1,2,3을 보여주고
	// 요청 페이지가 6페이지라면 화면에 4,5,6을 보여준다
	// 요청페이지가 7페이지라면 7을 보여준다
	public PageDTO paging(int page) {
		int boardCount = br.boardCount(); // 필요한 총 글 갯수
		// 전체페이지 계산
		int maxPage = (int)(Math.ceil((double)boardCount / PAGE_LIMIT)); // ceil() : 소수점이 붙으면 값을 올려준다
		// 2페이지를 요청했을 때 1페이지, 4페이지를 요청했을 때 4페이지, 8페이지를 요청했을 때 7페이지
		// 1, 2, 3 >> 1
		// 4, 5, 6 >> 4
		// 7, 8, 9 >> 7
		int startPage = (((int)(Math.ceil((double)page / BLOCK_LIMIT))) - 1) * BLOCK_LIMIT + 1; // BLOCK_LIMIT은 페이지에 보이는 페이지수 
		int endPage = startPage + BLOCK_LIMIT - 1;
		if(endPage > maxPage)
			endPage = maxPage; 
		PageDTO paging = new PageDTO();
		paging.setPage(page);
		paging.setStartPage(startPage);
		paging.setEndPage(endPage);
		paging.setMaxPage(maxPage);
		
		System.out.println("paging.toString(): "+ paging.toString());
		
		return paging;
	}

리퍼지토리

	public int boardCount() {
		return sql.selectOne("board.count");
	}
	
	public List<BoardDTO> pagingList(int pagingStart) {
		return sql.selectList("board.pagingList", pagingStart);
	}

	public List<BoardDTO> pagingList1(Map<String, Integer> pagingParam) {
		return sql.selectList("board.pagingList1", pagingParam);
	}

맵퍼

		<select id="pagingList" parameterType="int" resultType="bdto">
		select * from board order by b_number desc limit #{pagingStart}, 3
	</select>
	
	<select id="pagingList1" parameterType="java.util.HashMap" resultType="bdto">
		select * from board order by b_number desc limit #{start}, #{limit}
	</select>
	
	<select id="count" resultType="int">
		select count(b_number) from board
	</select>

이건 리스트에 글을 담아오는 메서드

페이지 유지하기

내가 페이지를 돌아다니다가 들어갓다가 목록을 눌렀을 때 다시 내가 봤던 페이지로 가기 위해 페이지 숫자를 파라미터에 담아서 다시 사용한다

검색 기능

나는 검색창에 자동완성으로 뜨는 것 만들고 싶었는데
그거는 아직 힘들어 보인다 ㅠㅠ

findAll에 form태그를 사용해서
searchtype과 keyword를 받는다

searchtype과 keyword를 서비스로 보내서
서비스에서 맵Map를 만들어서 담는다

맵을 리퍼지토리로 보내서
sql문법을 이용해서 리스트에 담아온다

like연산자와 concat을 사용해서 검색어가 들어간 글을 리스트에 담아온다!

concat

스프링에서 사용하기 위해 단어를 합쳐주는 용도??
select * from 테이블 where 컬럼명 like concat(‘%’, ‘#{으갸갸갸갸}’, ‘%’)를 쓰면
‘%으갸갸갸갸%’로 만들어주는 용도인가

컨트롤러

	@RequestMapping(value="search", method = RequestMethod.GET)
	public String search(@RequestParam("searchtype") String searchtype, @RequestParam("keyword") String keyword, Model model) {
		List<BoardDTO> bList = bs.search(searchtype,keyword);
		model.addAttribute("bList", bList);
		return "board/findAll";
	}

서비스

	public List<BoardDTO> search(String searchtype, String keyword) {
		Map<String, String> searchParam = new HashMap<String, String>();
		searchParam.put("type", searchtype);
		searchParam.put("word", keyword);
		return br.search(searchParam);
	}

리퍼지토리

	public List<BoardDTO> search(Map<String, String> searchParam) {
		
		return sql.selectList("board.search", searchParam);
	}

맵퍼

	<select id="pagingList1" parameterType="java.util.HashMap" resultType="bdto">
		select * from board order by b_number desc limit #{start}, #{limit}
	</select>
	
	<select id="count" resultType="int">
		select count(b_number) from board
	</select>
	
	<!-- <select id="search" parameterType="java.util.HashMap" resultType="bdto">
		select * from board where ${type} like concat('%', #{word}, '%')	
	</select> -->
	<select id="search" parameterType="java.util.HashMap" resultType="bdto">
		select * from board 			
		<include refid="sear"></include>
	</select>
	
	<sql id="sear">
		<choose>
			<when test="type=='b_title'">
				where b_title like concat('%', #{word}, '%') 
			</when>
			<when test="type=='b_writer'">
				where b_writer like concat('%', #{word}, '%') 
			</when>
		</choose>
	</sql>

맵퍼에서 사용하는 방식은 두가지 방식이 있다

include

mybatis에서 사용하는 if문 같은 느낌

profile
코딩도전기

0개의 댓글