[spring 팀프로젝트] - 웹사이트 제작 8. 이용 후기(게시판) -(1)목록( +페이징 처리)

JINI·2022년 12월 8일
0
post-thumbnail

이용후기 게시판은 글번호, 제목, 작성자, 작성일, 조회수를 보여주고 페이징 처리로 한 페이지에 글 10개씩 보여진다.
최신 작성일이 상단에 오도록 정렬했고 제목을 클릭하면 상세 게시글을 볼 수 있다.

❗조회수 증가는 나중에 포스팅할 예정이다.


✂️게시판

✂️페이징 처리


🧩게시판 목록


1. 페이징 처리로 글 10개씩 보이기
2. 최신 작성일 기준으로 상단 정렬


📕dto

	private int reviewNum;
	private String title;
	private String content;
	private String regDate;
	private int hitNum;
	private String writer;
    
    public void setRegDate(java.sql.Timestamp regDate) {
		SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
		this.regDate = format.format(regDate);
	}

게시판에 필요한 dto(글 번호, 제목,내용, 작성일, 조회수, 작성자)를 만들었다.

작성일은 SimpleDateFormat을 이용해서 날짜 출력 포맷을 변경해준다.


📕sql

box_board add constraint fk_mem foreign key(writer) references box_member(buser_id) on delete cascade;

회원이 삭제되면 해당 회원이 작성한 게시글도 삭제되도록 제약 조건을 sql에 추가해준다.


🎨jsp

<table class="board-table">
	<tr>
		<th scope="col" class="th-num">번호</th>
		<th scope="col" class="th-title">제목</th>
		<th scope="col" class="th-writer">글쓴이</th>
		<th scope="col" class="th-date">작성날짜</th>
		<th scope="col" class="th-view">조회수</th>
	</tr>
	<c:forEach items="${boardList}" var="dto">
		<tr>
		<td>${dto.reviewNum }</td>
		<th><a href="${contextPath }/board/reviewDetail?reviewNum=${dto.reviewNum}">${dto.title }</a></th>
			<td>${dto.writer }</td>
			<td>${dto.regDate }</td>
			<td>${dto.hitNum }</td>
		</tr>
	</c:forEach>
</table>

<div class="paging">
	<c:forEach var="num" begin="1" end="${repeat }">
		<a href="review?num=${num }">${num }</a>
	</c:forEach>
</div>

게시판 목록에 필요한 항목들을 <tr><th>에 적어주고 c:forEach문으로 게시글이 반복되도록한다.

dto에서 글번호, 작성자, 작성일, 조회수를 불러오고 제목은 링크를 달아서 클릭하면 상세글로 이동한다.

하단에 페이징 처리를 위한 코드를 작성해준다. 페이지는 1부터 시작하고 계속해서 늘어나기 때문에 반복문을 이용했다.


📕Controller

@GetMapping("review")
	public String review(Model model,@RequestParam(required = false, defaultValue = "1")int num){
		bs.boardList(model,num);
		return "board/review";			
	}

db에 저장된 모든 값을 가져오는데 값이 없다면 default값으로 1을 준다.
페이징을 위해 int형 변수 num을 service로 보내고 게시판 목록페이지를 보여준다.


📕Service/serviceImpl

public void boardList(Model model,int num);
public void boardList( Model model,int num) {//db로 요청
		int pageLetter = 10;//한 페이지에 10개씩
		int allCount = mapper.selectPageCount(); //총 글에 대한 갯수 얻어오기
		int repeat = allCount / pageLetter;//총 페이지수 구하기
		if(allCount % pageLetter != 0) {
			repeat += 1;
		}
		int end = num * pageLetter;
		int start = end + 1 -pageLetter;

		model.addAttribute("repeat", repeat);
		model.addAttribute("boardList", mapper.boardList(start,end));
	}

한 페이지에 글 10개씩 보여지도록 코드를 작성한다.
처음 페이지와 끝 페이지를 지정하고 반복되는 저장값을 model에 넣어 보여주고 시작/끝이 출력될 목록을 mapper로 보낸다.


📕mapper.java

public List<boardDTO> boardList(@Param("s") int start, @Param("e") int end);

게시판 dto를 List형식으로 받아주고 2개이상의 값(처음/끝 페이지)을 넘기기 위해 @Param을 사용해준다.


📕mapper.xml

❗메핑 작업은 생략했다.

✔️페이징이 없는 쿼리문

<select id="boardList" resultMap="board"> select * from box_board </select>

페이징 처리를 하지 않는 경우는 db를 리스트로 가져오면 되기 때문에 쿼리문은 단순하다.


✔️ 페이징 처리로 변경된 쿼리문 (서브쿼리문사용)

<select id="boardList" resultMap="board">
	select B.* from(select rownum
	rn, A.* from
	(select * from box_board order by list_num desc)A)B where rn between #{s} and #{e}
</select>

서브 쿼리문은 안쪽 부터 읽어준다.

select B. from (select rownum rn, A. from
(select * from box_board order by list_num desc)A )B
where rn between #{s} and #{e}

글 번호를 내림차순으로 정렬한 모든 값을 가져오고 그 값을 A라고 칭한다.

rownum을 rn 별칭, A에 대한 모든값을 표현하는데 이것을 B라고 칭한다.

B의 모든 값 중에서 rn에 대해 s와 e사이에 있는 값을 가지고온다.


profile
꾸준히 성장하는 개발자

0개의 댓글