패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.
페이지 듣기약 9분
패키지가 실시간 이벤트를 전송할 때는 채널 이름의 정의와 사용자를 통과시키는 판정을 나누어 설계합니다. 패키지의 boot()에서 등록한 채널은 사용하는 애플리케이션의 routes/channels.php와 이름이 같으면 덮어써질 수 있습니다. 이 등록 순서와 평가 순서를 이해해 두면 유지보수 시의 버그를 줄일 수 있습니다.이 페이지는 Laravel 공식 문서의 브로드캐스팅과 확인에 사용한 최신 릴리스 v13.42.0의 구현을 참조합니다. 이벤트를 전송하는 방법은 브로드캐스팅을, 프로바이더를 불러오는 방법은 패키지 자동 검색을 참조하세요.
채널 인가의 동작 방식
프라이빗 채널을 구독하면 클라이언트는 /broadcasting/auth로 요청을 보냅니다. BroadcastController::authenticate()는 처리를 Broadcast::auth()에 넘기고, Broadcaster가 등록된 콜백을 순서대로 평가합니다.평가 규칙은 다음과 같습니다.
콜백이 false를 반환하면 그 시점에 AccessDeniedHttpException이 발생합니다.
true 같은 참 값을 반환하면 그 시점에 인가가 성립합니다.
null 같은 거짓 값을 반환하면 다음에 등록된 콜백으로 넘어갑니다. 어느 콜백도 통과시키지 않으면 마지막에 AccessDeniedHttpException이 발생합니다.
Pusher와 Reverb 드라이버는 인가 전에 private-와 presence- 접두사를 제거합니다. 따라서 등록하는 채널 이름에는 접두사를 포함하지 마세요.
패키지에서 채널 등록하기
예로, 가상의 Acme\Orders 패키지에서 주문 상태 변화를 전송합니다. 채널 이름은 acme.orders.{order}로 하고, 주문 소유자만 구독할 수 있게 합니다.패키지의 ServiceProvider에서는 boot() 안에서 Broadcast::channel()을 호출합니다. 판정은 패키지 내부 클래스에 위임합니다.
use Acme\Orders\Broadcasting\OrderChannel;use Illuminate\Support\Facades\Broadcast;public function boot(): void{ Broadcast::channel('acme.orders.{order}', OrderChannel::class);}
<?phpnamespace Acme\Orders\Broadcasting;use Acme\Orders\Models\Order;use Illuminate\Contracts\Auth\Authenticatable;class OrderChannel{ public function join(Authenticatable $user, Order $order): bool { return $user->getAuthIdentifier() === $order->owner_id; }}
join()의 첫 번째 인수에는 인가 시점의 사용자가 전달됩니다. 이후 인수는 채널 이름의 {...} 값입니다. {order} 파라미터 이름과 Order $order가 일치하고 타입이 UrlRoutable의 서브클래스이면 라우트 모델 바인딩이 동작합니다.
Broadcast::channel()의 $callback에는 callable 또는 join() 메서드를 가진 클래스 이름을 지정할 수 있습니다. 클래스 이름인 경우 Broadcaster::normalizeChannelHandlerToCallable()이 컨테이너로 인스턴스를 생성한 뒤 join()을 호출합니다.
사용하는 애플리케이션에 의한 덮어쓰기
사용하는 애플리케이션이 withBroadcasting()에 전달한 파일(보통 routes/channels.php)은 withBroadcasting()이 등록하는 booted 콜백 안에서 불러옵니다. booted 콜백은 모든 서비스 프로바이더의 boot()가 끝난 뒤에 실행되므로, 패키지 boot()의 등록이 먼저 이루어집니다.
순서
처리
등록되는 것
1
패키지의 boot()
acme.orders.{order}의 콜백
2
애플리케이션 booted에서의 라우트 로드
routes/channels.php의 콜백
Broadcaster::channel()은 채널 이름을 키로 하여 내부 배열에 저장합니다. 따라서 사용하는 애플리케이션이 같은 이름을 등록하면 두 번째 등록이 패키지의 등록을 대체합니다. Laravel은 같은 이름의 등록을 중복 오류로 처리하지 않습니다.덮어쓰기를 막으려면 채널 이름을 고유하게 만드세요. 예를 들어 acme.orders.{order}처럼 패키지 고유의 접두사를 붙이면 사용하는 애플리케이션이 같은 이름을 등록할 가능성이 낮아집니다.
채널 이름은 클라이언트와의 공개된 계약입니다. 한 번 정하면 변경하지 마세요. 변경하면 기존 클라이언트가 구독할 수 없게 됩니다.
같은 이름의 채널은 나중에 등록한 것이 조용히 우선합니다. php artisan channel:list에서는 채널 이름과 해석 대상(클래스 이름 또는 Closure)이 표시되므로 어느 등록이 남아 있는지 확인할 수 있습니다.
채널 옵션과 가드
Broadcast::channel()의 세 번째 인수 $options는 채널별 설정으로 저장됩니다. guards를 지정하면 인증에 사용할 가드를 순서대로 시도합니다.
guards를 생략하면 요청의 기본 사용자($request->user())를 인가에 사용합니다. guards를 지정하면 앞에서부터 순서대로 $request->user($guard)를 호출하고, 처음 얻은 사용자를 사용합니다. 패키지 쪽에서 가드 이름을 고정하지 않고 설정값으로 공개하면 사용하는 애플리케이션이 선택할 수 있습니다.
테스트에서 채널 등록 확인하기
등록된 채널은 드라이버의 getChannels()로 Collection으로 가져올 수 있습니다. 키는 채널 이름 그 자체입니다.
use Illuminate\Support\Facades\Broadcast;public function test_package_registers_order_channel(): void{ $channels = Broadcast::driver()->getChannels(); $this->assertTrue($channels->has('acme.orders.{order}'));}
인가 결과는 /broadcasting/auth에 대한 HTTP 테스트로 확인합니다. null과 log 드라이버는 auth()가 아무것도 반환하지 않으므로 이 테스트에는 사용할 수 없습니다. 채널은 애플리케이션 시작 시 기본 드라이버에 등록되므로, 테스트용 phpunit.xml 등에서 BROADCAST_CONNECTION을 reverb나 pusher로 설정한 뒤 인증된 요청을 보냅니다.
테스트 앱에 /broadcasting/auth가 등록되어 있어야 합니다. 이 라우트는 Broadcast::routes()가 등록하며, BroadcastManager::channelRoutes()는 같은 처리를 routes()에 맡길 뿐입니다. 라우트가 캐시되어 있으면 routes()는 아무것도 하지 않습니다.
유지보수 시 주의점
채널 이름은 공개된 계약입니다. 이름을 변경하면 기존 클라이언트가 구독할 수 없게 됩니다.
클래스 기반 채널은 Container로 해석됩니다. 생성자의 의존성은 컨테이너로 해석할 수 있는 타입으로 하세요.
정리
패키지의 채널 인가는 boot()에서 Broadcast::channel()을 등록하면 동작합니다. 사용하는 애플리케이션의 routes/channels.php가 같은 이름을 나중에 등록하면 패키지의 인가는 대체됩니다. 채널 이름에 접두사를 붙이고, 판정을 클래스로 분리하고, HTTP 테스트로 /broadcasting/auth의 결과를 확인하면 유지보수하기 쉬워집니다.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Knowledge of Laravel","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146","dark":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/dark.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=a8a0340d86ff8aa90e9adfc98a0362d7","href":"/"},"favicon":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/favicon.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=8f5a03a681c95d31803fc237b5811065","api":{"playground":{"display":"simple"}},"navbar":{},"footer":{"socials":{"github":"https://github.com/invokable"}},"seo":{"metatags":{"canonical":"https://kawax.biz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"jp","default":true,"href":"jp/packages/laravel-boost-copilot-cli"},{"language":"en","href":"en/packages/laravel-boost-copilot-cli"},{"language":"de","href":"de/packages/laravel-boost-copilot-cli"},{"language":"es","href":"es/packages/laravel-boost-copilot-cli"},{"language":"fr","href":"fr/packages/laravel-boost-copilot-cli"},{"language":"it","href":"it/packages/laravel-boost-copilot-cli"},{"language":"ko","href":"ko/packages/laravel-boost-copilot-cli"},{"language":"nl","href":"nl/packages/laravel-boost-copilot-cli"},{"language":"zh-Hans","href":"zh-CN/packages/laravel-boost-copilot-cli"},{"language":"zh-Hant","href":"zh-TW/packages/laravel-boost-copilot-cli"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"invokable","hasAudioNarration":true,"actualSubdomain":"invokable","customDomains":["kawax.biz"],"gitSource":{"type":"github","owner":"kawax","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af8eedb4f86660c4a25f1d6","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"en","tag":"My Packages","count":145},{"language":"jp","tag":"マイパッケージ","count":145},{"language":"de","tag":"Meine Pakete","count":100},{"language":"es","tag":"Mis paquetes","count":100},{"language":"fr","tag":"Mes packages","count":100},{"language":"it","tag":"I miei pacchetti","count":100},{"language":"ko","tag":"My 패키지","count":100},{"language":"nl","tag":"Mijn packages","count":100},{"language":"zh-Hans","tag":"我的包","count":100},{"language":"zh-Hant","tag":"我的套件","count":100},{"language":"de","tag":"Fortgeschrittene Themen","count":85},{"language":"en","tag":"Advanced Topics","count":85},{"language":"es","tag":"Temas avanzados","count":85},{"language":"fr","tag":"Sujets avancés","count":85},{"language":"it","tag":"Argomenti avanzati","count":85},{"language":"jp","tag":"応用トピック","count":85},{"language":"ko","tag":"심화 주제","count":85},{"language":"nl","tag":"Geavanceerde onderwerpen","count":85},{"language":"zh-Hans","tag":"进阶主题","count":85},{"language":"zh-Hant","tag":"進階主題","count":85},{"language":"en","tag":"VOICEVOX","count":67},{"language":"jp","tag":"VOICEVOX","count":67},{"language":"de","tag":"Leitfaden","count":61},{"language":"en","tag":"Guide","count":61},{"language":"es","tag":"Guía","count":61},{"language":"fr","tag":"Guide","count":61},{"language":"it","tag":"Guida","count":61},{"language":"jp","tag":"ガイド","count":61},{"language":"ko","tag":"가이드","count":61},{"language":"nl","tag":"Gids","count":61},{"language":"zh-Hans","tag":"指南","count":61},{"language":"zh-Hant","tag":"指南","count":61},{"language":"de","tag":"Blog","count":47},{"language":"en","tag":"Blog","count":47},{"language":"es","tag":"Blog","count":47},{"language":"fr","tag":"Blog","count":47},{"language":"it","tag":"Blog","count":47},{"language":"jp","tag":"ブログ","count":47},{"language":"ko","tag":"블로그","count":47},{"language":"nl","tag":"Blog","count":47},{"language":"zh-Hans","tag":"博客","count":47},{"language":"zh-Hant","tag":"部落格","count":47},{"language":"de","tag":"Paketentwicklung","count":46},{"language":"en","tag":"Package Development","count":46},{"language":"es","tag":"Desarrollo de paquetes","count":46},{"language":"fr","tag":"Développement de packages","count":46},{"language":"it","tag":"Sviluppo di pacchetti","count":46},{"language":"jp","tag":"パッケージ開発","count":46},{"language":"ko","tag":"패키지 개발","count":46},{"language":"nl","tag":"Package-ontwikkeling","count":46},{"language":"zh-Hans","tag":"包开发","count":46},{"language":"zh-Hant","tag":"套件開發","count":46},{"language":"en","tag":"VOICEVOX Engine API Reference","count":45},{"language":"jp","tag":"VOICEVOXエンジンAPIリファレンス","count":45},{"language":"de","tag":"GitHub Copilot","count":43},{"language":"en","tag":"GitHub Copilot","count":43},{"language":"es","tag":"GitHub Copilot","count":43},{"language":"fr","tag":"GitHub Copilot","count":43},{"language":"it","tag":"GitHub Copilot","count":43},{"language":"jp","tag":"GitHub Copilot","count":43},{"language":"ko","tag":"GitHub Copilot","count":43},{"language":"nl","tag":"GitHub Copilot","count":43},{"language":"zh-Hans","tag":"GitHub Copilot","count":43},{"language":"zh-Hant","tag":"GitHub Copilot","count":43},{"language":"de","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"en","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"es","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"fr","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"it","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"jp","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"ko","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"nl","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hans","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hant","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"de","tag":"Tutorial","count":35},{"language":"en","tag":"Tutorial","count":35},{"language":"es","tag":"Tutorial","count":35},{"language":"fr","tag":"Tutoriel","count":35},{"language":"it","tag":"Tutorial","count":35},{"language":"jp","tag":"チュートリアル","count":35},{"language":"ko","tag":"튜토리얼","count":35},{"language":"nl","tag":"Tutorial","count":35},{"language":"zh-Hans","tag":"教程","count":35},{"language":"zh-Hant","tag":"教學","count":35},{"language":"de","tag":"SDK","count":27},{"language":"es","tag":"SDK","count":27},{"language":"fr","tag":"SDK","count":27},{"language":"it","tag":"SDK","count":27},{"language":"ko","tag":"SDK","count":27},{"language":"nl","tag":"SDK","count":27},{"language":"zh-Hans","tag":"SDK","count":27},{"language":"zh-Hant","tag":"SDK","count":27},{"language":"de","tag":"VOICEVOX","count":22},{"language":"es","tag":"VOICEVOX","count":22},{"language":"fr","tag":"VOICEVOX","count":22},{"language":"it","tag":"VOICEVOX","count":22},{"language":"ko","tag":"VOICEVOX","count":22},{"language":"nl","tag":"VOICEVOX","count":22},{"language":"zh-Hans","tag":"VOICEVOX","count":22},{"language":"zh-Hant","tag":"VOICEVOX","count":22}],"searchSettings":{"isFiltersEnabled":false,"showContentSnippets":true,"fullPageSearch":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"ko/advanced/package-broadcasting","slug":"/ko/advanced/package-broadcasting","pageMetadata":{"title":"패키지의 브로드캐스트 채널 인가와 덮어쓰기","description":"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.","href":"/ko/advanced/package-broadcasting"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`패키지가 실시간 이벤트를 전송할 때는 `,_jsx(_components.strong,{children:`채널 이름의 정의`}),`와 `,_jsx(_components.strong,{children:`사용자를 통과시키는 판정`}),`을 나누어 설계합니다. 패키지의 `,_jsx(_components.code,{children:`boot()`}),`에서 등록한 채널은 사용하는 애플리케이션의 `,_jsx(_components.code,{children:`routes/channels.php`}),`와 이름이 같으면 덮어써질 수 있습니다. 이 등록 순서와 평가 순서를 이해해 두면 유지보수 시의 버그를 줄일 수 있습니다.`]}),`\n`,_jsxs(_components.p,{children:[`이 페이지는 Laravel 공식 문서의 `,_jsx(_components.a,{href:`/ko/broadcasting`,children:`브로드캐스팅`}),`과 확인에 사용한 최신 릴리스 `,_jsx(_components.code,{children:`v13.42.0`}),`의 구현을 참조합니다. 이벤트를 전송하는 방법은 `,_jsx(_components.a,{href:`/ko/broadcasting`,children:`브로드캐스팅`}),`을, 프로바이더를 불러오는 방법은 `,_jsx(_components.a,{href:`/ko/advanced/package-discovery`,children:`패키지 자동 검색`}),`을 참조하세요.`]}),`\n`,_jsx(Heading,{level:`2`,id:`채널-인가의-동작-방식`,children:`채널 인가의 동작 방식`}),`\n`,_jsxs(_components.p,{children:[`프라이빗 채널을 구독하면 클라이언트는 `,_jsx(_components.code,{children:`/broadcasting/auth`}),`로 요청을 보냅니다. `,_jsx(_components.code,{children:`BroadcastController::authenticate()`}),`는 처리를 `,_jsx(_components.code,{children:`Broadcast::auth()`}),`에 넘기고, `,_jsx(_components.code,{children:`Broadcaster`}),`가 등록된 콜백을 순서대로 평가합니다.`]}),`\n`,_jsx(_components.p,{children:`평가 규칙은 다음과 같습니다.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`콜백이 `,_jsx(_components.code,{children:`false`}),`를 반환하면 그 시점에 `,_jsx(_components.code,{children:`AccessDeniedHttpException`}),`이 발생합니다.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`true`}),` 같은 참 값을 반환하면 그 시점에 인가가 성립합니다.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`null`}),` 같은 거짓 값을 반환하면 다음에 등록된 콜백으로 넘어갑니다. 어느 콜백도 통과시키지 않으면 마지막에 `,_jsx(_components.code,{children:`AccessDeniedHttpException`}),`이 발생합니다.`]}),`\n`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Pusher`}),`와 `,_jsx(_components.code,{children:`Reverb`}),` 드라이버는 인가 전에 `,_jsx(_components.code,{children:`private-`}),`와 `,_jsx(_components.code,{children:`presence-`}),` 접두사를 제거합니다. 따라서 등록하는 채널 이름에는 접두사를 포함하지 마세요.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`패키지에서-채널-등록하기`,children:`패키지에서 채널 등록하기`}),`\n`,_jsxs(_components.p,{children:[`예로, 가상의 `,_jsx(_components.code,{children:`Acme\\\\Orders`}),` 패키지에서 주문 상태 변화를 전송합니다. 채널 이름은 `,_jsx(_components.code,{children:`acme.orders.{order}`}),`로 하고, 주문 소유자만 구독할 수 있게 합니다.`]}),`\n`,_jsxs(_components.p,{children:[`패키지의 `,_jsx(_components.code,{children:`ServiceProvider`}),`에서는 `,_jsx(_components.code,{children:`boot()`}),` 안에서 `,_jsx(_components.code,{children:`Broadcast::channel()`}),`을 호출합니다. 판정은 패키지 내부 클래스에 위임합니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Acme\\\\Orders\\\\Broadcasting\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OrderChannel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Broadcast`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` boot`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Broadcast`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`channel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'acme.orders.{order}'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OrderChannel`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`\u003c?`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`php`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`namespace`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Acme\\\\Orders\\\\Broadcasting`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Acme\\\\Orders\\\\Models\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Order`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Contracts\\\\Auth\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Authenticatable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` OrderChannel`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` join`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Authenticatable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Order`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $order`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` bool`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getAuthIdentifier`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`===`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $order`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`owner_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`join()`}),`의 첫 번째 인수에는 인가 시점의 사용자가 전달됩니다. 이후 인수는 채널 이름의 `,_jsx(_components.code,{children:`{...}`}),` 값입니다. `,_jsx(_components.code,{children:`{order}`}),` 파라미터 이름과 `,_jsx(_components.code,{children:`Order $order`}),`가 일치하고 타입이 `,_jsx(_components.code,{children:`UrlRoutable`}),`의 서브클래스이면 라우트 모델 바인딩이 동작합니다.`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Broadcast::channel()`}),`의 `,_jsx(_components.code,{children:`$callback`}),`에는 `,_jsx(_components.code,{children:`callable`}),` 또는 `,_jsx(_components.code,{children:`join()`}),` 메서드를 가진 클래스 이름을 지정할 수 있습니다. 클래스 이름인 경우 `,_jsx(_components.code,{children:`Broadcaster::normalizeChannelHandlerToCallable()`}),`이 컨테이너로 인스턴스를 생성한 뒤 `,_jsx(_components.code,{children:`join()`}),`을 호출합니다.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`사용하는-애플리케이션에-의한-덮어쓰기`,children:`사용하는 애플리케이션에 의한 덮어쓰기`}),`\n`,_jsxs(_components.p,{children:[`사용하는 애플리케이션이 `,_jsx(_components.code,{children:`withBroadcasting()`}),`에 전달한 파일(보통 `,_jsx(_components.code,{children:`routes/channels.php`}),`)은 `,_jsx(_components.code,{children:`withBroadcasting()`}),`이 등록하는 `,_jsx(_components.code,{children:`booted`}),` 콜백 안에서 불러옵니다. `,_jsx(_components.code,{children:`booted`}),` 콜백은 모든 서비스 프로바이더의 `,_jsx(_components.code,{children:`boot()`}),`가 끝난 뒤에 실행되므로, 패키지 `,_jsx(_components.code,{children:`boot()`}),`의 등록이 먼저 이루어집니다.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`순서`}),_jsx(_components.th,{children:`처리`}),_jsx(_components.th,{children:`등록되는 것`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsxs(_components.td,{children:[`패키지의 `,_jsx(_components.code,{children:`boot()`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`acme.orders.{order}`}),`의 콜백`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`2`}),_jsxs(_components.td,{children:[`애플리케이션 `,_jsx(_components.code,{children:`booted`}),`에서의 라우트 로드`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`routes/channels.php`}),`의 콜백`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Broadcaster::channel()`}),`은 채널 이름을 키로 하여 내부 배열에 저장합니다. 따라서 사용하는 애플리케이션이 같은 이름을 등록하면 두 번째 등록이 패키지의 등록을 대체합니다. Laravel은 같은 이름의 등록을 중복 오류로 처리하지 않습니다.`]}),`\n`,_jsxs(_components.p,{children:[`덮어쓰기를 막으려면 채널 이름을 고유하게 만드세요. 예를 들어 `,_jsx(_components.code,{children:`acme.orders.{order}`}),`처럼 패키지 고유의 접두사를 붙이면 사용하는 애플리케이션이 같은 이름을 등록할 가능성이 낮아집니다.\n채널 이름은 클라이언트와의 공개된 계약입니다. 한 번 정하면 변경하지 마세요. 변경하면 기존 클라이언트가 구독할 수 없게 됩니다.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`같은 이름의 채널은 나중에 등록한 것이 조용히 우선합니다. `,_jsx(_components.code,{children:`php artisan channel:list`}),`에서는 채널 이름과 해석 대상(클래스 이름 또는 `,_jsx(_components.code,{children:`Closure`}),`)이 표시되므로 어느 등록이 남아 있는지 확인할 수 있습니다.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`채널-옵션과-가드`,children:`채널 옵션과 가드`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Broadcast::channel()`}),`의 세 번째 인수 `,_jsx(_components.code,{children:`$options`}),`는 채널별 설정으로 저장됩니다. `,_jsx(_components.code,{children:`guards`}),`를 지정하면 인증에 사용할 가드를 순서대로 시도합니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Broadcast`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`channel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'acme.orders.{order}'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OrderChannel`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'guards'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'web'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'api'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`guards`}),`를 생략하면 요청의 기본 사용자(`,_jsx(_components.code,{children:`$request->user()`}),`)를 인가에 사용합니다. `,_jsx(_components.code,{children:`guards`}),`를 지정하면 앞에서부터 순서대로 `,_jsx(_components.code,{children:`$request->user($guard)`}),`를 호출하고, 처음 얻은 사용자를 사용합니다. 패키지 쪽에서 가드 이름을 고정하지 않고 설정값으로 공개하면 사용하는 애플리케이션이 선택할 수 있습니다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`테스트에서-채널-등록-확인하기`,children:`테스트에서 채널 등록 확인하기`}),`\n`,_jsxs(_components.p,{children:[`등록된 채널은 드라이버의 `,_jsx(_components.code,{children:`getChannels()`}),`로 `,_jsx(_components.code,{children:`Collection`}),`으로 가져올 수 있습니다. 키는 채널 이름 그 자체입니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Illuminate\\\\Support\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Broadcast`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_package_registers_order_channel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $channels`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Broadcast`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`driver`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getChannels`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertTrue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$channels`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`has`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'acme.orders.{order}'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`인가 결과는 `,_jsx(_components.code,{children:`/broadcasting/auth`}),`에 대한 HTTP 테스트로 확인합니다. `,_jsx(_components.code,{children:`null`}),`과 `,_jsx(_components.code,{children:`log`}),` 드라이버는 `,_jsx(_components.code,{children:`auth()`}),`가 아무것도 반환하지 않으므로 이 테스트에는 사용할 수 없습니다. 채널은 애플리케이션 시작 시 기본 드라이버에 등록되므로, 테스트용 `,_jsx(_components.code,{children:`phpunit.xml`}),` 등에서 `,_jsx(_components.code,{children:`BROADCAST_CONNECTION`}),`을 `,_jsx(_components.code,{children:`reverb`}),`나 `,_jsx(_components.code,{children:`pusher`}),`로 설정한 뒤 인증된 요청을 보냅니다.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Acme\\\\Orders\\\\Models\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Order`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` App\\\\Models\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`User`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`public`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` test_owner_can_join_order_channel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` void`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` User`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`factory`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $order`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Order`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`factory`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'owner'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` $this`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`actingAs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$user`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'/broadcasting/auth'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'channel_name'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'private-acme.orders.'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$order`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'socket_id'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '1234.5678'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ])`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`assertOk`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`테스트 앱에 `,_jsx(_components.code,{children:`/broadcasting/auth`}),`가 등록되어 있어야 합니다. 이 라우트는 `,_jsx(_components.code,{children:`Broadcast::routes()`}),`가 등록하며, `,_jsx(_components.code,{children:`BroadcastManager::channelRoutes()`}),`는 같은 처리를 `,_jsx(_components.code,{children:`routes()`}),`에 맡길 뿐입니다. 라우트가 캐시되어 있으면 `,_jsx(_components.code,{children:`routes()`}),`는 아무것도 하지 않습니다.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`유지보수-시-주의점`,children:`유지보수 시 주의점`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`채널 이름은 공개된 계약입니다. 이름을 변경하면 기존 클라이언트가 구독할 수 없게 됩니다.`}),`\n`,_jsxs(_components.li,{children:[`클래스 기반 채널은 `,_jsx(_components.code,{children:`Container`}),`로 해석됩니다. 생성자의 의존성은 컨테이너로 해석할 수 있는 타입으로 하세요.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`정리`,children:`정리`}),`\n`,_jsxs(_components.p,{children:[`패키지의 채널 인가는 `,_jsx(_components.code,{children:`boot()`}),`에서 `,_jsx(_components.code,{children:`Broadcast::channel()`}),`을 등록하면 동작합니다. 사용하는 애플리케이션의 `,_jsx(_components.code,{children:`routes/channels.php`}),`가 같은 이름을 나중에 등록하면 패키지의 인가는 대체됩니다. 채널 이름에 접두사를 붙이고, 판정을 클래스로 분리하고, HTTP 테스트로 `,_jsx(_components.code,{children:`/broadcasting/auth`}),`의 결과를 확인하면 유지보수하기 쉬워집니다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`참조한-1차-정보`,children:`참조한 1차 정보`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/docs/blob/13.x/broadcasting.md`,children:`Laravel 공식 문서: 브로드캐스팅`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.42.0/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php`,children:`Framework v13.42.0: Broadcaster`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.42.0/src/Illuminate/Broadcasting/Broadcasters/UsePusherChannelConventions.php`,children:`Framework v13.42.0: UsePusherChannelConventions`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.42.0/src/Illuminate/Broadcasting/BroadcastManager.php`,children:`Framework v13.42.0: BroadcastManager`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.42.0/src/Illuminate/Foundation/Configuration/ApplicationBuilder.php`,children:`Framework v13.42.0: ApplicationBuilder`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.42.0/src/Illuminate/Broadcasting/BroadcastController.php`,children:`Framework v13.42.0: BroadcastController`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://github.com/laravel/framework/blob/v13.42.0/src/Illuminate/Foundation/Console/ChannelListCommand.php`,children:`Framework v13.42.0: channel:list 명령어`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"패키지의 브로드캐스트 채널 인가와 덮어쓰기","description":"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.","href":"/ko/advanced/package-broadcasting"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"채널 인가의 동작 방식","slug":"채널-인가의-동작-방식","depth":2,"children":[]},{"title":"패키지에서 채널 등록하기","slug":"패키지에서-채널-등록하기","depth":2,"children":[]},{"title":"사용하는 애플리케이션에 의한 덮어쓰기","slug":"사용하는-애플리케이션에-의한-덮어쓰기","depth":2,"children":[]},{"title":"채널 옵션과 가드","slug":"채널-옵션과-가드","depth":2,"children":[]},{"title":"테스트에서 채널 등록 확인하기","slug":"테스트에서-채널-등록-확인하기","depth":2,"children":[]},{"title":"유지보수 시 주의점","slug":"유지보수-시-주의점","depth":2,"children":[]},{"title":"정리","slug":"정리","depth":2,"children":[]},{"title":"참조한 1차 정보","slug":"참조한-1차-정보","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"narration":{"path":"ko/advanced/package-broadcasting","locale":"ko","estimatedDurationSec":558},"subdomain":"invokable","siteName":"Knowledge of Laravel","title":"패키지의 브로드캐스트 채널 인가와 덮어쓰기 - Knowledge of Laravel","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"jp":{"href":"/jp/advanced/package-broadcasting","matchLevel":1},"en":{"href":"/en/advanced/package-broadcasting","matchLevel":1},"de":{"href":"/de/advanced/package-broadcasting","matchLevel":1},"es":{"href":"/es/advanced/package-broadcasting","matchLevel":1},"fr":{"href":"/fr/advanced/package-broadcasting","matchLevel":1},"it":{"href":"/it/advanced/package-broadcasting","matchLevel":1},"ko":{"href":"/ko/advanced/package-broadcasting","matchLevel":0},"nl":{"href":"/nl/advanced/package-broadcasting","matchLevel":1},"zh-Hans":{"href":"/zh-CN/advanced/package-broadcasting","matchLevel":1},"zh-Hant":{"href":"/zh-TW/advanced/package-broadcasting","matchLevel":1}}},"lastModified":"2026-11-14T23:29:40.948Z","gitLastModified":"2026-11-14T23:29:28.000Z","originalFileLocation":"ko/advanced/package-broadcasting.mdx","locale":"ko"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"패키지의 브로드캐스트 채널 인가와 덮어쓰기 - Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:description\" content=\"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://kawax.biz/ko/advanced/package-broadcasting\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://invokable.mintlify.site/_mintlify/api/og/v2?division=%ED%8C%A8%ED%82%A4%EC%A7%80+%EA%B0%9C%EB%B0%9C\u0026amp;title=%ED%8C%A8%ED%82%A4%EC%A7%80%EC%9D%98+%EB%B8%8C%EB%A1%9C%EB%93%9C%EC%BA%90%EC%8A%A4%ED%8A%B8+%EC%B1%84%EB%84%90+%EC%9D%B8%EA%B0%80%EC%99%80+%EB%8D%AE%EC%96%B4%EC%93%B0%EA%B8%B0\u0026amp;description=%ED%8C%A8%ED%82%A4%EC%A7%80%EA%B0%80+%ED%94%84%EB%9D%BC%EC%9D%B4%EB%B9%97+%EC%B1%84%EB%84%90%EC%9D%84+%EB%93%B1%EB%A1%9D%ED%95%A0+%EB%95%8C+%EC%9D%B8%EA%B0%80%EA%B0%80+%ED%8F%89%EA%B0%80%EB%90%98%EB%8A%94+%EC%88%9C%EC%84%9C%2C+%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94+%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%B4+%EC%9D%B4%EB%A5%BC+%EB%8D%AE%EC%96%B4%EC%93%B0%EB%8A%94+%EB%B0%A9%EC%8B%9D%2C+HTTP+%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A1%9C+%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94+%EB%B0%A9%EB%B2%95%EC%9D%84+%EC%84%A4%EB%AA%85%ED%95%A9%EB%8B%88%EB%8B%A4.\u0026amp;theme=cef70bdc0dd1884481ab7c5d\u0026amp;signature=563138ed6e4cd2d1d70071174390a0e80e2e7547bc383a5d19045d1929351af6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"패키지의 브로드캐스트 채널 인가와 덮어쓰기 - Knowledge of Laravel\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://invokable.mintlify.site/_mintlify/api/og/v2?division=%ED%8C%A8%ED%82%A4%EC%A7%80+%EA%B0%9C%EB%B0%9C\u0026amp;title=%ED%8C%A8%ED%82%A4%EC%A7%80%EC%9D%98+%EB%B8%8C%EB%A1%9C%EB%93%9C%EC%BA%90%EC%8A%A4%ED%8A%B8+%EC%B1%84%EB%84%90+%EC%9D%B8%EA%B0%80%EC%99%80+%EB%8D%AE%EC%96%B4%EC%93%B0%EA%B8%B0\u0026amp;description=%ED%8C%A8%ED%82%A4%EC%A7%80%EA%B0%80+%ED%94%84%EB%9D%BC%EC%9D%B4%EB%B9%97+%EC%B1%84%EB%84%90%EC%9D%84+%EB%93%B1%EB%A1%9D%ED%95%A0+%EB%95%8C+%EC%9D%B8%EA%B0%80%EA%B0%80+%ED%8F%89%EA%B0%80%EB%90%98%EB%8A%94+%EC%88%9C%EC%84%9C%2C+%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94+%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%B4+%EC%9D%B4%EB%A5%BC+%EB%8D%AE%EC%96%B4%EC%93%B0%EB%8A%94+%EB%B0%A9%EC%8B%9D%2C+HTTP+%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A1%9C+%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94+%EB%B0%A9%EB%B2%95%EC%9D%84+%EC%84%A4%EB%AA%85%ED%95%A9%EB%8B%88%EB%8B%A4.\u0026amp;theme=cef70bdc0dd1884481ab7c5d\u0026amp;signature=563138ed6e4cd2d1d70071174390a0e80e2e7547bc383a5d19045d1929351af6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://kawax.biz/ko/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/ko/advanced/package-broadcasting.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://kawax.biz/ko/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://kawax.biz/jp/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://kawax.biz/en/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://kawax.biz/de/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://kawax.biz/es/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://kawax.biz/fr/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://kawax.biz/it/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"nl\" href=\"https://kawax.biz/nl/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://kawax.biz/zh-CN/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hant\" href=\"https://kawax.biz/zh-TW/advanced/package-broadcasting\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://kawax.biz/jp/advanced/package-broadcasting\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://kawax.biz/#organization\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146\"}},{\"@type\":\"WebSite\",\"@id\":\"https://kawax.biz#website\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://kawax.biz/ko/advanced/package-broadcasting#webpage\",\"url\":\"https://kawax.biz/ko/advanced/package-broadcasting\",\"name\":\"패키지의 브로드캐스트 채널 인가와 덮어쓰기\",\"description\":\"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.\",\"dateModified\":\"2026-11-14T23:29:28.000Z\",\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"},\"breadcrumb\":{\"@id\":\"https://kawax.biz/ko/advanced/package-broadcasting#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://kawax.biz/ko/advanced/package-broadcasting#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"패키지 개발\",\"item\":\"https://kawax.biz/ko/advanced/package-development\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"패키지의 브로드캐스트 채널 인가와 덮어쓰기\",\"item\":\"https://kawax.biz/ko/advanced/package-broadcasting\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://kawax.biz/ko/advanced/package-broadcasting#article\",\"headline\":\"패키지의 브로드캐스트 채널 인가와 덮어쓰기\",\"name\":\"패키지의 브로드캐스트 채널 인가와 덮어쓰기\",\"description\":\"패키지가 프라이빗 채널을 등록할 때 인가가 평가되는 순서, 사용하는 애플리케이션이 이를 덮어쓰는 방식, HTTP 테스트로 확인하는 방법을 설명합니다.\",\"url\":\"https://kawax.biz/ko/advanced/package-broadcasting\",\"mainEntityOfPage\":{\"@id\":\"https://kawax.biz/ko/advanced/package-broadcasting#webpage\"},\"dateModified\":\"2026-11-14T23:29:28.000Z\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"},\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Knowledge of Laravel\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Knowledge of Laravel\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/ko/advanced/package-broadcasting.md","siteName":"Knowledge of Laravel","nav":{"global":null,"languages":[{"language":"jp","default":true,"pages":[{"title":"jp","href":"/jp/advanced/package-broadcasting"}]},{"language":"en","pages":[{"title":"en","href":"/en/advanced/package-broadcasting"}]},{"language":"de","pages":[{"title":"de","href":"/de/advanced/package-broadcasting"}]},{"language":"es","pages":[{"title":"es","href":"/es/advanced/package-broadcasting"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/advanced/package-broadcasting"}]},{"language":"it","pages":[{"title":"it","href":"/it/advanced/package-broadcasting"}]},{"language":"ko","tabs":[{"tab":"My 패키지","pages":[{"title":"My 패키지","href":"/ko/packages/laravel-boost-copilot-cli"}]},{"tab":"튜토리얼","pages":[{"title":"튜토리얼","href":"/ko/introduction"}]},{"tab":"가이드","pages":[{"title":"가이드","href":"/ko/lifecycle"}]},{"tab":"심화 주제","groups":[{"group":"AI 개발","pages":[{"title":"Laravel에서 MCP 서버 만들기","href":"/ko/advanced/mcp-server"},{"title":"Boost의 커스텀 에이전트 만들기","href":"/ko/advanced/boost-custom-agent"},{"title":"AI SDK의 커스텀 프로바이더 만들기","href":"/ko/advanced/ai-sdk-custom-provider"},{"title":"Laravel AI SDK의 에이전트 미들웨어","href":"/ko/advanced/ai-sdk-agent-middleware"}]},{"group":"디자인 패턴","pages":[{"title":"Pipeline 패턴","href":"/ko/advanced/pipeline"},{"title":"Fluent 클래스","href":"/ko/advanced/fluent"},{"title":"Macroable 트레이트","href":"/ko/advanced/macroable"},{"title":"Conditionable 트레이트","href":"/ko/advanced/conditionable"},{"title":"InteractsWithTime 트레이트","href":"/ko/advanced/interacts-with-time"},{"title":"ForwardsCalls 트레이트","href":"/ko/advanced/forwards-calls"},{"title":"tap() 헬퍼와 Tappable 트레이트","href":"/ko/advanced/tap"},{"title":"once() 헬퍼의 내부 구현 — Once·Onceable·PreventsCircularRecursion","href":"/ko/advanced/once-helper"},{"title":"Dumpable 트레이트","href":"/ko/advanced/dumpable"},{"title":"Support Contracts (Arrayable / Jsonable / Htmlable / Responsable)","href":"/ko/advanced/support-contracts"},{"title":"Lottery 클래스","href":"/ko/advanced/lottery"},{"title":"컬렉션의 고차 메시지","href":"/ko/advanced/higher-order-messages"},{"title":"Collection Deep Dive","href":"/ko/advanced/collection-deep-dive"},{"title":"Illuminate\\Support\\Manager — 드라이버 시스템의 해부","href":"/ko/advanced/manager"},{"title":"PHP Reflection API","href":"/ko/advanced/php-reflection"},{"title":"PHP FFI","href":"/ko/advanced/ffi"},{"title":"PHP AST","href":"/ko/advanced/php-ast"}]},{"group":"패키지 개발","pages":[{"title":"Laravel 패키지 개발","href":"/ko/advanced/package-development"},{"title":"패키지 자동 감지의 내부 구조","href":"/ko/advanced/package-discovery"},{"title":"InteractsWithData 트레이트","href":"/ko/advanced/interacts-with-data"},{"title":"지연 서비스 프로바이더","href":"/ko/advanced/deferred-provider"},{"title":"패키지의 버전 호환성 관리","href":"/ko/advanced/package-versioning"},{"title":"GitHub Actions의 핀 고정과 보안","href":"/ko/advanced/github-actions-pinning"},{"title":"패키지의 CHANGELOG와 릴리스 관리","href":"/ko/advanced/package-changelog"},{"title":"Orchestra Testbench로 Laravel 패키지를 테스트하기","href":"/ko/advanced/package-testing"},{"title":"Testbench Workbench로 패키지 개발 진행하기","href":"/ko/advanced/package-workbench"},{"title":"GeneratorCommand — 커스텀 make: 명령어 구현","href":"/ko/advanced/generator-command"},{"title":"Laravel 스타터 킷 만드는 법","sidebarTitle":"스타터 킷 작성","href":"/ko/advanced/starter-kit-creation"},{"title":"패키지의 정적 해석 (PHPStan / Larastan)","href":"/ko/advanced/package-static-analysis"},{"title":"패키지 설정 병합과 캐시","href":"/ko/advanced/package-config-merging"},{"title":"패키지 마이그레이션의 배포와 업데이트","href":"/ko/advanced/package-migrations"},{"title":"패키지 뷰의 덮어쓰기와 업데이트","href":"/ko/advanced/package-views"},{"title":"패키지의 라우트 등록과 캐시","href":"/ko/advanced/package-routes"},{"title":"패키지 캐시와 optimize 통합","href":"/ko/advanced/package-optimization"},{"title":"패키지의 공개 에셋과 업데이트","href":"/ko/advanced/package-assets"},{"title":"패키지 번역의 덮어쓰기와 업데이트","href":"/ko/advanced/package-translations"},{"title":"패키지의 서비스 해석 후 훅","href":"/ko/advanced/package-service-resolution"},{"title":"패키지 진단 정보를 about에 추가하기","href":"/ko/advanced/package-about"},{"title":"패키지의 Artisan 명령어 등록과 의존성 해결","href":"/ko/advanced/package-commands"},{"title":"패키지의 이벤트 리스너 등록과 캐시","href":"/ko/advanced/package-events"},{"title":"패키지 서비스의 라이프사이클 설계","href":"/ko/advanced/package-service-lifetimes"},{"title":"패키지의 미들웨어 등록과 적용 범위","href":"/ko/advanced/package-middleware"},{"title":"패키지의 Blade 확장과 컴파일 캐시","href":"/ko/advanced/package-blade-extensions"},{"title":"패키지의 Storage 드라이버 등록과 재해석","href":"/ko/advanced/package-filesystem-drivers"},{"title":"패키지의 커스텀 알림 채널과 전송 검증","href":"/ko/advanced/package-notification-channels"},{"title":"패키지의 컨테이너 태그와 플러그인 집약","href":"/ko/advanced/package-container-tags"},{"title":"패키지의 HTTP 클라이언트와 테스트","href":"/ko/advanced/package-http-client"},{"title":"패키지의 로그 채널 확장과 재해석","href":"/ko/advanced/package-logging"},{"title":"패키지의 커스텀 캐시 스토어와 계약","href":"/ko/advanced/package-cache-drivers"},{"title":"패키지의 메일 트랜스포트 등록과 테스트","href":"/ko/advanced/package-mail-transports"},{"title":"패키지의 컨텍스트 속성과 의존성 해석","href":"/ko/advanced/package-contextual-attributes"},{"title":"패키지의 정기 태스크 등록과 유지보수","href":"/ko/advanced/package-scheduling"},{"title":"패키지의 커스텀 세션 드라이버","href":"/ko/advanced/package-session-drivers"},{"title":"패키지의 데이터베이스 연결 확장","href":"/ko/advanced/package-database-connections"},{"title":"패키지의 동적 관계 등록","href":"/ko/advanced/package-dynamic-relations"},{"title":"패키지의 문자열 유효성 검사 규칙 등록","sidebarTitle":"문자열 유효성 검사 규칙","href":"/ko/advanced/package-validation-extensions"},{"title":"패키지의 응답 Macro와 HTTP 계약","href":"/ko/advanced/package-response-macros"},{"title":"패키지의 서비스 데코레이션과 extend","href":"/ko/advanced/package-service-decoration"},{"title":"패키지의 인가 폴리시 등록과 재정의","href":"/ko/advanced/package-authorization"},{"title":"패키지의 Morph map과 저장 데이터의 호환성","href":"/ko/advanced/package-morph-maps"},{"title":"패키지의 큐 잡과 업데이트 시 호환성","href":"/ko/advanced/package-queue-jobs"},{"title":"패키지의 외부 프로세스 실행과 Process::fake","description":"Laravel 13의 Process facade를 사용해 외부 명령의 인수, 타임아웃, 실패 예외, 테스트에서의 fake와 배열 명령의 대조를 설명합니다.","href":"/ko/advanced/package-processes"},{"title":"패키지의 브로드캐스트 채널 인가와 덮어쓰기","href":"/ko/advanced/package-broadcasting"}]},{"group":"애플리케이션 구조","pages":[{"title":"Laravel 11 이후의 애플리케이션 구조","description":"Laravel 11에서 도입된 Slim Application Skeleton의 전모와, Application::configure()에서 ApplicationBuilder까지의 내부 구현을 해설합니다.","href":"/ko/advanced/app-structure"},{"title":"구 구조에서 새 구조로의 이관 가이드","sidebarTitle":"이관 가이드","href":"/ko/advanced/app-structure-migration"},{"title":"Laravel 11 이후의 새 앱 구조 FAQ","sidebarTitle":"새 앱 구조 FAQ","href":"/ko/advanced/app-structure-faq"}]},{"group":"Laravel 13 신기능","pages":[{"title":"PHP 어트리뷰트","href":"/ko/advanced/php-attributes"},{"title":"컨트롤러 PHP 어트리뷰트","sidebarTitle":"컨트롤러 어트리뷰트","href":"/ko/advanced/controller-attributes"}]},{"group":"Eloquent 심화","pages":[{"title":"Eloquent Observers와 모델 이벤트","href":"/ko/advanced/eloquent-observers"},{"title":"Eloquent의 스코프","href":"/ko/advanced/eloquent-scopes"},{"title":"Eloquent의 커스텀 캐스트","href":"/ko/advanced/eloquent-casts"},{"title":"Eloquent Bootable Traits","href":"/ko/advanced/eloquent-bootable-traits"},{"title":"커스텀 피벗 모델과 chaperone","href":"/ko/advanced/eloquent-custom-pivot"},{"title":"Eloquent의 afterQuery와 조회 결과의 계약","sidebarTitle":"afterQuery와 결과 가공","href":"/ko/advanced/eloquent-after-query"}]},{"group":"유효성 검증 확장","pages":[{"title":"커스텀 검증 규칙","href":"/ko/advanced/custom-validation-rules"}]},{"group":"인증 확장","pages":[{"title":"커스텀 인증 가드 구현","href":"/ko/advanced/custom-auth-guard"},{"title":"Laravel Fortify와 스타터 킷","href":"/ko/advanced/fortify"}]},{"group":"보안","pages":[{"title":"레이트 리밋 커스터마이즈","href":"/ko/advanced/rate-limiting"}]},{"group":"큐","pages":[{"title":"큐 잡 실행 제어","href":"/ko/advanced/queue-job-control"}]},{"group":"테스트","pages":[{"title":"Pest를 이용한 고급 테스트","href":"/ko/advanced/testing-pest"}]},{"group":"실시간","pages":[{"title":"Mercure 브로드캐스트 드라이버의 내부 구조","href":"/ko/advanced/mercure-broadcasting"}]}]},{"tab":"블로그","pages":[{"title":"블로그","href":"/ko/blog/changelog/202610"}]}]},{"language":"nl","pages":[{"title":"nl","href":"/nl/advanced/package-broadcasting"}]},{"language":"zh-Hans","pages":[{"title":"zh-Hans","href":"/zh-CN/advanced/package-broadcasting"}]},{"language":"zh-Hant","pages":[{"title":"zh-Hant","href":"/zh-TW/advanced/package-broadcasting"}]}]},"basePath":"","title":"패키지의 브로드캐스트 채널 인가와 덮어쓰기 - Knowledge of Laravel","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["2bfc744e19"],"chunks":["NarrationPlayer-bo2wtBX2.js","types-CiTgMxws.js","shallow-r9w8LQGS.js"]}