Laravel에서 하루에 한 번만 글 조회수 증가시키기

방문자가 글을 볼 때마다 조회수가 무조건 올라가면 실제 관심도나 방문 수치를 왜곡할 수 있습니다.

같은 사용자가 하루에 한 번만 조회수를 올릴 수 있도록 Laravel에서 구현하는 방법을 소개합니다.

1. posts 테이블에 조회수 컬럼 추가

php artisan make:migration add_views_to_posts_table --table=posts
// database/migrations/xxxx_xx_xx_add_views_to_posts_table.php

public function up()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->unsignedBigInteger('views')->default(0);
    });
}

public function down()
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn('views');
    });
}

그 다음 마이그레이션을 적용합니다.

php artisan migrate

2. 조회수 증가 로직 구현 (캐시 기반)

같은 사용자가 하루에 한 번만 조회수를 증가시키도록 캐시를 사용합니다.

기준은 IP 주소와 포스트 ID입니다.

// app/Http/Controllers/PostController.php

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Request;

public function show(Post $post)
{
    $ip = Request::ip();
    $cacheKey = 'post_viewed_' . $post->id . '_' . $ip;

    if (!Cache::has($cacheKey)) {
        $post->increment('views');
        Cache::put($cacheKey, true, now()->addDay()); // 24시간 유지
    }

    return view('posts.show', compact('post'));
}

이 방식은 Laravel의 기본 캐시 드라이버(Redis, Memcached, file 등)에 따라 동작하며, 하루에 한 번만 증가합니다.

3. 대안: 세션 기반 구현 (로그인/비로그인 혼용 가능)

public function show(Post $post)
{
    $viewedPosts = session()->get('viewed_posts', []);

    if (!in_array($post->id, $viewedPosts)) {
        $post->increment('views');
        session()->push('viewed_posts', $post->id);
    }

    return view('posts.show', compact('post'));
}

이 경우 브라우저를 닫거나 세션이 만료되면 다시 조회수가 증가할 수 있습니다.

시간 기준 제한을 두려면 캐시 방식이 더 적합합니다.

4. 결과

위 방법을 사용하면 방문자가 글을 반복해서 보더라도 조회수는 하루에 한 번만 증가하게 됩니다.

캐시 또는 세션을 적절히 선택하면 성능과 정확도 모두 확보할 수 있습니다.

Tags:
Laravel

관련 게시글

Laravel의 보안 기능과 취약점 방지 방법은 무엇인가요?

Laravel의 보안 기능과 취약점 방지 방법 Laravel은 PHP 프레임워크 중 하나로, 웹 애플리케이션...

Laravel 블로그에 태그 기능 추가하기

블로그 글에 태그(tag)를 추가하면 글을 주제별로 분류하고 필터링할 수 있어 사용자 경험이 향상됩니다. L...

Laravel에서 커스텀 예외 클래스를 만드는 방법은 무엇인가요?

Laravel에서 커스텀 예외 클래스 만들기 Laravel은 강력한 예외 처리 시스템을 제공하는 프레임워...

Laravel에서 비동기 작업을 수행하는 방법

Laravel은 비동기 작업을 간편하게 처리할 수 있는 다양한 기능을 제공합니다. 비동기 작업은 웹 애플리케...

Laravel에서 GitHub Actions와 CI/CD를 통합하는 방법

Laravel은 현대적인 웹 애플리케이션을 위한 PHP 프레임워크로, 많은 개발자들이 선호합니다. 이 프레임워...

Laravel에서 스코프에 따른 쿼리 최적화는 어떻게 하나요?

Laravel에서 스코프에 따른 쿼리 최적화 Laravel은 PHP 기반의 프레임워크로, 데이터베이스와의...