Spring - 게시판구현(게시글 목록 조회 / 게시글 상세 조회)

Hyunny ·2023년 8월 22일
0

SPRING

목록 보기
10/14
post-thumbnail

🤍📝게시글 목록 조회

💬
@PathVariable : URL 경로에 있는 값을 매개변수로 이용할 수 있게 하는 어노테이션 + request scope에 세팅
@PathVariable을 사용하는 경우 : 자원(resource) 구분/식별
Query String을 사용하는 경우 : 정렬, 필터링

🔎 boardController

@SessionAttributes({"loginMember"})
@RequestMapping("/board")
@Controller
public class BoardController {

	@Autowired
	private BoardService service;
    @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";
	}
    
    
🔎 boardServiceImpl
// 게시판 종류 목록 조회
	@Override
	public List<Map<String, Object>> selectBoardTypeList() {
		return dao.selectBoardTypeList();
	}

	// 게시글 목록 조회
	@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<>();
		
		map.put("pagination", pagination);
		map.put("boardList", boardList);
		
		return map;
	}
    
    
🔎 boardDAO
/** 게시판 종류 목록 조회
	 * @return boardTypeList
	 */
	public List<Map<String, Object>> selectBoardTypeList() {
		return sqlSession.selectList("boardMapper.selectBoardTypeList");
	}

	/** 특정 게시판의 삭제되지 않은 게시글 수 조회
	 * @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
<!-- Board DTO에 대한 resultMap -->
   <resultMap type="Board" id="board_rm">
   
      <id property="boardNo" column="BOARD_NO"/>
      
      <result property="boardTitle" column="BOARD_TITLE"/>
      <result property="boardContent" column="BOARD_CONTENT"/>
      <result property="boardCreateDate" column="B_CREATE_DATE"/>
      <result property="boardUpdateDate" column="B_UPDATE_DATE"/>
      <result property="boardCode" column="BOARD_CODE"/>
      <result property="readCount" column="READ_COUNT"/>
      <result property="commentCount" column="COMMENT_COUNT"/>
      <result property="likeCount" column="LIKE_COUNT"/>
      <result property="memberNickname" column="MEMBER_NICKNAME"/>
      
      <result property="memberNo" column="MEMBER_NO"/>
      <result property="profileImage" column="PROFILE_IMG"/>
      
      <result property="thumbnail" column="THUMBNAIL"/>
      
      
      <!-- collection 태그 
          select로 조회된 결과를 컬렉션(List)에 담아
          지정된 필드에 세팅
          
          property : List를 담을 DTO의 필드명
          select : 실행할 select의 id
          column : 조회 결과 중 지정된 컬럼의 값을 파라미터로 전달
          javaType : List(컬렉션)의 타입을 지정
          ofType : List(컬렉션)의 제네릭(타입 제한) 지정
      -->
      
      <collection property="imageList" 
               select="selectImageList"
               column="BOARD_NO"
               javaType="java.util.ArrayList"
               ofType="BoardImage">
      </collection>
      
      <collection property="commentList" 
               select="selectCommentList"
               column="BOARD_NO"
               javaType="java.util.ArrayList"
               ofType="Comment">
      </collection>
      
      
   </resultMap>
   
    <!-- 게시판 종류 목록 조회 -->
   <select id="selectBoardTypeList" resultType="map">
      SELECT * FROM BOARD_TYPE ORDER BY 1
   </select>
   
   <!-- 특정 게시판의 삭제되지 않은 게시글 수 조회 -->
   <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
개발 learning ... 📝

0개의 댓글