2020년 02월 08일
업데이트:
DB Model
파일, 패키지 생성
게시판과 관련된 파일들을 생성한다.
mybatis-config.xml
<!-- 별칭 지정 -->
<typeAlias type="com.kh.spring.board.model.vo.Board" alias="Board"/>
<!-- mapper 지정 -->
<mapper resource="/mappers/board-mapper.xml"></mapper>
페이지 목록 조회
header.jsp
FREE BOARD
와 INFORMATION BOARD
a 태그를 누르면 각각 자유게시판, 정보게시판으로 이동한다.
<li class="nav-item">
<a class="nav-link" href="${contextPath}/board/list/1">Free Board</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${contextPath}/board/list/2">Information Board</a>
</li>
PageInfo.java
페이징 처리에 필요한 값을 계산하는 메소드를 작성한다.
// 위 생략
private void makePageInfo() {
maxPage = (int)Math.ceil(( (double)listCount / limit));
startPage = (currentPage-1)/pageSize * pageSize + 1;
endPage = startPage + pageSize - 1;
if(maxPage > endPage) {
endPage = startPage + pageSize - 1;
}
else {
endPage = maxPage;
}
}
BoardController.java
페이징 처리를 위해 getPageInfo 메소드와 selectList 메소드를 작성한다.
// 게시글 목록 조회 Controller
@RequestMapping("list/{type}")
public String boardList(@PathVariable("type") int type,
@RequestParam(value="cp", required = false, defaultValue="1") int cp,
Model model) {
PageInfo pInfo = service.getPageInfo(type, cp);
List<Board> bList = service.selectList(pInfo);
model.addAttribute("bList", bList);
model.addAttribute("pInfo", pInfo);
return "board/boardList";
}
- @PathVariable : @RequestMapping에 작성된 URL 경로에 있는 특정 값을 변수로 사용할 수 있게하는 어노테이션.
BoardService.java (interface)
/** 게시글 목록 조회 Service
* @param pInfo
* @return
*/
public abstract List<Board> selectList(PageInfo pInfo);
/** 게시글 상세 조회 Service
* @param boardNo
* @param type
* @return
*/
public abstract Board selectBoard(int boardNo, int type);
BoardServiceImpl.java
@Override
public PageInfo getPageInfo(int type, int cp) {
// 전체 게시글 수 조회
int listCount = dao.getListCount(type);
return new PageInfo(cp, listCount, type);
}
// 게시글 목록 조회 Service 구현
@Override
public List<Board> selectList(PageInfo pInfo) {
return dao.selectList(pInfo);
}
board-mapper.xml
<!-- 특정 게시판 전체 게시글 수 조회 -->
<select id="getListCount" parameterType="_int" resultType="_int">
SELECT COUNT(*) FROM V_BOARD
WHERE BOARD_STATUS = 'Y'
AND BOARD_CD = #{type}
</select>
<!-- 게시글 목록 조회 -->
<select id="selectList" parameterType="_int" resultMap="board_rm">
SELECT BOARD_NO, BOARD_TITLE, MEMBER_ID, READ_COUNT,
CATEGORY_NM, BOARD_CREATE_DT, BOARD_NM
FROM V_BOARD
WHERE BOARD_STATUS = 'Y'
AND BOARD_CD = #{type}
ORDER BY BOARD_NO DESC
</select>
boardList.jsp
boardType
1이 자유게시판, 2가 정보게시판이기 때문에 title 게시판 이름이 보여야할 곳에 choose 구문을 작성한다.
<title>
<c:choose>
<c:when test="${pInfo.boardType == 1}">
자유게시판
</c:when>
<c:otherwise>
정보게시판
</c:otherwise>
</c:choose>
</title>
<!-- 생략 -->
<h1>
<c:choose>
<c:when test="${pInfo.boardType == 1}">
자유게시판
</c:when>
<c:otherwise>
정보게시판
</c:otherwise>
</c:choose>
</h1>
- 자유게시판
- 정보게시판
게시글 상세 조회
boardList.jsp
게시글 한 행을 클릭했을 때 해당 게시글 상세조회로 이동하도록 스크립트를 작성한다.
<script>
$("#list-table td").on("click", function(){
var boardNo = $(this).parent().children().eq(0).text();
var boardViewURL = "../${pInfo.boardType}/" + boardNo;
location.href = boardViewURL;
});
</script>
BoardController.java
//게시글 상세조회 Controller
@RequestMapping("{type}/{boardNo}")
public String boardView(@PathVariable("type") int type,
@PathVariable("boardNo") int boardNo,
Model model,
@RequestHeader(value="referer", required = false) String referer,
RedirectAttributes ra) {
Board board = service.selectBoard(boardNo, type);
String url = null;
if(board != null) {
model.addAttribute("board", board);
url = "board/boardView";
} else {
if(referer == null) {
url = "redirect:../list/" + type;
} else {
url = "redirect:" + referer;
}
ra.addFlashAttribute("swalIcon", "error");
ra.addFlashAttribute("swalTitle", "존재하지 않는 게시글입니다.");
}
return url;
}
- @RequestHeader(name=”referer”) String referer : HTTP 요청 헤더에 존재하는 “referer” 값을 얻어와 매개변수 String referer에 저장한다.
BoardService.java (interface)
/** 게시글 상세 조회 Service
* @param boardNo
* @param type
* @return
*/
public abstract Board selectBoard(int boardNo, int type);
BoardServiceImpl.java
게시글 상세조회는 해당 게시글의 조회수 기능도 같이 구현한다.
// 게시글 상세 조회 Service 구현
@Transactional(rollbackFor = Exception.class)
@Override
public Board selectBoard(int boardNo, int type) {
Board temp = new Board();
temp.setBoardNo(boardNo);
temp.setBoardCode(type);
Board board = dao.selectBoard(temp);
if(board != null) {
int result = dao.increaseReadCount(boardNo);
if(result > 0) {
board.setReadCount(board.getReadCount() + 1);
}
}
return board;
}
BoardDAO.java
/** 게시글 상세 조회 DAO
* @param temp
* @return board
*/
public Board selectBoard(Board temp) {
return sqlSession.selectOne("boardMapper.selectBoard", temp);
}
/** 게시글 조회수 증가 DAO
* @param boardNo
* @return result
*/
public int increaseReadCount(int boardNo) {
return sqlSession.update("boardMapper.increaseReadCount", boardNo);
}
board-mapper.xml
<!-- 게시글 상세 조회 -->
<select id="selectBoard" parameterType="Board" resultMap="board_rm">
SELECT BOARD_NO, BOARD_TITLE, BOARD_CONTENT,
MEMBER_ID, READ_COUNT, CATEGORY_NM,
BOARD_CREATE_DT, BOARD_MODIFY_DT,
BOARD_CD, BOARD_NM
FROM V_BOARD
WHERE BOARD_STATUS = 'Y'
AND BOARD_NO = #{boardNo}
AND BOARD_CD = #{boardCode}
</select>
<!-- 게시글 조회수 증가 -->
<update id="increaseReadCount" parameterType="_int">
UPDATE BOARD SET
READ_COUNT = READ_COUNT + 1
WHERE BOARD_NO = #{boardNo}
</update>
댓글남기기