후기 페이징 추가 하기
MountainController.java
@GetMapping("/mountain-review-view")
public String mountainReviewView(
@RequestParam("mtId") int mtId,
@RequestParam(value = "prevId", required = false) Integer prevIdParam,
@RequestParam(value = "nextId", required = false) Integer nextIdParam,
Model model,
HttpSession session) {
// 로그인 여부 조회
Integer userId = (Integer)session.getAttribute("userId");
if (userId == null) {
// 비로그인이면 로그인 화면으로 이동
return "redirect:/user/sign-in-view";
}
Mountain mountain = mountainBO.getMountainById(mtId);
Bookmark bookmark = bookmarkBO.getBookmarkByMtIdUserId(mtId, userId);
List<Review> reviewList = reviewBO.getReviewListByMtId(mtId, prevIdParam, nextIdParam);
int nextId = 0;
int prevId = 0;
if (reviewList.isEmpty() == false) {
//reviewList가 비어있을 때 오류를 방지하기 위함 []
nextId = reviewList.get(reviewList.size() - 1).getId(); //가져온 리스트의 가장 끝 값(작은 id)
prevId = reviewList.get(0).getId();
//이전 방향의 끝인가?
//prevId와 Review테이블의 가장 큰 id값이 같다면 이전 페이지가 없다는 뜻
if (reviewBO.isPrevLastPageByUserId(prevId, userId)) {
prevId = 0;
}
//다음 방향의 끝인가?
//nextId와 Review테이블의 가장 작은 id값이 같면 다음 페이지가 없다는 뜻
if (reviewBO.isNextLastPageByUserId(nextId, userId)) {
nextId = 0;
}
}
model.addAttribute("mtId", mtId);
model.addAttribute("bookmark", bookmark);
model.addAttribute("mountain", mountain);
model.addAttribute("prevId", prevId);
model.addAttribute("nextId", nextId);
model.addAttribute("reviewList", reviewList);
model.addAttribute("viewName", "mountain/mountain");
return "template/layout";
}
ReviewBO.java
//리뷰 리스트
//input: mtId, userId
//output: List<Review>
public List<Review> getReviewListByMtId(int mtId, Integer prevId, Integer nextId) {
String direction = null; //방향
Integer standardId = null; // 기준 reviewId
if (prevId != null) { //이전
direction = "prev";
standardId = prevId;
List<Review> reviewList = reviewMapper.selectReviewListByMtId(mtId, direction, standardId, POST_MAX_SIZE);
//reverse 5 6 7 -> 7 6 5
Collections.reverse(reviewList); //뒤집고 저장
return reviewList;
} else if (nextId != null) { //다음
direction = "next";
standardId = nextId;
}
return reviewMapper.selectReviewListByMtId(mtId, direction, standardId, POST_MAX_SIZE);
}
//이전 페이지의 마지막인가?
public boolean isPrevLastPageByUserId(int prevId, int userId) {
int reviewId = reviewMapper.selectReviewIdByUserIdAndSort(userId, "DESC");
return reviewId == prevId; //같으면 끝 true, 아니면 false
}
//다음 페이지의 마지막인가
public boolean isNextLastPageByUserId(int nextId, int userId) {
int reviewId = reviewMapper.selectReviewIdByUserIdAndSort(userId, "ASC");
return reviewId == nextId; //같으면 끝 true, 아니면 false
}
ReviewMapper.java
//리뷰 리스트
public List<Review> selectReviewListByMtId(
@Param("mtId") int mtId,
@Param("direction") String direction,
@Param("standardId") Integer standardId,
@Param("limit") int limit);
//이전끝 다음 끝 없애기 설정
public int selectReviewIdByUserIdAndSort(
@Param("userId") int userId,
@Param("sort") String sort);
reviewMapper.xml
<select id="selectReviewListByMtId" parameterType="int" resultType="com.project.review.domain.Review">
SELECT
`id`
, `mtId`
, `userId`
, `content`
, `imagePath`
, `view`
, `createdAt`
, `updatedAt`
FROM
`review`
WHERE
`mtId` = #{mtId}
<if test="direction == 'next'">
<![CDATA[
AND `id` < #{standardId}
]]>
ORDER BY `id` DESC
</if>
<if test="direction == 'prev'">
<![CDATA[
AND `id` > #{standardId}
]]>
ORDER BY `id` ASC
</if>
<if test="direction == null">
ORDER BY `id` DESC
</if>
LIMIT ${limit}
</select>
<select id="selectReviewIdByUserIdAndSort" parameterType="map" resultType="int">
SELECT
`id`
FROM
`review`
WHERE
`userId` = #{userId}
ORDER BY `id` ${sort}
LIMIT 1
</select>
mountain.jsp
<%--paging --%>
<div class="text-center">
<c:if test="${prevId ne 0}">
<a href="/mountain/mountain-review-view?prevId=${prevId}" class="mr-5"><< 이전</a>
</c:if>
<c:if test="${nextId ne 0}">
<a href="/mountain/mountain-review-view?nextId=${nextId}">다음 >></a>
</c:if>
</div>
이렇게 작성 했는데 에러발생
There was an unexpected error (type=Bad Request, status=400).
Required request parameter 'mtId' for method parameter type int is not present
org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'mtId' for method parameter type int is not present