개발
Laravel 개발 일지
라라벨에서 세션을 이용한 손쉬운 조회수 기능 추가
58 views as of October 7, 2024.
이전 글에서 브라우저 쿠키 방식으로 게시글별로 조회여부를 기록하는 방법으로 구현했는데, 이러니까 조회한 글이 많아지면 http 헤더 사이즈가 커져서 웹서버에서 접근 차단 당하는 문제가 발생했다.

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 게시물 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]]);  // 타임스탬프와 함께 세션에 저장
}
cs

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

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

×