Spring Boot Board Project_21 조회수 증가

송지윤·2024년 4월 24일
0

Spring Framework

목록 보기
54/65

조회 수 처리하는 방법

  1. 조회할 때마다 증가하는 방법(DB, 서버 부하)
  2. DB 에 누가 어떤 글을 조회했는가 저장해놓고
    일정 기간 단위로 확인해서 증가(복잡함 + 서버 부하)
  3. local/session 스토리지 (클라이언트단) -> js 사용 가능, 서버 사용 X
  4. 쿠키를 이용한 조회수 증가 (서버 <-> 클라이언트, 클라이언트 관리되는 쿠키는 보안에 취약함 (조작이 가능함))
  5. In Memory DB(메모리 영역에 저장되는 DB) (redis)-> 쿠팡 (K:V) redis 꼬이면 서버 다운됨
    -> 유료 버전, 사용 설정 까다로움

Oracle은 HDD 에 저장
redis DB 쿠팡에서 사용

로그인한 회원이 작성한 글 상세조회 했을 때는 조회수 증가 X
다른 사람 글 들어갔을 때도 하루에 한번만 조회수 증가하게 처리
4번 방법으로 할 거임

readBoardNo 키에 현재 클라이언트가 봤던 글 번호 저장해줄 거
readBoardNo : [1999][2000][1935]...
이런식으로 저장해줄거임
=> 게시글 상세조회할 때마다 일어나는 일

1. boardDetail 메서드 수정

상세 조회할 때마다 일어나는 일이라 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);
					}
					
				}
				
			}
			/* **************** 쿠키를 이용한 조회 수 증가 (끝)   ********************* */

2. BoardServiceImple 에서 조회수 증가 mapper 호출

	@Override
	public int updateReadCount(int boardNo) {

		// 1. 조회 수 1 증가
		int result = mapper.updateReadCount(boardNo);
		
		// 2. 현재 조회 수 조회
		if(result > 0) {
			return mapper.selectReadCount(boardNo);
		}
		
		return -1; // 실패한 경우 -1 반환
	}

3. mapper.xml 에서 SQL 작성

	<!-- 조회수 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>

4. Controller로 돌아와서 result 에 들어온 결과값 (-1 이거나 현재 조회수) 가지고 처리

작성 중인 구문 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); // 응답 객체를 이용해서 클라이언트에게 전달
				}
				
			}
			
			
			/* **************** 쿠키를 이용한 조회 수 증가 (끝)   ********************* */

0개의 댓글