Spring-MyBatis-게시판 만들기(댓글)

S.Sun·2024년 4월 15일

스프링

목록 보기
9/17

질문내용

  1. 게시판을 스프링+마이바티스 기반으로 짜시오.
  • 댓글 까지 완성
  1. 게시판 페이징을 예습하시오.

개인작성

  1. 댓글 관련 부분만 따로 확인해보자.
  • Mapper.xml 내부에 들어가는 댓글 관련 내용
	<!-- 댓글 입력 -->
	<insert id="insertReply" parameterType="BoardVo">
	    <![CDATA[
        	insert into mvc_board (bid, bname, btitle, bcontent, bdate, bgroup, bstep, bindent) 
			values 
			(mvc_board_seq.nextval,#{bname},#{btitle},#{bcontent},sysdate,#{bgroup},#{bstep}+1,#{bindent}+1)
        ]]>
	</insert>
  	<!-- 기존에 작성되어 있는 댓글들의 bstep을 수정하는 작업 -->
	<update id="updateShape" parameterType="BoardVo">
		<![CDATA[
        	update mvc_board set bstep = bstep + 1 where bgroup = #{bgroup} and bstep > #{bstep}
        ]]>	
	</update>
  • BoardService를 구현하는 BoardServiceImpl 클래스의 댓글 구현내용
    - 기존에 가지고 있는 답글들의 bstep을 더하는 작업 먼저 진행하기.
    - 신규 답글 추가하기.
	// 댓글 관련	
	@Override
	public void writeReply(BoardVo boardVo) {
		log.info("writeReply()..");
		boardMapper.updateShape(boardVo);
		boardMapper.insertReply(boardVo);
	}
  • BoardController에서 댓글을 구현하는 내용
	//댓글 관련
	
	@GetMapping("/reply_view")
	public String replyView(BoardVo boardVo, Model model) {
		log.info("replyView()..");
		model.addAttribute("reply_view", boardService.showContent(boardVo.getBid()));
		return "/board/reply_view";
	}
	
	@PostMapping("/reply")
	public String reply(BoardVo boardVo) {
		log.info("reply()..");
		boardService.writeReply(boardVo);
		return "redirect:/board/list";
	}
  • reply_view.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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>${reply_view.bid}번 글에 댓글 쓰기</h1>
	<form action="${pageContext.request.contextPath}/board/reply" method="post">
		<input type="hidden" name="bid" value="${reply_view.bid}">
		<input type="hidden" name="bgroup" value="${reply_view.bgroup}">
		<input type="hidden" name="bstep" value="${reply_view.bstep}">
		<input type="hidden" name="bindent" value="${reply_view.bindent}">	
		<table border="1" style="width: 500; background-color: gray;">
			<tr>
				<td style="background-color: pink">글번호</td>
				<td style="background-color: white">${reply_view.bid}</td>
			<tr>
				<td style="background-color: pink">조회수</td>
				<td style="background-color: white">
                	<input type="text" name="bhit" size="50" value="${reply_view.bhit}" readonly="readonly">
                </td>
			</tr>
			<tr>
				<td style="background-color: pink">이름</td>
				<td style="background-color: white">
                	<input type="text" name="bname" size="50" value="${reply_view.bname}">
                </td>
			</tr>			
			<tr>
				<td style="background-color: pink">제목</td>
				<td style="background-color: white">
                	<input type="text" name="btitle" size="50" value="${reply_view.btitle}">
                    </td>
			</tr>
			<tr>
				<td style="background-color: pink">내용</td>
				<td style="background-color: white">
                	<textarea name="bcontent" rows="10">${reply_view.bcontent}
				---[답변내용]---</textarea>
                </td>
			</tr>
			<tr>
				<td style="background-color: pink" colspan="2">
                	<input type="submit" value="답변">
                &nbsp;&nbsp;
                	<a href="${pageContext.request.contextPath}/board/list">목록보기</a>
                </td>
			</tr>
		</table>
	</form>
</body>
</html>

페이징

  • 대량의 데이터를 일정한 크기로 나누어 화면에 출력하는 기술
  • 한 번에 많은 양의 데이터를 한꺼번에 표시하기보다는 페이지 단위로 나누어 표시하는 것이 사용자 경험을 향상시키고 페이지 로딩 속도를 향상시킬 수 있음.

페이징에서 활용하기 위해 설정하게 되는 것들

  • 페이지 번호
    - 현재 사용자가 보고 있는 페이지의 번호.
    - 사용자가 페이지를 이동할 때마다 업데이트됨.
  • 페이지당 항목 수
    - 한 페이지에 표시되는 항목의 수.
    - 페이지를 나눌 때 사용됨.
    - 사용자가 한 번에 볼 수 있는 항목의 수를 결정.
  • 전체 항목 수
    - 전체 항목의 수.
    - 데이터베이스 또는 다른 소스에서 가져온 전체 항목 수.
  • 전체 페이지 수
    - 전체 항목 수를 기반으로 계산됨
    - 총 몇 페이지로 나눌 수 있는지를 나타냄.
  • 시작 번호
    - 현재 페이지의 첫 번째 항목 번호.
  • 끝 번호
    - 현재 페이지의 마지막 항목 번호.

알아야 하는 SQL 문

 SELECT * FROM (
            SELECT ROW_NUMBER() OVER (ORDER BY board_id DESC) AS rownum, * FROM board
        ) WHERE rownum BETWEEN #{startRow} AND #{startRow + pageSize - 1}    

SQL 해설

ROW_NUMBER() OVER (ORDER BY board_id DESC) AS rownum
  • ROW_NUMBER() 함수를 사용하여 각 행에 번호를 지정하는 것.
(SELECT ROW_NUMBER() OVER (ORDER BY board_id DESC) AS rownum, * FROM board)
  • 이 부분은 서브쿼리(subquery)이다.
  • board 테이블의 각 행에 번호를 지정한 결과를 반환. 이때 번호는 rownum이라는 이름으로 지정됨.
WHERE rownum BETWEEN #{startRow} AND #{startRow + pageSize - 1}
  • 이 부분은 서브쿼리의 결과 중에서 rownum이 startRow부터 startRow + pageSize - 1 사이인 행만 선택하는 것을 의미.
  • 이를 통해 원하는 페이지의 데이터를 선택할 수 있음

해당 부분까지 찾아보고 나서, 추가로 참조하려고 찾아놓은 다른 사이트 링크

profile
두리둥둥

0개의 댓글