회원 알림 + 공지 브로드캐스트
Core Base/Notification 은 회원 알림 인프라(ADR-066)와 관리자 발신 공지형 브로드캐스트를 제공합니다. 모든 프로젝트에 symlink 로 자동 공유됩니다.
구성 요소
| 영역 | 설명 |
|---|---|
| 카테고리 5종 | system / security (강제 수신) · commerce / community (토글 가능) · marketing (opt-in 필수 — 정보통신망법 §50) |
| 사용자 환경설정 | 회원이 /user/notifications 에서 카테고리 × 채널(인앱/이메일) 토글 + 다이제스트 주기(즉시/일간/주간) |
| 인앱 알림센터 | 모든 관리 패널 헤더의 종 아이콘 드롭다운 + 회원 알림 목록 페이지 |
| 이메일 | 테넌트별 커스터마이징 가능한 이메일 템플릿 (TenantEmailRenderer) |
| 외부 채널 | ExternalNotification 플러그인 설치 시 SMS/카카오 알림톡/푸시/웹훅 자동 연동 |
도메인 알림 발행 (개발자)
CoreCategoryNotification 을 상속하면 채널 결정(사용자 환경설정 반영), 이메일 템플릿, 다이제스트, 외부 채널이 자동 처리됩니다.
class WelcomeNotification extends CoreCategoryNotification
{
protected function category(): NotificationCategory
{
return NotificationCategory::System;
}
protected function buildMailViewData(mixed $notifiable, ?TenantInterface $tenant): array
{
return ['title' => 'Welcome!', 'body' => "Hi, {$notifiable->name}"];
}
}
$user->notify(new WelcomeNotification());
공지 브로드캐스트 (운영자)
관리자가 직접 작성해서 회원에게 보내는 공지입니다. 사이트 관리 그룹 > 공지 알림 메뉴에서 사용합니다.
노출 조건
- 독립사이트 owner 패널(SaaS/Tenant) 또는 Platform 에서만 메뉴가 보입니다 (사이트 유형 게이트).
- feature key
announcements가 프로젝트config/permissions.php에 정의돼 있어야 하며(미정의 시 fail-closed 로 숨김), 서브관리자는 부여된 권한(read/create/update/delete + send/cancel/test_send)만 사용할 수 있습니다. - 작성은 사이트 패널(SaaS/Tenant)에서만 — 공지의 소유(어느 사이트의 공지인지)가 패널 컨텍스트에서 자동 결정됩니다. Platform 은 열람/발송/취소 운영만 담당합니다.
작성 옵션
| 옵션 | 설명 |
|---|---|
| 카테고리 | marketing 선택 시 수신 동의(opt-in) 회원에게만 전달 — 별도 처리 불필요 |
| 발송 대상 | 전체 회원 (사이트 범위) 또는 개별 회원 지정 (이름/이메일 검색) |
| 발송 채널 | 인앱(알림센터) + 이메일 — 이메일은 회원별 수신 설정을 따릅니다 |
| 신규 가입자 노출 | 켜면 발송 이후 가입한 회원에게도 계속 노출 (상시 공지). 끄면 발송 시점 회원만 (일회성) |
| 예약 시각 | 지정 후 발송 액션을 누르면 해당 시각에 자동 발송 |
발송 흐름
draft → (예약 시: scheduled) → sending → sent
└──────────┴─→ canceled (발송 전까지 취소 가능)
- 미리보기 / 나에게 테스트 발송으로 확인 후 발송하세요.
- 발송은 멱등입니다 — 중복 클릭/중복 cron 실행에도 한 번만 발송됩니다.
- 전체 공지는 회원 수와 무관하게 즉시 처리됩니다(공지 1행 + 읽음 상태 방식). 이메일은 큐에서 청크로 발송됩니다.
프로젝트 활성화 체크리스트
Core 코드는 자동 반영되지만, 프로젝트별로 다음이 필요합니다.
make migrate NAME={project}—announcements/announcement_reads테이블 생성 (미마이그레이션 상태에서도 기존 알림은 정상 동작 — 공지 기능만 비활성)config/permissions.php에announcementsfeature 블록 추가 (_template참조)- 예약 발송 사용 시
routes/console.php에 스케줄 등록:Schedule::command('announcements:send-scheduled')->everyFiveMinutes(); - 큐 워커 동작 확인 (이메일/개별 발송은 큐 잡)
이벤트 자동 알림 (템플릿 레지스트리)
가입 환영처럼 사이트 이용 중 자동으로 발송되는 알림의 문안을 관리페이지에서 관리합니다.
- 메뉴: 사이트 설정 > 알림 템플릿 — 코드가 등록한 이벤트 목록에서 선택해 문안(4언어)과 발송 채널을 오버라이드합니다. 오버라이드하지 않은 이벤트는 기본 문안으로 발송됩니다.
- 변수: 문안에
{name}같은 변수를 쓰면 발송 시점 값으로 치환됩니다 (편집 화면에 사용 가능한 변수 힌트 표시). - 채널: 인앱+이메일이 기본입니다. 시스템/보안 알림은 채널을 끌 수 없습니다. 카카오 알림톡 칸은 v2(외부 채널 연계)를 위한 준비 슬롯입니다.
- 개발자: 서비스 코드에서는
notify_event('이벤트키', $user, [변수])한 줄로 발행합니다. 새 이벤트는 ServiceProvider 에서NotificationEventRegistry에 등록합니다 (상세: CoreBase/Notification/README.md).
운영자 알림 (S2)
새 가입·1:1 문의·결제 완료를 사이트 운영자가 등록한 채널로 통보받습니다.
- 메뉴: 사이트 설정 > 운영자 알림 — 채널(이메일/웹훅[Slack·Discord]/텔레그램/카카오 알림톡)을 여러 개 등록하고, 이벤트별로 켜고 채널을 고릅니다. 테스트 발송으로 즉시 검증할 수 있습니다.
- 이벤트는 켠 것만 발송됩니다(opt-in) — 설정하지 않은 사이트는 아무 동작도 하지 않습니다.
- 알림톡 채널은 ExternalNotification 플러그인과 자격증명이 구성된 사이트에서만 발송됩니다.
- 개발자:
notify_operators('이벤트키', $saasId, $tenantId, [변수])— 새 운영자 이벤트는 레지스트리에audience: operator로 등록합니다.