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에서 GitHub Actions와 CI/CD를 통합하는 방법

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

Laravel에서 헬퍼 파일을 만드는 방법은 무엇인가요?

Laravel에서 헬퍼 파일 만들기 Laravel은 PHP 프레임워크 중 하나로, MVC 아키텍처를 기반으로 하여 웹...

Laravel에서 조건부 라우팅을 구현하는 방법

Laravel은 간편하고 직관적인 라우팅 시스템을 제공하여 웹 애플리케이션의 URL과 그에 연결된 처리 로직을...

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

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

Laravel에서 태스크 자동화를 설정하는 방법

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

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

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