구독 관리

작성자: admin 작성일: 2025-07-08
Function Guide

구독 관리 함수들

브라우저 푸시 구독자를 등록, 조회, 관리하는 핵심 함수들입니다. 회원/비회원 구독자를 모두 지원하며, 다양한 필터 조건으로 구독자를 선별할 수 있습니다.

save_push_subscription()

브라우저에서 받은 푸시 구독 정보를 데이터베이스에 저장합니다.
function save_push_subscription($subscription_data)

Parameters

$subscription_data

브라우저의 pushManager.subscribe()에서 받은 구독 정보 배열입니다.
필수 구조:
  • endpoint (String) - 푸시 서비스 엔드포인트 URL
  • keys['p256dh'] (String) - P-256 ECDH 공개키
  • keys['auth'] (String) - 인증 시크릿

Return Value

bool - 저장 성공 시 true, 실패 시 false

사용 예시

// JavaScript에서 받은 구독 정보
$subscription = array(
  'endpoint' => 'https://fcm.googleapis.com/fcm/send/...',
  'keys' => array(
    'p256dh' => 'BGtFqB7V9OZF...',
    'auth' => 'rF3dm4Ux...'
  )
);

if (save_push_subscription($subscription)) {
  echo '구독이 등록되었습니다.';
} else {
  echo '구독 등록에 실패했습니다.';
}

get_active_subscriptions()

다양한 필터 조건으로 활성 구독자 목록을 조회합니다. 푸시 발송 대상을 선별할 때 사용합니다.
function get_active_subscriptions($filters = array())

Parameters

$filters

구독자를 필터링할 조건들을 담은 배열입니다. 빈 배열 전달 시 모든 활성 구독자를 반환합니다.
사용 가능한 필터:
  • member_ids (Array) - 특정 회원 ID 목록
  • level (Int) - 회원 레벨
  • gender (String) - 성별 ('M' 또는 'F')
  • created_after (String) - 가입일 이후 (Y-m-d H:i:s)

Return Value

// 구독자 정보 배열
array(
  array(
    'endpoint' => 'https://fcm.googleapis.com/...',
    'keys' => array(
      'p256dh' => 'BGtFqB7V9OZF...',
      'auth' => 'rF3dm4Ux...'
    ),
    'member_id' => 'user123'
  )
  // ... 추가 구독자들
)

사용 예시

// 1. 모든 활성 구독자
$all_subscribers = get_active_subscriptions();

// 2. 특정 회원들만
$filters = array('member_ids' => array('admin', 'user1', 'user2'));
$specific_members = get_active_subscriptions($filters);

// 3. 레벨 10 이상 회원들
$vip_subscribers = get_active_subscriptions(array('level' => 10));

// 4. 최근 7일 내 가입한 회원들
$filters = array(
  'created_after' => date('Y-m-d H:i:s', strtotime('-7 days'))
);
$new_members = get_active_subscriptions($filters);

// 5. 남성 회원들만
$male_subscribers = get_active_subscriptions(array('gender' => 'M'));

get_subscription_stats()

구독자 통계 정보를 한 번에 조회합니다. 관리자 페이지나 대시보드에서 사용합니다.
function get_subscription_stats()

Return Value

array(
  'total' => 1500, // 전체 구독자 수
  'active' => 1350, // 활성 구독자 수
  'inactive' => 150, // 비활성 구독자 수
  'today' => 25, // 오늘 가입한 구독자 수
  'this_week' => 180 // 이번 주 가입한 구독자 수
)

사용 예시

$stats = get_subscription_stats();

echo '전체 구독자: ' . $stats['total'] . '명
'
;
echo '활성 구독자: ' . $stats['active'] . '명
'
;
echo '오늘 신규: ' . $stats['today'] . '명
'
;

// 활성화율 계산
$active_rate = ($stats['active'] / $stats['total']) * 100;
echo '활성화율: ' . round($active_rate, 1) . '%';

unsubscribe_push()

특정 엔드포인트의 구독을 해제합니다. 완전 삭제가 아닌 비활성화 처리합니다.
function unsubscribe_push($endpoint)

Parameters

$endpoint

구독 해제할 푸시 서비스 엔드포인트 URL입니다. 브라우저에서 받은 구독 정보의 endpoint 값을 사용합니다.

Return Value

bool - 해제 성공 시 true, 실패 시 false

사용 예시

// JavaScript에서 받은 엔드포인트
$endpoint = 'https://fcm.googleapis.com/fcm/send/cJhJBNJGqA...';

if (unsubscribe_push($endpoint)) {
  echo '구독이 해제되었습니다.';
} else {
  echo '구독 해제에 실패했습니다.';
}

편의 함수들

자주 사용하는 필터 조건들을 간편하게 사용할 수 있는 래퍼 함수들입니다.

get_subscriptions_by_level()

// 특정 레벨 회원들의 구독 정보 조회
$vip_subscribers = get_subscriptions_by_level(10);
$premium_subscribers = get_subscriptions_by_level(8);

get_subscriptions_by_gender()

// 성별로 구독자 조회
$male_subscribers = get_subscriptions_by_gender('M');
$female_subscribers = get_subscriptions_by_gender('F');

get_subscriptions_by_member_ids()

// 특정 회원 ID 목록으로 조회
$target_members = array('admin', 'moderator1', 'moderator2');
$staff_subscribers = get_subscriptions_by_member_ids($target_members);

get_all_active_subscriptions()

// 모든 활성 구독자 조회 (필터 없음)
$all_subscribers = get_all_active_subscriptions();

실제 활용 예시

새 게시글 알림 시스템

// 게시글이 등록될 때 레벨별로 알림 발송
function notify_new_post($bo_table, $wr_subject) {
  // VIP 회원들에게 우선 알림
  $vip_subscribers = get_subscriptions_by_level(10);
  if (!empty($vip_subscribers)) {
    $options = array(
      'click_action' => '/bbs/board.php?bo_table=' . $bo_table,
      'icon' => '/img/vip-notification.png'
    );
    send_push_notification('[VIP] 새 글 알림', $wr_subject, $options);
  }

  // 30분 후 일반 회원들에게 알림
  $general_filters = array('level' => 5); // 레벨 5 이상
  $general_subscribers = get_active_subscriptions($general_filters);
  // 실제로는 cron job이나 큐 시스템으로 지연 발송
}

이벤트 참여자 대상 알림

// 특정 이벤트 참여자들에게만 알림
function notify_event_participants($event_participants) {
  // 참여자 목록에서 구독자만 필터링
  $subscribers = get_subscriptions_by_member_ids($event_participants);

  if (!empty($subscribers)) {
    $options = array(
      'icon' => '/img/event.png',
      'click_action' => '/event/result.php',
      'require_interaction' => true
    );

    $result = send_push_notification(
      '이벤트 결과 발표!',
      '참여하신 이벤트의 결과를 확인해보세요.',
      $options
    );

    echo count($event_participants) . '명 중 ' . count($subscribers) . '명에게 알림 발송';
  } else {
    echo '알림을 받을 구독자가 없습니다.';
  }
}

주의사항

중복 처리: save_push_subscription()은 동일 endpoint 시 업데이트 처리
소프트 삭제: unsubscribe_push()는 완전 삭제가 아닌 is_active=0 처리
성능 고려: 대량 구독자 조회 시 메모리 사용량과 처리 시간 주의
필터 조합: 여러 필터 동시 사용 시 AND 조건으로 처리됨

관련 함수

문서 검색