Spring 게시판 목록

밍드라이브·2023년 8월 21일
0

Spring

목록 보기
4/6
post-thumbnail

오늘은 게시글 목록조회 하는 법을 배웠다 ㅎㅎ
컨트롤러부터 살펴보자면

// 게시글 목록 조회
	@GetMapping("/{boardCode}")
	public String selectBoardList(@PathVariable("boardCode") int boardCode
				 				 ,@RequestParam(value="cp", required=false, defaultValue="1") int cp
								 , Model model){
		
		// boardCode 확인
		// System.out.println("boardCode : " + boardCode);
		
		// 게시글 목록 조회 서비스 호출
		Map<String, Object> map = service.selectBoardList(boardCode, cp);
		
		// 조회 결과를 request scope에 세팅 후 forward
		model.addAttribute("map", map);
		
		return "board/boardList";
	}
	

여기서 @PathVariable을 배웠는데 짧게 정리해보자면
@PathVariable

  • URL 경로에 있는 값을 매개변수로 이용할 수 있게 하는 어노테이션
  • 추가적으로 request scope에 세팅을 해준다

@PathVariable을 사용하는 경우

Query String을 사용하는 경우

  • 정렬, 필터링
    ex) search.naver.com?query=날씨
    ex) search.naver.com?query=점심
    ex) /board2/insert?code=1
    ex) /board2/insert?code=2
    --> 삽입이라는 공통된 동작 수행

    단, code에 따라 어디에 삽입할지 지정(필터링)
    ex) /board/list?order=recent (최신순)
    ex) /board/list?order=most (인기순)

두개의 개념이 헷갈리는데 나중에 직접 게시판 만들때 상황에 따라서 골라 써봐야겠다 'ㅁ'
url 경로에 있는 값을 매개변수로 이용할 수 있게 해준다니..@PathVariable도 상당히 유용한거 같다

- BoardService interface

    /** 게시글 목록 조회
    * @param boardCode
    * @param cp
    * @return map
    */
	Map<String, Object> selectBoardList(int boardCode, int cp);

- BoardServiceImpl

// 게시글 목록 조회

	@Override
	public Map<String, Object> selectBoardList(int boardCode, int cp) {

		// 1. 특정 게시판의 삭제되지 않은 게시글 수 조회
		int listCount = dao.getListCount(boardCode);

		// 2. 1번 조회 결과 + cp를 이용해서 Pagination 객체 생성
		// -> 내부 필드가 모두 계산되어 초기화됨
		Pagination pagination = new Pagination(cp, listCount);

		// 3. 특정 게시판에서 현재 페이지에 해당하는 부분에 대한 게시글 목록 조회
		// (어떤 게시판 (boardCode)에서 몇 페이지(pagination.currentPage)에 대한 게시글 몇개인지(pagination.limit) 조회 )
		List<Board> boardList = dao.selectBoardList(pagination, boardCode);

		// 4. pagination, boardList를 Map에 담아서 반환
		Map<String, Object> map = new HashMap<String, Object>();

		map.put("pagination", pagination);
		map.put("boardList", boardList);

		return map;
	}

- BoardDAO

	/** 특정 게시판의 삭제되지 않은 게시글 수 조회
	 * @param boardCode
	 * @return listCount
	 */
	public int getListCount(int boardCode) {

		return sqlSession.selectOne("boardMapper.getListCount", boardCode);
	}

	/** 특정 게시판에서 현재 게시판에 해당하는 부분에 대한 게시글 목록 조회
	 * @param pagination
	 * @param boardCode
	 * @return
	 */
	public List<Board> selectBoardList(Pagination pagination, int boardCode) {
		
		// RowBounds 객체
		// - 마이바티스에서 페이징 처리를 위해 제공하는 객체
		// - offset 만큼 건너 뛰고
		// 그 다음 지정된 행 개수(limit) 만큼 조회 
		
		// 1) offset 계산
		int offset
		= (pagination.getCurrentPage() -1) * pagination.getLimit(); 
		
		// 2) RowBounds 객체 생성
		RowBounds rowBounds = new RowBounds(offset, pagination.getLimit());
		
		// 3) selectList("namespace.id", 파라미터, RowBounds) 호출
		return sqlSession.selectList("boardMapper.selectBoardList", boardCode, rowBounds);
	}

- board-mapper.xml

<!-- 특정 게시판의 삭제되지 않은 게시글 수 조회 -->
	<select id="getListCount" resultType="_int">
		SELECT COUNT(*) FROM BOARD
		WHERE BOARD_DEL_FL = 'N'
		AND BOARD_CODE = #{boardCode}
	</select>
	
	<!-- CDATA 태그 : 해당 태그 내부에 작성된 것은 모두 문자로 취급 -->	
	<!-- 게시글 목록 조회 -->
	<select id="selectBoardList" resultMap="board_rm">
		SELECT BOARD_NO, BOARD_TITLE, MEMBER_NICKNAME, READ_COUNT, 
        <![CDATA[ 	
            CASE  
               WHEN SYSDATE - B_CREATE_DATE < 1/24/60
               THEN FLOOR( (SYSDATE - B_CREATE_DATE) * 24 * 60 * 60 ) || '초 전'
               WHEN SYSDATE - B_CREATE_DATE < 1/24
               THEN FLOOR( (SYSDATE - B_CREATE_DATE) * 24 * 60) || '분 전'
               WHEN SYSDATE - B_CREATE_DATE < 1
               THEN FLOOR( (SYSDATE - B_CREATE_DATE) * 24) || '시간 전'
               ELSE TO_CHAR(B_CREATE_DATE, 'YYYY-MM-DD')
            END B_CREATE_DATE,
         ]]>     
         
         (SELECT COUNT(*) FROM "COMMENT" C
          WHERE C.BOARD_NO = B.BOARD_NO) COMMENT_COUNT,
          
         (SELECT COUNT(*) FROM BOARD_LIKE L
          WHERE L.BOARD_NO = B.BOARD_NO) LIKE_COUNT,
          
         (SELECT IMG_PATH || IMG_RENAME FROM BOARD_IMG I
         WHERE I.BOARD_NO = B.BOARD_NO
         AND IMG_ORDER = 0) THUMBNAIL
      FROM "BOARD" B
      JOIN "MEMBER" USING(MEMBER_NO)
      WHERE BOARD_DEL_FL = 'N'
      AND BOARD_CODE = #{boardCode}
      ORDER BY BOARD_NO DESC
	</select>

페이지네이션이 어려운데 나중에 게시판 예쁘게 꾸밀거 생각하니 더 열심히 해야겠다는 생각이 든 아자아자아자자 💪🏻💪🏻💪🏻!!!

profile
민주입니다

0개의 댓글