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은 웹 애플리케이션 개발을 위한 강력한 PHP 프레임워크로, 태스크 자동화 기능을 제공합니다....

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

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

Laravel에서 마이그레이션을 롤백하는 방법

Laravel은 데이터베이스 스키마 관리를 용이하게 하기 위해 마이그레이션 기능을 제공합니다. 마이그레이션...

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

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

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

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

Laravel의 기능 테스트와 단위 테스트의 차이

Laravel은 PHP 프레임워크로, 웹 애플리케이션 개발에 필요한 다양한 기능을 제공합니다. 그 중에서도 테스...