[Springboot] ๋Œ“๊ธ€ ๊ฒŒ์‹œํŒ #2 (ํŽ˜์ด์ง•)

728x90

๐Ÿ”” TODO :  ํŽ˜์ด์ง• , ๊ฒŒ์‹œ๊ธ€  AJax์ˆ˜์ •, ์‚ญ์ œ  

๐Ÿ“˜ project : ์ธํ…”๋ฆฌ์ œ์ด - SpringBootMybatisMini

github : https://github.com/Hyeonqz/SpringBootMybatisMini


 

์Šคํ”„๋ง๋ถ€ํŠธ ๋™์ž‘๊ด€์ • ๊ฐ„๋‹จ
  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ JSP ํŽ˜์ด์ง€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. JSP ํŽ˜์ด์ง€์—์„œ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ์„ ๋ฐ›๊ณ  ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์„œ๋น„์Šค๋กœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  5. ์„œ๋น„์Šค๋Š” ํ•„์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  6. ์„œ๋น„์Šค๊ฐ€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๋ฉด, ๊ฒฐ๊ณผ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  7. ์ปจํŠธ๋กค๋Ÿฌ๋Š” JSP ํŽ˜์ด์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  8. JSP ํŽ˜์ด์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์  ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ›„ ๋ฐ˜ํ™˜๋˜๋Š” ๊ณณ์€  ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.

 

 

ํŽ˜์ด์ง•์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

1) mapper 

    <select id="getList" parameterType="HashMap" resultType="MemboardDto">
        select * from memboard order by num desc limit #{start},#{perpage}
    </select>
  • mysql -> limit ๋ฅผ ์•Œ์•„์•ผ์ง€ ํŽ˜์ด์ง•์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • limit๋Š” (begin, end)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ (์‹œ์ž‘ํŽ˜์ด์ง€๋ถ€ํ„ฐ, ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€) ์ฆ‰ ๋‚ด๊ฐ€ ์„ค์ •ํ•ด๋‘” ์‹œ์ž‘ํŽ˜์ด์ง€๋ถ€ํ„ฐ ๋‚ด๊ฐ€์„ค์ •ํ•ด๋‘” ๋งˆ์ง€๋ง‰ํŽ˜์ด์ง€ ๊นŒ์ง€ ์ œํ•œ ํ•œ๋‹ค๋Š” ๋œป ์ž…๋‹ˆ๋‹ค. 

 

 

2) service

	@Override
	public List<MemBoardDto> getList(int start, int perpage) {
		HashMap<String,Integer> map = new HashMap<>();
		map.put("start",start);
		map.put("perpage",perpage);

		return memBoardMapperInter.getList(map);
	}
  • ํŽ˜์ด์ง•์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Map ์ปฌ๋ ‰์…˜์— start, perpage๋ฅผ ๋‹ด์•„์„œ dto๊ฐ’ , map์„ list์— ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค 

 

3) controller 

	@GetMapping("/list")
	public ModelAndView goreboard(
		@RequestParam(value="currentPage",defaultValue = "1") int currentPage) {
		ModelAndView mv= new ModelAndView();

		int totalCount = memboardService.getTotalCount();

		//ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ํ•„์š”ํ•œ ๋ณ€์ˆ˜ ์„ ์–ธ
		int totalPage; //์ด ํŽ˜์ด์ง€์ˆ˜
		int startPage; //๊ฐ๋ธ”๋Ÿญ์—์„œ ๋ณด์—ฌ์งˆ ์‹œ์ž‘ํŽ˜์ด์ง€
		int endPage; //๊ฐ๋ธ”๋Ÿญ์—์„œ ๋ณด์—ฌ์งˆ ๋ํŽ˜์ด์ง€
		int startNum; //db์—์„œ ๊ฐ€์ ธ์˜ฌ ๊ธ€์˜ ์‹œ์ž‘๋ฒˆํ˜ธ(mysql์€ ์ฒซ๊ธ€์ด 0,์˜ค๋ผํด์€ 1)
		int perPage=10; //ํ•œํŽ˜์ด์ง€๋‹น ๋ณด์—ฌ์งˆ ๊ธ€์˜ ๊ฐฏ์ˆ˜
		int perBlock=5; //ํ•œ๋ธ”๋Ÿญ๋‹น ๋ณด์—ฌ์งˆ ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜

		//ํ˜„์žฌํŽ˜์ด์ง€ ์ฝ๊ธฐ(๋‹จ null์ผ๊ฒฝ์šฐ๋Š” 1ํŽ˜์ด๋กœ ์ค€๋‹ค)๊ณ„์‚ฐ์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ int๋กœ ํ˜•๋ณ€ํ™˜ํ•ด์คŒ
		//if(("currentPage")==null)
		//	currentPage=1;
		//else
		//currentPage=Integer.parseInt(("currentPage"));

		//์ดํŽ˜์ด์ง€์ˆ˜ ๊ตฌํ•˜๊ธฐ
		//์ด๊ธ€์˜ ๊ฐฏ์ˆ˜/ํ•œํŽ˜์ด์ง€๋‹น ๋ณด์—ฌ์งˆ ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆ”(7/5=1)
		//๋‚˜๋จธ์ง€๊ฐ€ 1์ด๋ผ๋„ ์žˆ์œผ๋ฉด ๋ฌด์กฐ๊ฑด 1ํŽ˜์ด์ง€ ์ถ”๊ฐ€(1+1=2ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”)
		totalPage=totalCount/perPage+(totalCount%perPage==0?0:1);

		//๊ฐ๋ธ”๋Ÿญ๋‹น ๋ณด์—ฌ์•ผํ•  ์‹œ์ž‘ํŽ˜์ด์ง€
		//perBlock=5์ผ๊ฒฝ์šฐ๋Š” ํ˜„์žฌํŽ˜์ด์ง€ 1~5 ์‹œ์ž‘:1 ๋:5
		//ํ˜„์žฌํŽ˜์ด์ง€ 13  ์‹œ์ž‘:11  ๋:15
		startPage=(currentPage-1)/perBlock*perBlock+1;

		endPage=startPage+perBlock-1;

		// ์ดํŽ˜์ด์ง€๊ฐ€ 23์ผ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰๋ธ”๋Ÿญ์€ 25๊ฐ€์•„๋‹ˆ๋ผ 23์ด๋‹ค
		if(endPage>totalPage)
			endPage=totalPage;

		//๊ฐํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์งˆ ์‹œ์ž‘๋ฒˆํ˜ธ
		//1ํŽ˜์ด์ง€: 0,2ํŽ˜์ด์ง€:5 3ํŽ˜์ด์ง€:10....
		startNum=(currentPage-1)*perPage;

		//๊ฐ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๊ฒŒ์‹œ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ == ๋ณด์—ฌ์งˆ ๊ธ€๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
		//๊ฐํŽ˜์ด์ง€๋‹น ์ถœ๋ ฅํ•  ์‹œ์ž‘๋ฒˆํ˜ธ ๊ตฌํ•˜๊ธฐ no
		//์ด๊ธ€๊ฐœ์ˆ˜๊ฐ€ 23์ด๋ฉด 1ํŽ˜์ด์ง€ 23,2ํŽ˜์ด์ง€๋Š” 18,3ํŽ˜์ด์ง€ 13.....
		//์ถœ๋ ฅ์‹œ 1์”ฉ ๊ฐ์†Œํ•˜๋ฉฐ ์ถœ๋ ฅ
		List<MemBoardDto> list = memboardService.getList(startNum, perPage);

		//list์˜ ๊ฐ ๊ธ€์— ๋Œ“๊ธ€ ๊ฐœ์ˆ˜ ํ‘œ์‹œ๋ฅผ ํ•ด์•ผํ•จ
		/*for(MemBoardDto m:list) {
			m.setAcount(adao.getAnswerList(d.getNum()).size());
		}*/

		//๊ฐ ํŽ˜์ด์ง€์— ์ถœ๋ ฅํ•  ์‹œ์ž‘๋ฒˆํ˜ธ
		int no = totalCount-(currentPage-1)*perPage;

		mv.addObject("totalCount",totalCount);
		mv.addObject("list",list);
		mv.addObject("startPage",startPage);
		mv.addObject("totalPage",totalPage);
		mv.addObject("endPage",endPage);
		mv.addObject("no",no);
		mv.addObject("currentPage",currentPage);

		mv.setViewName("/memboard/memlist");

		return mv;
	}
  • form ์— ๋ณด๋‚ผ ๋•Œ, ๋ณด๋‚ด์ค„ ๊ฐ’์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ModelandView๋ฅผ ๋ฆฌํ„ดํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ ๋ณด๋‚ด์ค€๋‹ค.
  • totalCount๋Š” ๋ชจ๋“  dto๋“ค์„ list๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑํ•œ ๋ณ€์ˆ˜ ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค์„ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด์ค๋‹ˆ๋‹ค
    • ์ž์„ธํ•œ ์„ค๋ช…๋“ค์€ ์ฝ”๋“œ์— ์ฃผ์„์œผ๋กœ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ addObject ๋ฉ”์†Œ๋“œ ์•ˆ์—์žˆ๋Š” key๊ฐ’๋“ค์€ jspํŒŒ์ผ์—์„œ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

4) form ์ž‘์„ฑ

<%@ 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" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
  <link href="https://fonts.googleapis.com/css2?family=VT323&display=swap" rel="stylesheet">
  <script src="https://code.jquery.com/jquery-3.7.0.js"></script>
  <title>ํšŒ์› ๊ฒŒ์‹œํŒ</title>
</head>
<body>
<div style="width: 1150px;">
<c:if test="${sessionScope.loginok != null}">
<button type="button" class="btn btn-outline-info" onclick="location.href='form'" style="width:100px;">๊ธ€์“ฐ๊ธฐ</button>
</c:if>
<br><br>
<table class="table table-bordered">
  <tr class="table-secondary" align="center">
    <th width="60">๋ฒˆํ˜ธ</th>
    <th width="60">์ œ๋ชฉ</th>
    <th width="60">์ž‘์„ฑ์ž</th>
    <th width="60">์กฐํšŒ์ˆ˜</th>
    <th width="60">๋“ฑ๋ก์ผ</th>
  </tr>

  <c:if test="${totalCount==0}">
    <tr>
      <td>๋“ฑ๋ก๋œ ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.</td>
    </tr>
  </c:if>


  <c:if test="${totalCount>0 }">
    <c:forEach var="dto" items="${list }" varStatus="i">
      <tr>
        <td align="center">${no }</td>
        <c:set var="no" value="${no-1 }"/> <!-- ์ถœ๋ ฅ ํ›„ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ  -->
        <td> <!-- ์ œ๋ชฉ -->

          <!-- ์ œ๋ชฉ.. ์—ฌ๊ธฐ ๋ˆ„๋ฅด๋ฉด ๋‚ด์šฉ ๋ณด๊ธฐ๋กœ -->
          <a href="content?num=${dto.num }&currentPage=${currentPage}">${dto.subject }</a>

          <!-- ์‚ฌ์ง„์ด ์žˆ์„ ๊ฒฝ์šฐ ์•„์ด์ฝ˜ ํ‘œ์‹œ -->
          <c:if test="${dto.uploadfile != 'no' }">
            <i class="bi bi-image"></i>
          </c:if>
        </td>

        <td><fmt:formatDate value="${dto.writeday }" pattern="yyyy-MM-dd"/></td>
        <td align="center">${dto.readcount }</td>
      </tr>
    </c:forEach>
  </c:if>
</table>

  <!-- ํŽ˜์ด์ง€๋ฒˆํ˜ธ ์ถœ๋ ฅ -->


  <!-- ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ์ถœ๋ ฅ -->
  <div>
    <!-- ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ์ถœ๋ ฅ -->
    <c:if test="${totalCount>0 }">
      <div style="width: 800px; text-align: center">
        <ul class="pagination justify-content-center">
          <!-- ์ด์ „ -->
          <c:if test="${startPage>1 }">
            <li class="page-item"><a class="page-link" href="list?currentPage=${startPage-1 }">์ด์ „</a></li>
          </c:if>

          <c:forEach var="pp" begin="${startPage }" end="${endPage }">
            <c:if test="${currentPage==pp }">
              <li class="page-item active"><a class="page-link"
                                              href="list?currentPage=${pp }">${pp }</a></li>
            </c:if>
            <c:if test="${currentPage!=pp }">
              <li class="page-item"><a class="page-link" href="list?currentPage=${pp }">${pp }</a></li>
            </c:if>
          </c:forEach>

          <!-- ๋‹ค์Œ -->
          <c:if test="${endPage<totalPage }">
            <li class="page-item"><a class="page-link"
                                     href="list?currentPage=${endPage+1 }">๋‹ค์Œ</a></li>
          </c:if>

        </ul>
      </div>
    </c:if>
  </div>

</div>

</table>
</div>
</body>
</html>

 

  • totalCount -> ์ฆ‰ ๊ธ€์˜ ๊ฐœ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด, ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ผ๊ณ  ๋œจ๊ณ , totalCount 1 ์ด์ƒ์žˆ์œผ๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜์—ดํ•œ๋‹ค.
  • JSTL ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, c:for each๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ list๋ฅผ ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.

 

์ง€์  ๊ฐ์‚ฌํ•˜๊ฒŒ ๋ฐ›๊ฒ ์Šต๋‹ˆ๋‹ค

728x90