해당 게시글의 전체 소스코드는 이곳 Github를 참고해 주세요


목차

  1. 게시글 조회수 구현




게시글을 클릭 할때 조회수가 증가하는 기능을 구현해보려고 한다

조회수 기능을 구현하는것은 아주 간단하다

  • BoardController
/* 
 * 게시글 상세
 */
@RequestMapping(value = "/boardDetail", method = RequestMethod.GET)
public String BoardDetail(Model model, 
                            BoardVO vo, 
                            @ModelAttribute("boardIdx") int boardIdx) throws Exception {
    
    ...(생략)

}

게시글 상세내용을 보여주는 주소인 “/boardDetail” 이 호출될때 조회수를 +1 이 더해지게 구현하면 된다

우선 board 테이블의 게시글 조회수 컬럼을 추가한다

ALTER TABLE board ADD column boardViewCnt int not null default 0;

그리고 Domain 아래의 BoardVO에 boardViewCnt 를 추가해준다 (getter, setter)

Domain

/src/main/java/org/doorisopen/myspring/Board/Domain/BoardVO.java

private int boardIdx;
private String boardTitle;
private String boardContent;
private String writer;
private String writeDate;
private String modifier;
private String modifyDate;
private int important;
private int enabled;
private int boardViewCnt; // 게시글 조회수 추가

    ...이하생략...

Persistence

조회수 기능은 BoardService(Business layer) 에서 수행되면된다

우선 BoardDAO 인터페이스 에 아래의 코르를 작성한다.

/src/main/java/org/doorisopen/myspring/Board/Persistence/BoardDAO.java

// BoardDAO.java
public interface BoardDAO {
    ...(생략)...
    public void BoardViewCntUpdate(int boardIdx) throws Exception;

}    

그리고 BoardDAOImpl.java에 아래의 코드를 추가한다

/src/main/java/org/doorisopen/myspring/Board/Persistence/BoardDAOImpl.java

@Component
public class BoardDAOImpl implements BoardDAO{

	@Autowired
	private SqlSession sqlSession;
	
	private static final String namespace ="org.doorisopen.myspring.Board.BoardMapper";
    
    ...(생략)...
    
    /* 
     * 게시글 조회수 증가
     */
    @Override
    public void BoardViewCntUpdate(int boardIdx) throws Exception {
        // TODO Auto-generated method stub
        sqlSession.update(namespace + ".BoardViewCntUpdate", boardIdx);
    }
}

Mapper(SQL)

/src/main/resources/mappers/BoardMapper.xml

<!-- 게시글 조회수 증가 -->
<update id="BoardViewCntUpdate">
    UPDATE
        board
    SET
        boardViewCnt = boardViewCnt + 1
    WHERE
        boardIdx = #{boardIdx}
</update>

Service

마지막으로 BoardServiceImpl 에서 BoardDetail 에 게시글 조회수 증가하는 코드를 작성하면 끝난다

/src/main/java/org/doorisopen/myspring/Board/Service/BoardServiceImpl.java

/* 
 * 게시글 상세
 */
@Override
public BoardVO BoardDetail(int boardIdx) throws Exception {
    // TODO Auto-generated method stub
    
    // 게시글 조회수 업데이트
    dao.BoardViewCntUpdate(boardIdx); // <---- 추가
    
    return dao.BoardDetail(boardIdx);
}

추가로 BoardRead(List) 에 아래와 같이 작성해주면 게시글 조회수 구현이 끝이 난다

boardRead.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>DOOP</title>
</head>
<body>
	<!-- div center -->
	<div align=center>
	 <header>게시글 리스트</header>
 
	 	<!-- Board List -->
		<table border="1">
			<thead>
				<tr>
					<th colspan="2">NO</th>
					<th colspan="10">Title</th>
					<th colspan="5">Writer</th>
					<th colspan="5">WriteDate</th>
					<th colspan="2">View</th>
				</tr>
			</thead>
			<tbody>
			<c:choose>
				<c:when test="${fn:length(boardRead) > 0}">
					<c:forEach items="${boardRead }" var="boardRead" varStatus="rowcnt">
						<tr>
							<td colspan="2">${boardRead.boardIdx}</td>
							<td colspan="10"><a href="/myspring/Board/boardDetail?boardIdx=${boardRead.boardIdx}">${boardRead.boardTitle}</a></td>
							<td colspan="5">${boardRead.writer}</td>
							<td colspan="5">${boardRead.writeDate}</td>
							<td colspan="2">${boardRead.boardViewCnt}</td>
						</tr>
					</c:forEach>
				</c:when>
				<c:otherwise>
					<tr>
						<td colspan="6">조회된 결과가 없습니다.</td>
					</tr>
				</c:otherwise>
			</c:choose>
			</tbody>
		</table>
		<!-- ./Board List -->
		<div>
			<a href="/myspring/Board/boardCreateView">게시글 등록하기</a>
		</div>
		
	</div>
	<!-- ./div center -->
</body>
</html>

게시글 조회수 구현 자체는 아주 간단한 내용이다. 그러나 게시글 조회수 중복증가라는 문제점이 있다. 이 문제는 추후 추가 해볼 것이다

References

  • 대학교 웹 프레임워크 수업 정리한 내용 입니다.