게시판 만들기 1 : https://pabeba.tistory.com/180
게시판 만들기 2 : https://pabeba.tistory.com/181
게시판 만들기 3 : https://pabeba.tistory.com/182
마지막으로 게시물을 들어갔을 때 조회수를 증가시키는 기능을 마무리로 게시판 만들기 글을 마무리하려고 합니다!
저번 시간에 작성했지만 이 기능을 만들 때 조금 까다로운 면이 있어서 2가지 방법을 사용해 보려고 합니다.
쿠키를 사용하는 방법과 세션을 사용하는 방법을요. 둘 다 장단점이 있어서 뭐가 좋다고 말할 수 는 없습니다.
아무튼 알아보도록 할게요.
쿠키 사용하여 조회수 증가
상세페이지에 들어가면 조회수를 증가시켜야 하기 때문에 상세페이지에 들어가는 Controller에 메서드를 추가하면 될 것 같습니다.
1. SQL 제작
UPDATE board SET hits=hits+1 WHERE no=?
게시판의 조회수를 증가하는 문장입니다.
2. Test Case 제작
public class TestUnitUpdateCount {
public static void main(String[] args) {
try {
BoardDAO.getInstance().updateHits(1);
System.out.println("update hits complete");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void updateHits(long no) throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = dataSource.getConnection();
String sql = "UPDATE board SET hits=hits+1 WHERE no=?";
pstmt = con.prepareStatement(sql);
pstmt.setLong(1, no);
pstmt.executeUpdate();
} finally {
closeAll(pstmt, con);
}
}
게시물 번호를 넘겨줘서 조회수를 증가시킵니다.
3. Controller 제작
이제 여기서 cookie 를 사용할 것인가 session을 사용할 것인가를 결정해야합니다.
Cookie 방식
public class FindPostByNoController implements Controller {
@SuppressWarnings("null")
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("mvo") == null) {
System.out.println("비인증");
return "redirect:FindPostList.do";
}
long no = Long.parseLong(request.getParameter("no"));
Cookie oldCookie = null;
Calendar expireDay = Calendar.getInstance();
expireDay.add(Calendar.DAY_OF_MONTH, 1);
expireDay.set(Calendar.HOUR_OF_DAY, 0);
expireDay.set(Calendar.MINUTE, 0);
expireDay.set(Calendar.SECOND, 0);
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("boardView")) {
oldCookie = cookie;
}
}
}
if (oldCookie != null) {
if (!oldCookie.getValue().contains(String.valueOf(no) + "/")) {
BoardDAO.getInstance().updateHits(no);
oldCookie.setValue(oldCookie.getValue() + no + "/");
oldCookie.setPath("/");
oldCookie.setMaxAge(
((int) (expireDay.getTimeInMillis() - System.currentTimeMillis())) / 1000 + 9 * 60 * 60);
response.addCookie(oldCookie);
}
} else {
BoardDAO.getInstance().updateHits(no);
Cookie newCookie = new Cookie("boardView", String.valueOf(no) + "/");
newCookie.setPath("/");
newCookie
.setMaxAge(((int) (expireDay.getTimeInMillis() - System.currentTimeMillis())) / 1000 + 9 * 60 * 60);
response.addCookie(newCookie);
}
PostVO post = BoardDAO.getInstance().findPostDetail(no);
request.setAttribute("post", post);
request.setAttribute("url", "board/post-detail.jsp");
return "layout.jsp";
}
}
1. 로그인 세션이 없으면 작동 불가
2. 방문하려는 게시글의 번호를 받아옵니다.
3. Cookie 들을 getCookies 메서드로 가져옵니다.
4. 위에 만료기간을 설정한 것은 쿠키의 만료기간을 다음날 00시로 해놓기 위함입니다.
5. 쿠키가 있으면 쿠키 이름이 boardView 인 쿠키를 oldCookie에 할당합니다.
6. oldCookie 의 값이 있고 기존에 방문한 게시물 값이 들어있으면, 거기에 현재 게시글 번호를 추가합니다.
(예시 : 기존에 3/4/7 이렇게 들어가있고 현재 14번 게시물에 들어가게 되면 쿠키에 3/4/7/14 가 저장됩니다.)
7. 하지만 기존에 방문한 게시물이 없으면 새로 boardView 라는 쿠키를 생성해서 게시물 번호를 넣습니다.
8. 그리고 쿠키를 생성할 때 항상 다음날 00시로 만료기간을 줍니다.
(제가 생각한 프로그램은 하루가 지나면 조회수가 다시 증가할 수 있게 만드는 것입니다.)
세션 방식
쿠키 방식을 제거하고 아래 코드를 넣으면 됩니다.
@SuppressWarnings("unchecked")
ArrayList<Long> communityBoardNoList = (ArrayList<Long>) session.getAttribute("communityBoardNoList");
if (communityBoardNoList.contains(no)) {
} else {
BoardDAO.getInstance().updateHits(no);
communityBoardNoList.add(no);
session.setAttribute("communityBoardNoList", communityBoardNoList);
}
1. 세션에 communityBoardNoList key 값을 찾아서 list에 할당합니다.
2. 만약 list에 현재 보려고 하는 게시글 번호가 포함되어있으면 조회수 증가 메서드가 동작하지 않습니다.
3. 포함되어있지 않다면 조회수를 증가하고 list에 번호를 담아서 다시 세션에 저장합니다.
두개의 방식 중에 단연 눈에 띄는게 세션방식입니다. 짧으니까요.
하지만 그 둘에는 장단점이 있습니다.
쿠키방식
장점 : 만료기간을 설정하면서 로그아웃을 했을 때도 쿠키를 굳이 삭제하지 않으면 조회수가 증가하지 않습니다.
단점 : 방문한 게시글이 엄청 많아지면 저장할 수 있는 양이 한정되어있기 때문에 전체 다 저장할 수 없습니다.
세션방식
장점 : 많은 양을 저장할 수 있습니다.
단점 : 로그아웃하면 세션이 사라지게 되고 다시 로그인 했을 시 조회수가 증가합니다.
이러한 장단점을 생각해보고 또 프로그램의 사용 용도를 생각해보면서 만약에 조회수가 중요한 프로그램인 유투브나 블로그 등을 제작해야한다면
데이터베이스에 저장해 놓고 자신이 설정한 조회수 만료기간을 정해서 데이터베이스를 초기화하고 다시 저장하는 방식을 사용해야겠다고 생각했습니다.
소감
프로젝트를 하면서 느낀점이 있어 글을 하나 남기고 싶습니다.
프로젝트를 하면 각자 기능을 맡아서 개발을 진행합니다. 만약, 자신이 하는 기능에 대해 궁금한 것이나 문제가 생겼을 때 팀원에게 질문을 하게 되는데 그럴 때 어떠한 기능을 만들고 있는데 어떠한 방식으로 진행하고 싶지만 어떤 문제가 생겼다고 이야기를 해주면 수월하게 도움을 줄 수 있지만 자기만 알고 있는 코드를 이야기하면서 문제가 생겼다고 하면 소통하기 어렵습니다. 또한, 문제가 발생한 상황을 잘 이해했다고 하더라도 코드를 읽어볼 시간도 필요하다고 생각됩니다.
개발할 때 뿐만 아니라 모든 일에서 이러한 복합적인 상황을 잘 헤아려서 일을 진행해야한다고 생각합니다.
하지만 역시 가장 중요한 것은 행복함을 잃지 않으면서 일을 진행해야합니다. 그래야 더 수월하게 잘 진행이 되더라고요.
'코딩 개발 > Java' 카테고리의 다른 글
Java - XML 파일 parsing하여 DB 저장하기 (0) | 2023.08.29 |
---|---|
MacOS - Java Version 변경하기 (0) | 2023.07.07 |
게시판 만들기 3 (게시글 수정, 게시글 삭제) (0) | 2023.06.28 |
게시판 만들기 2 (게시물 상세 페이지, 게시물 작성) (0) | 2023.06.27 |
게시판 만들기 1 (게시글 리스트 보기, 로그인, 로그아웃) (0) | 2023.06.26 |