24.01.01

서린·2024년 1월 1일

혼자개발

목록 보기
6/82

후기 페이징 추가 하기

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">&lt;&lt; 이전</a>
		</c:if>	
		<c:if test="${nextId ne 0}">
			<a href="/mountain/mountain-review-view?nextId=${nextId}">다음 &gt;&gt;</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

0개의 댓글