개발
Laravel 개발 일지

라라벨에서 세션을 이용한 손쉬운 조회수 기능 추가

129 views as of October 7, 2024.
라라벨에서 쿠키를 이용한 손쉬운 조회수 기능 추가 - eruLabo
라라벨에서 쿠키를 이용한 손쉬운 조회수 기능 추가 - eruLabo
우리가 흔히 특정 게시글이나 페이지뷰에 대해서 조회수 기능(hit count)을 붙일때면 조회시에 post 모델의 hit값을 1 올리는 incresement 작업으로 수행한다. 1$post->increment('hit');cs 근데 이 방식으로하면...
https://erulabo.com/177

이전 글에서 브라우저 쿠키 방식으로 게시글별로 조회여부를 기록하는 방법으로 구현했는데, 이러니까 조회한 글이 많아지면 http 헤더 사이즈가 커져서 웹서버에서 접근 차단 당하는 문제가 발생했다.

관련내용해서 해결방법은 쿠키 하나에 글 ID를 병기해서 저장하던지, 아니면 서버사이드 방식으로 저장하라는 내용이 있어서 여기서는 서버 세션을 통해서 구현해보려고한다.

나같은 경우는 Nginx + Laravel 세팅이고 세션은 파일 세션(File Session)방식을 사용하고있다.

// 게시물 ID에 따른 세션 키 설정
$sessionKey = 'viewed_post_' . $id;
$now = now();  // 현재 시간 가져오기
 
if (session()->has($sessionKey)) {
    $viewedData = session($sessionKey); // 세션에 저장된 데이터 가져오기
    $viewedTime = $viewedData['time'];  // 타임스탬프 불러오기
 
    // 마지막 조회 시간이 24시간이 넘었는지 확인
    if ($now->diffInMinutes($viewedTime) >= 1440) {
        // 조회수 증가
        $post->increment('hit');
        session([$sessionKey => ['time' => $now]]); // 타임스탬프 갱신
    }
} else {
    // 세션에 해당 키가 없으므로 조회수 증가
    $post->increment('hit');
    session([$sessionKey => ['time' => $now]]);  // 타임스탬프와 함께 세션에 저장
}Copy

이렇게 세션에 시간을 기록해서 넣어두면 라라벨 기본 세션 라이프 타임과는 별개로 세션값이 하루 묶게 된다. 이에 따라 라라벨 가비지 컬렉션도 운영된다고 한다.

소규모 사이트의 경우에는 어느정도(일 100~1000회 조회)의 세션에 쓰이는 공간 비용은 문제없을거같은데 대규모 사이트의 경우에는 쌓이는 세션량이 좀 크지 않을까 싶다. 그럴경우엔 위에 처럼 키(ID)별로 저장한다기보다 하나의 저장 쿠키나 세션에 그 값을 모아서 저장, 조회 하거나 클라이언트 로컬 스토리지를 써보는것도 올바르지 않을까 한다.



+ 한달정도 써보고 나니 일일 조회수 1000미만이어도 생각보다 세션이 누적되는량이 크다.

이런 조회수 관련해서 다른 커뮤니티는 어떻게 쓰나봤더니 아예 기본 조회수를 안보이게 하고 추천수만 보이게 하는 사이트가 있는가 반면에 그냥 페이지가 로드될때마다 조회수가 1올라가는 방식을 채용하는곳 생각보다 많았다.

그도 그럴께 접속량이 많아지만 그만큼 캐시나 세션하는데 사용하는 비용이 접속량과 게시글수에 비례해서 증가하니까 부담이 될만하기도하다.

위 코드는 소규모 사이트에서 조회수를 체크하거나 이런 세션 방식의 기억할 때 응용하는 정도로 만족해야할것같다.

내 사이트도 그냥 기존 조회수 카운팅 방식으로 돌리게되었다.
#개발 #Laravel #라라벨 #조회수 #세션
0 개의 댓글
×