1cm

자바 프로그래밍_Day_111_게시글 목록 조회 본문

국비지원_Java/Java Programming_2

자바 프로그래밍_Day_111_게시글 목록 조회

dev_1cm 2022. 2. 22. 09:09
반응형

 

 

 

 

2022. 01. 21

- 게시글 목록 조회

 

mybatis에서 작업했던 board.model.vo, board-mapper.xml 복붙해주기

 

list.jsp 파일 생성 후 내용은 이전에 mvc에서 사용했던 것 복붙

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<c:set var="path" value="${ pageContext.request.contextPath }"/>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>게시판 </h2>
<div id="board-list-container">
	<c:if test="${ !empty loginMember }">
		<button type="button" id="btn-add"
			onclick="location.href='${ path }/board/write'">글쓰기</button>	
	</c:if>

	<table id="tbl-board">
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>첨부파일</th>
			<th>조회수</th>
		</tr>
		<c:if test="${ empty list }">			
			<tr>
				<td colspan="6">
					조회된 게시글이 없습니다.
				</td>
			</tr>	
		</c:if>
		<c:if test="${ !empty list }">
			<c:forEach var="board" items="${ list }">
				<tr>
					<td>${ board.rowNum }</td>
					<td>
						<a href="${ path }/board/view?no=${ board.no }">
							${ board.title }
						</a>
					</td>
					<td>${ board.writerId }</td>
					<td>${ board.createDate }</td>
					<td>
						<c:if test="${ empty board.originalFileName }">
							<span> - </span>
						</c:if>
						<c:if test="${ !empty board.originalFileName }">
							<img src="${ path }/resources/images/file.png" width="20" height="20"/>
						</c:if>
					</td>
					<td>${ board.readCount }</td>
				</tr>
			</c:forEach>

		</c:if>			
	</table>
	<div id="pageBar">
		<!-- 맨 처음으로 -->
		<button onclick="location.href='${ path }/board/list?page=1'">&lt;&lt;</button>

		<!-- 이전 페이지로 -->
		<button onclick="location.href='${ path }/board/list?page=${ pageInfo.prevPage }'">&lt;</button>

		<!--  10개 페이지 목록 -->
		<c:forEach begin="${ pageInfo.startPage }" end="${ pageInfo.endPage }" varStatus="status">
			<c:if test="${ status.current == pageInfo.currentPage }">				
				<button disabled>${ status.current }</button>
			</c:if>
			
			<c:if test="${ status.current != pageInfo.currentPage }">				
				<button onclick="location.href='${ path }/board/list?page=${ status.current }'">${ status.current }</button>
			</c:if>
		</c:forEach>

		<!-- 다음 페이지로 -->
		<button onclick="location.href='${ path }/board/list?page=${ pageInfo.nextPage }'">&gt;</button>

		<!-- 맨 끝으로 -->
		<button onclick="location.href='${ path }/board/list?page=${ pageInfo.maxPage }'">&gt;&gt;</button>
	</div>
</div>
</body>
</html>

 

path로 이름 변경해주기

 

 

 

- list를 읽어올 수 있는 서블릿 만들기(컨트롤러)

 

> BoardController.java

package com.kh.mvc.board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class BoardController {
	
//	@GetMapping("/board/list")
//	public void list() {
//	}
	
	@GetMapping("/board/list")
	public String list() {
		return "board/list";
	}
	
	
}

-> 해당 클래스 파일 빈으로 등록하기(@Controller)

-> Get요청을 받을 수 있는 메소드 등록(@GetMapping)

-> 컨트롤러가 return하는 것 => view이름 (view resolver를 통해 가져옴)

 

 

 

 

 

페이지 info -> mybatis에서 썼던 파일 복붙

> util/PageInfo.java

package com.kh.mvc.common.util;

import lombok.Getter;

@Getter
public class PageInfo {
	private int currentPage;
	
	private int pageLimit;
	
	private int listCount;
	
	private int listLimit;	
	
	/**
	 * @param currentPage 현재 페이지
	 * @param pageLimit 한 페이지에 보이는 페이지의 수 
	 * @param listCount 전체 리스트의 수
	 * @param listLimit 한 페이지에 표시될 리스트의 수
	 */
	public PageInfo(int currentPage, int pageLimit, int listCount, int listLimit) {
		this.currentPage = currentPage;
		this.pageLimit = pageLimit;
		this.listCount = listCount;
		this.listLimit = listLimit;
	}
	
	/** 	
	 * @return 전체 페이지 중 가장 마지막 페이지
	 */
	public int getMaxPage() {
		/*
		 	listCount = 100, listLimit = 10
		 	100 / 10 = 10.0		=> 10페이지
		 	101 / 10 = 10.1		=> 11페이지
		 	103 / 10 = 10.3		=> 11페이지
		 	109 / 10 = 10.9		=> 11페이지
		 	110 / 10 = 11.0		=> 11페이지
		 	111 / 10 = 11.1		=> 12페이지
		 */
		return (int) Math.ceil((double) this.listCount / this.listLimit);
	}
	
	/**
	 * 
	 * @return 페이징 된 페이지 중 시작 페이지
	 */
	public int getStartPage() {
		/*	
			< 1 2 3 4 5 6 7 8 9 10 >
			< 11 12 13 14 15 16 17 18 19 20 >
			< 21 22 23 24 25 26 27 28 29 30 >
			
			1, 11, 21, 31, .... => (10 * n) + 1 (n >= 0)
			
			1 ~ 10 : n = 0
			11 ~ 20 : n = 1
			21 ~ 30 : n = 2
			31 ~ 40 : n = 3 
			.... 
			n = (currentPage - 1) / pageLimit
			
			(10 * ((currentPage - 1) / pageLimit)) + 1 (n >= 0)
		 */
		return (this.pageLimit * ((this.currentPage - 1) / this.pageLimit)) + 1;
	}

	/**
	 * 
	 * @return 페이징 된 페이지 중 마지막 페이지
	 */ 
	public int getEndPage() {
		// 10, 20, 30, 40, .... 
		
		int endPage = this.getStartPage() + this.pageLimit - 1;
		
		return endPage > this.getMaxPage() ? this.getMaxPage() : endPage;
	}	
	
	/**
	 * 
	 * @return 현재 페이지
	 */ 
	public int getCurrentPage() {
		return this.currentPage;
	}
	
	/**
	 * 
	 * @return 이전 페이지
	 */ 
	public int getPrevPage() {
		int prevPage = this.getCurrentPage() - 1;
		
		return prevPage < 1 ? 1 : prevPage;
	}
	
	/**
	 * 
	 * @return 다음 페이지
	 */ 
	public int getNextPage() {
		int nextPage = this.getCurrentPage() + 1;
		
		return nextPage > this.getMaxPage() ? this.getMaxPage() : nextPage;
	}
	
	/**
	 * 
	 * @return 페이지의 시작 리스트 
	 */ 	
	public int getStartList() {
		return (this.getCurrentPage() - 1) * this.listLimit + 1;
	}
	
	/**
	 * 
	 * @return 페이지의 마지막 리스트
	 */ 	
	public int getEndList() {
		int endList = this.getStartList() + this.listLimit - 1;
		
		return endList > this.listCount ? this.listCount : endList;
	}
	
}

 

 

 

> BoardController.java

@GetMapping("/board/list")
public ModelAndView list(ModelAndView model, 
        @RequestParam(defaultValue = "1") int page) {
    int listCount = 0;
    PageInfo pageInfo = null;
    List<Board> list = null;

    log.info("page number : {}", page);

    listCount = service.getBoardCount();
    pageInfo = new PageInfo(page, 10, listCount, 10);
    list = service.getBoardList(pageInfo);

    model.addObject("pageInfo", pageInfo);
    model.addObject("list", list);
    model.setViewName("board/list");

    return model;
}

 

 

 

-> BoardService 인터페이스 생성

 

 

 

> BoardController.java

package com.kh.mvc.board.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.kh.mvc.board.model.service.BoardService;
import com.kh.mvc.board.model.vo.Board;
import com.kh.mvc.common.util.PageInfo;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class BoardController {
	
	@Autowired
	private BoardService service;

//	@GetMapping("/board/list")
//	public void list() {
//	}
	
	@GetMapping("/board/list")
	public ModelAndView list(ModelAndView model, 
			@RequestParam(defaultValue = "1") int page) {
		int listCount = 0;
		PageInfo pageInfo = null;
		List<Board> list = null;
		
		log.info("page number : {}", page);
		
		listCount = service.getBoardCount();
		pageInfo = new PageInfo(page, 10, listCount, 10);
		list = service.getBoardList(pageInfo);
		
		model.addObject("pageInfo", pageInfo);
		model.addObject("list", list);
		model.setViewName("board/list");
		
		return model;
	}
	
	
}

 

 

 

 

 > BoardService.java

package com.kh.mvc.board.model.service;

import java.util.List;

import com.kh.mvc.board.model.vo.Board;
import com.kh.mvc.common.util.PageInfo;

public interface BoardService {

	int getBoardCount();

	List<Board> getBoardList(PageInfo pageInfo);

}

 

구현체 생성(BoardServiceImpl.java)

 

 

> BoardServiceImpl.java

package com.kh.mvc.board.model.service;

import java.util.List;

import com.kh.mvc.board.model.vo.Board;
import com.kh.mvc.common.util.PageInfo;

@Service
public class BoardServiceImpl implements BoardService {

	@Override
	public int getBoardCount() {
		return 0;
	}

	@Override
	public List<Board> getBoardList(PageInfo pageInfo) {
		return null;
	}

}

-> @Service 어노테이션을 붙여서 Bean으로 등록

 

 

 

쿼리를 수행할 수 있는 객체 (mapper 생성) 만들어주기

> board-mapper.xml

<select id="getBoardCountByFilters" parameterType="map" resultType="_int">
    SELECT COUNT(*) 
    FROM BOARD
    WHERE STATUS = 'Y'
    <if test="list != null">
      AND TYPE IN 
      <foreach collection="list" item="filter" open="(" separator="," close=")">
        #{filter}
      </foreach>
    </if>
</select>

 

 

> BoardServiceImpl.java

package com.kh.mvc.board.model.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kh.mvc.board.model.dao.BoardMapper;
import com.kh.mvc.board.model.vo.Board;
import com.kh.mvc.common.util.PageInfo;

@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper mapper;
	
	// 게시글 갯수 읽어올 때 사용
	@Override
	public int getBoardCount() {
		
		return mapper.getBoardCount();
	}

	@Override
	public List<Board> getBoardList(PageInfo pageInfo) {
		return null;
	}

}

 

BoardMapper mapper;에 대한 에러 없애기 위한 인터페이스(dao) 생성

 

 

 

> BoardMapper.java

package com.kh.mvc.board.model.dao;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface BoardMapper {

	int getBoardCount();

}

인터페이스에 추상메소드 추가한 뒤 @Mapper 어노테이션으로 쿼리문을 불러들일 수 있게 해준다.

 

 

 

> board-mapper.xml

<mapper namespace="com.kh.mvc.board.model.dao.boardMapper">

풀 패키지명이 포함된 namespace작성,

 

 

xml에 mapper를 연결해준 뒤, 호출하고자 하는 쿼리문의 id와 호출하고자 하는 메소드의 이름을 동일하게 맞춰준다.

 

 

 

 

- Board 리스트 가져오기

 

> BoardServiceImpl.java

@Override
public List<Board> getBoardList(PageInfo pageInfo) {
    int offset = (pageInfo.getCurrentPage() - 1) * pageInfo.getListLimit();
    int limit = pageInfo.getListLimit();
    RowBounds rowBounds = new RowBounds(offset, limit);

    return mapper.findAll(rowBounds);
}

 

 

> board-mapper.xml

<select id="findAll" parameterType="map" resultMap="boardListResultMap">
    <include refid="boardListSql"/>
    <choose>
        <when test="writer != null">
            AND M.ID LIKE '%' || #{writer} || '%'
        </when>
        <when test="title != null">
            AND B.TITLE LIKE '%' || #{title} || '%'
        </when>
        <when test="content != null">
            AND B.CONTENT LIKE '%' || #{content} || '%'
        </when>
    </choose>
</select>

 

 

> BoardMapper.java

package com.kh.mvc.board.model.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.RowBounds;

import com.kh.mvc.board.model.vo.Board;

@Mapper
public interface BoardMapper {

	int getBoardCount();

	List<Board> findAll(RowBounds rowBounds);

}

 

 

 

 

- 게시글 사이즈 수정 (사용자가 선택해서 바꿀 수 있게끔)

 

 

> BoardController.java

@GetMapping("/board/list")
public ModelAndView list(ModelAndView model, 
        @RequestParam(defaultValue = "1") int page,
        @RequestParam(defaultValue = "10")int count) {
    PageInfo pageInfo = null;
    List<Board> list = null;

    log.info("page number : {}", page);

    pageInfo = new PageInfo(page, 10, service.getBoardCount(), count);
    list = service.getBoardList(pageInfo);

    model.addObject("pageInfo", pageInfo);
    model.addObject("list", list);
    model.setViewName("board/list");

    return model;
}

-> 주소창을 통해 page, count 수를 조절할 수 있음

 

 

> list.jsp

<button onclick="location.href='${ path }/board/list?page=${ status.current }&count=${ pageInfo.listLimit }'">${ status.current }</button>

-> 변경된 페이지 유지하고자 할 때(값이 변경된 상태) 페이지 정보와 카운트 정보를 같이 넘기면 된다.

-> ex. 10개씩보기, 20개씩보기 등 드롭박스 형식으로 응용가능

-> 검색기능 -> 검색결과 페이징 유지 (키워드, 작성자 등등)

   -> 조건절에 대한 값이 null이 아닌 키워드나 등 원하는 조건을 만들어주면 된다.<when>

 

 

전체 실습 코드

 

> board-mapper.xml

<?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">
  
<mapper namespace="com.kh.mvc.board.model.dao.boardMapper">
	<sql id="boardListSql">
		SELECT  B.NO, 
		        B.TITLE, 
		        M.ID, 
		        B.READCOUNT, 
		        B.ORIGINAL_FILENAME, 
		        B.RENAMED_FILENAME, 
		        B.CONTENT,
		        B.TYPE,
		        B.CREATE_DATE, 
		        B.MODIFY_DATE
		FROM BOARD B
		JOIN MEMBER M ON(B.WRITER_NO = M.NO)
		WHERE B.STATUS = 'Y'
	</sql>

	<resultMap type="Board" id="boardListResultMap">
		<id property="no" column="NO"/>
		<result property="title" column="TITLE"/>
		<result property="writerId" column="ID"/>
		<result property="readCount" column="READCOUNT"/>
		<result property="originalFileName" column="ORIGINAL_FILENAME"/>
		<result property="renamedFileName" column="RENAMED_FILENAME"/>
		<result property="content" column="CONTENT"/>
		<result property="type" column="TYPE"/>
		<result property="createDate" column="CREATE_DATE"/>
		<result property="modifyDate" column="MODIFY_DATE"/>
	</resultMap>
	
	<resultMap type="Reply" id="replyResultMap">
		<id property="no" column="NO"/>
		<result property="boardNo" column="BOARD_NO"/>
		<result property="writerId" column="ID"/>
		<result property="content" column="CONTENT"/>
		<result property="createDate" column="CREATE_DATE"/>
		<result property="modifyDate" column="MODIFY_DATE"/>
	</resultMap>

	<resultMap type="Board" extends="boardListResultMap" id="boardDetailResultMap">
		<collection property="replies" javaType="arraylist" columnPrefix="R_" resultMap="replyResultMap"/>
	</resultMap>
	
	<select id="findAll" parameterType="map" resultMap="boardListResultMap">
		<include refid="boardListSql"/>
		<choose>
			<when test="writer != null">
				AND M.ID LIKE '%' || #{writer} || '%'
			</when>
			<when test="title != null">
				AND B.TITLE LIKE '%' || #{title} || '%'
			</when>
			<when test="content != null">
				AND B.CONTENT LIKE '%' || #{content} || '%'
			</when>
		</choose>
	</select>
	
	<select id="getBoardCount" parameterType="map" resultType="_int">
		SELECT COUNT(*) 
		FROM BOARD
		WHERE STATUS = 'Y'
		<choose>
			<when test="writer != null">
				AND M.ID LIKE '%' || #{writer} || '%'
			</when>
			<when test="title != null">
				AND B.TITLE LIKE '%' || #{title} || '%'
			</when>
			<when test="content != null">
				AND B.CONTENT LIKE '%' || #{content} || '%'
			</when>
		</choose>
	</select>
	
	<select id="selectBoardListByFilters" parameterType="map" resultMap="boardListResultMap">
		<include refid="boardListSql"/>
		<if test="filters != null">
		  AND B.TYPE IN 
		  <foreach collection="filters" item="filter" open="(" separator="," close=")">
	  		#{filter}
		  </foreach>
		</if>
	</select>
	
	<select id="getBoardCountByFilters" parameterType="map" resultType="_int">
		SELECT COUNT(*) 
		FROM BOARD
		WHERE STATUS = 'Y'
		<if test="list != null">
		  AND TYPE IN 
		  <foreach collection="list" item="filter" open="(" separator="," close=")">
	  		#{filter}
		  </foreach>
		</if>
	</select>

	<select id="selectBoardByNo" parameterType="_int" resultMap="boardDetailResultMap">
		SELECT B.NO,
		       B.TITLE,
		       M.ID,
		       B.READCOUNT,
		       B.ORIGINAL_FILENAME,
		       B.RENAMED_FILENAME,
		       B.CONTENT,
		       B.TYPE,
		       B.CREATE_DATE, 
		       B.MODIFY_DATE,
		       R.NO AS R_NO, 
		       R.BOARD_NO AS R_BOARD_NO, 
		       R.CONTENT AS R_CONTENT, 
		       M2.ID AS R_ID, 
		       R.CREATE_DATE AS R_CREATE_DATE, 
		       R.MODIFY_DATE AS R_MODIFY_DATE
		FROM BOARD B
		JOIN MEMBER M ON(B.WRITER_NO = M.NO)
		LEFT OUTER JOIN REPLY R ON(B.NO = R.BOARD_NO)
		LEFT OUTER JOIN MEMBER M2 ON(R.WRITER_NO = M2.NO)
		WHERE B.STATUS = 'Y' AND B.NO = #{no}
	</select>
	
	<insert id="insertBoard" parameterType="Board"
			useGeneratedKeys="true" keyProperty="no" keyColumn="NO">
		INSERT INTO BOARD (
			NO,
			WRITER_NO,
			TITLE,
			CONTENT,
			ORIGINAL_FILENAME,
			RENAMED_FILENAME,
			READCOUNT,
			STATUS,
			TYPE,
			CREATE_DATE,
			MODIFY_DATE
		) VALUES (
			SEQ_BOARD_NO.NEXTVAL,
			#{writerNo},
			#{title},
			#{content},
			#{originalFileName},
			#{renamedFileName},
			DEFAULT,
			DEFAULT,
			DEFAULT,
			DEFAULT,
			DEFAULT
		)
	</insert>
	
	<update id="updateBoard" parameterType="Board">
       	UPDATE BOARD
       	<trim prefix="SET" suffixOverrides=",">
    	    <if test="title != null">
		 		TITLE = #{title},
	 		</if>
	 		<if test="content != null">
		 		CONTENT = #{content},
	 		</if>
	 		<if test="originalFileName != null">
		 		ORIGINAL_FILENAME = #{originalFileName},
	 		</if>
	 		<if test="renamedFileName != null">
		 		RENAMED_FILENAME = #{renamedFileName},
	 		</if>
		 	MODIFY_DATE = SYSDATE 
       	</trim>
	 	WHERE 
	 		NO = #{no}
	</update>
	
	<update id="updateStatus" parameterType="map">
		UPDATE BOARD SET STATUS = #{status} WHERE NO = #{no}
	</update>
</mapper>

 

 

 

> list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

<c:set var="path" value="${ pageContext.request.contextPath }"/>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>게시판 </h2>
<div id="board-list-container">
	<c:if test="${ !empty loginMember }">
		<button type="button" id="btn-add"
			onclick="location.href='${ path }/board/write'">글쓰기</button>	
	</c:if>

	<table id="tbl-board">
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>첨부파일</th>
			<th>조회수</th>
		</tr>
		<c:if test="${ empty list }">			
			<tr>
				<td colspan="6">
					조회된 게시글이 없습니다.
				</td>
			</tr>	
		</c:if>
		<c:if test="${ !empty list }">
			<c:forEach var="board" items="${ list }">
				<tr>
					<td>${ board.rowNum }</td>
					<td>
						<a href="${ path }/board/view?no=${ board.no }">
							${ board.title }
						</a>
					</td>
					<td>${ board.writerId }</td>
					<!-- <td><fmt:formatDate type="date" value="${ board.createDate }"/></td> -->
					<td><fmt:formatDate pattern="yyyy-mm-dd" value="${ board.createDate }"/></td>
					<td>
						<c:if test="${ empty board.originalFileName }">
							<span> - </span>
						</c:if>
						<c:if test="${ !empty board.originalFileName }">
							<img src="${ path }/resources/images/file.png" width="20" height="20"/>
						</c:if>
					</td>
					<td>${ board.readCount }</td>
				</tr>
			</c:forEach>

		</c:if>			
	</table>
	<div id="pageBar">
		<!-- 맨 처음으로 -->
		<button onclick="location.href='${ path }/board/list?page=1'">&lt;&lt;</button>

		<!-- 이전 페이지로 -->
		<button onclick="location.href='${ path }/board/list?page=${ pageInfo.prevPage }'">&lt;</button>

		<!--  10개 페이지 목록 -->
		<c:forEach begin="${ pageInfo.startPage }" end="${ pageInfo.endPage }" varStatus="status">
			<c:if test="${ status.current == pageInfo.currentPage }">				
				<button disabled>${ status.current }</button>
			</c:if>
			
			<c:if test="${ status.current != pageInfo.currentPage }">				
				<button onclick="location.href='${ path }/board/list?page=${ status.current }&count=${ pageInfo.listLimit }'">${ status.current }</button>
			</c:if>
		</c:forEach>

		<!-- 다음 페이지로 -->
		<button onclick="location.href='${ path }/board/list?page=${ pageInfo.nextPage }'">&gt;</button>

		<!-- 맨 끝으로 -->
		<button onclick="location.href='${ path }/board/list?page=${ pageInfo.maxPage }'">&gt;&gt;</button>
	</div>
</div>
</body>
</html>

 

 

 

 

> BoardMapper.java

package com.kh.mvc.board.model.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.RowBounds;

import com.kh.mvc.board.model.vo.Board;

@Mapper
public interface BoardMapper {

	int getBoardCount();

	List<Board> findAll(RowBounds rowBounds);

}

 

 

 

> BoardServiceImpl.java

package com.kh.mvc.board.model.service;

import java.util.List;

import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.kh.mvc.board.model.dao.BoardMapper;
import com.kh.mvc.board.model.vo.Board;
import com.kh.mvc.common.util.PageInfo;

@Service
public class BoardServiceImpl implements BoardService {

	@Autowired
	private BoardMapper mapper;
	
	// 게시글 갯수 읽어올 때 사용
	@Override
	public int getBoardCount() {
		
		return mapper.getBoardCount();
	}

	@Override
	public List<Board> getBoardList(PageInfo pageInfo) {
		int offset = (pageInfo.getCurrentPage() - 1) * pageInfo.getListLimit();
		int limit = pageInfo.getListLimit();
		RowBounds rowBounds = new RowBounds(offset, limit);

		return mapper.findAll(rowBounds);
	}

}

 

 

 

 

> BoardController.java

package com.kh.mvc.board.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.kh.mvc.board.model.service.BoardService;
import com.kh.mvc.board.model.vo.Board;
import com.kh.mvc.common.util.PageInfo;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class BoardController {
	
	@Autowired
	private BoardService service;

//	@GetMapping("/board/list")
//	public void list() {
//	}
	
	@GetMapping("/board/list")
	public ModelAndView list(ModelAndView model, 
			@RequestParam(defaultValue = "1") int page,
			@RequestParam(defaultValue = "10")int count) {
		PageInfo pageInfo = null;
		List<Board> list = null;
		
		log.info("page number : {}", page);
		
		pageInfo = new PageInfo(page, 10, service.getBoardCount(), count);
		list = service.getBoardList(pageInfo);
		
		model.addObject("pageInfo", pageInfo);
		model.addObject("list", list);
		model.setViewName("board/list");
		
		return model;
	}
	
	
}

 

 

 

> BoardMapper.java

package com.kh.mvc.board.model.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.RowBounds;

import com.kh.mvc.board.model.vo.Board;

@Mapper
public interface BoardMapper {

	int getBoardCount();

	List<Board> findAll(RowBounds rowBounds);

}

 

 

 

 

반응형
Comments