배움/PHP

Laravel11 브로드캐스팅 PrivateChannel , reverb 사용 예시

spaces25 2025. 5. 19. 08:59
반응형

Laravel 11에서 브로드캐스팅을 사용할 때, PrivateChannel과 Reverb (Pusher 대체 OSS)를 함께 사용하는 기본적인 예제.


✅ 개요

  • Laravel 버전: 11
  • 브로드캐스팅 타입: PrivateChannel
  • 브로드캐스터: Reverb
  • 클라이언트: Laravel Echo + Pusher(JS) 호환
  • 보안: 인증된 사용자만 접근 가능한 프라이빗 채널

1. Reverb 설치 및 설정

🔧 Reverb 설치

composer require laravel/reverb
php artisan reverb:install

🧪 Reverb 서버 실행

php artisan reverb:start

📄 .env 설정

BROADCAST_DRIVER=reverb

2. 이벤트 생성

php artisan make:event OrderShipped

📄 OrderShipped.php

use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class OrderShipped implements ShouldBroadcast
{
    public $order;

    public function __construct($order)
    {
        $this->order = $order;
    }

    public function broadcastOn(): PrivateChannel
    {
        return new PrivateChannel('orders.' . $this->order->user_id);
    }

    public function broadcastWith(): array
    {
        return ['order' => $this->order];
    }
}

3. 브로드캐스트 인증 설정

📄 routes/api.php 또는 routes/channels.php

Broadcast::channel('orders.{userId}', function ($user, $userId) {
    return (int) $user->id === (int) $userId;
});

4. 클라이언트 설정 (Echo + Pusher JS)

📦 설치

npm install laravel-echo pusher-js

📄 resources/js/bootstrap.js 예시

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY, // .env 설정과 일치하게
    wsHost: window.location.hostname,
    wsPort: 6001,
    forceTLS: false,
    disableStats: true,
    enabledTransports: ['ws', 'wss'],
    authEndpoint: '/broadcasting/auth',
});

5. 프론트에서 구독

window.Echo.private(`orders.${userId}`)
    .listen('OrderShipped', (e) => {
        console.log('Order shipped:', e.order);
    });

6. 인증 미들웨어 (/broadcasting/auth)

Laravel은 기본적으로 인증된 사용자에 대해 /broadcasting/auth를 제공합니다. 로그인 사용자만 채널에 접근할 수 있습니다. web 또는 sanctum을 이용한 인증이 필요합니다.


✅ 요약

 

구성요소 설명
이벤트 OrderShipped implements ShouldBroadcast
채널 PrivateChannel 사용
인증 routes/channels.php에서 사용자 ID 비교
서버 Reverb (php artisan reverb:start)
클라이언트 Echo + Pusher.js
반응형