Oracle은 HDD 에 저장
redis DB 쿠팡에서 사용
로그인한 회원이 작성한 글 상세조회 했을 때는 조회수 증가 X
다른 사람 글 들어갔을 때도 하루에 한번만 조회수 증가하게 처리
4번 방법으로 할 거임
readBoardNo 키에 현재 클라이언트가 봤던 글 번호 저장해줄 거
readBoardNo : [1999][2000][1935]...
이런식으로 저장해줄거임
=> 게시글 상세조회할 때마다 일어나는 일
상세 조회할 때마다 일어나는 일이라 boardDetail 메세지 수정해줘야함
Cookie jakarta 에 있음 (import)
Cookie 는 K:V 형태
문자열.indexOf("찾을값")
있는 부분의 index 번호 반환, 없으면 -1 반환
BoardController
// 조회 결과가 있는 경우
} else {
/* **************** 쿠키를 이용한 조회 수 증가 (시작) ********************* */
// 1. 비회원 또는 로그인한 회원의 글이 아닌 경우
// (글쓴이를 뺀 다른 사람)
if(loginMember == null || loginMember.getMemberNo() != board.getMemberNo()) {
// 로그인한 사람이 없거나 글쓴이가 아닌 경우
// 요청에 담겨있는 모든 쿠키 얻어오기
Cookie[] cookies = req.getCookies();
Cookie c = null;
for(Cookie newjeans : cookies) {
// 요청에 담긴 쿠키에 "readBoardNo"가 존재할 때
if(newjeans.getName().equals("readBoardNo")) {
c = newjeans;
break;
}
}
int result = 0; // 조회수 증가 결과를 저장할 변수
// "readBoardNo"가 현재 쿠키에 없을 때
// (게시글 상세조회 했을 때 쿠키 없으면 이게 처음 보는 게시글)
if(c == null) {
// 새 쿠키 생성 ("readBoardNo", [게시글번호]) (K:V)형태
c = new Cookie("readBoardNo", "[" + boardNo + "]");
result = service.updateReadCount(boardNo);
// "readBoardNo"가 현재 쿠키에 있을 때
// "readBoardNo" : [2][400][1234][214]
} else {
// 누적해서 Cookie 에 쌓아주면 됨
// 이미 Cookie 에 boardNo 가 존재하면 안 쌓아줄거임
// 현재 글을 처음 읽은 경우
if(c.getValue().indexOf("[" + boardNo + "]") == -1) {
// 해당 글 번호를 쿠키에 누적 + 서비스 호출
c.setValue(c.getValue() + "[" + boardNo + "]");
result = service.updateReadCount(boardNo);
}
}
}
/* **************** 쿠키를 이용한 조회 수 증가 (끝) ********************* */
@Override
public int updateReadCount(int boardNo) {
// 1. 조회 수 1 증가
int result = mapper.updateReadCount(boardNo);
// 2. 현재 조회 수 조회
if(result > 0) {
return mapper.selectReadCount(boardNo);
}
return -1; // 실패한 경우 -1 반환
}
<!-- 조회수 1 증가 -->
<update id="updateReadCount">
UPDATE "BOARD" SET
READ_COUNT = READ_COUNT + 1
WHERE BOARD_NO = #{boardNo}
</update>
<!-- 조회수 조회 -->
<select id="selectReadCount">
SELECT READ_COUNT
FROM "BOARD"
WHERE BOARD_NO = #{boardNo}
</select>
작성 중인 구문 else 구문 끝난 뒤로
Duration java.time 에 있음
BoardController
// 조회 수 증가 성공 / 조회 성공 시
if(result > 0) {
// 먼저 조회된 board 객체의 readCount 값을 result 값으로 재대입
board.setReadCount(result);
// 적용 경로 설정
c.setPath("/"); // "/" 최상위 경로 이하 요청 시 쿠키 서버로 전달
// 수명 지정
// 현재 시간을 얻어오기
LocalDateTime now = LocalDateTime.now();
// 다음 날 자정
LocalDateTime nextDayMidnight = now.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
// 다음 날 자정까지 남은 시간 계산 (초 단위)
long secondsUntilNextDay = Duration.between(now, nextDayMidnight).getSeconds();
// 쿠키 수명 설정
c.setMaxAge((int)secondsUntilNextDay);
resp.addCookie(c); // 응답 객체를 이용해서 클라이언트에게 전달
}
}
/* **************** 쿠키를 이용한 조회 수 증가 (끝) ********************* */

