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. 결과
위 방법을 사용하면 방문자가 글을 반복해서 보더라도 조회수는 하루에 한 번만 증가하게 됩니다.
캐시 또는 세션을 적절히 선택하면 성능과 정확도 모두 확보할 수 있습니다.