OPEN HYPER STEP
← 목록으로 (master-project)
MASTER-PROJECT · 30 / 50
master-project
CHAPTER 30 / 50
읽기 약 2
FUNCTION

실시간 API: Supabase Realtime + WebSocket


핵심 개념

Postgres Changes·Broadcast·Presence — DB 변경·메시지·온라인 상태 실시간 동기화.

본문

Realtime 3가지 모드

📋 코드 (3줄)
1. Postgres Changes  — DB INSERT/UPDATE/DELETE 구독
2. Broadcast         — Client → Client 메시지 (WebSocket)
3. Presence          — 온라인·타이핑 상태

Postgres Changes (DB 동기화)

TS📋 코드 (37줄)
// src/components/notification-bell.tsx
'use client'
import { useEffect, useState } from 'react'
import { createClient } from '@/lib/supabase/client'

export function NotificationBell({ userId }: { userId: string }) {
  const supabase = createClient()
  const [notifs, setNotifs] = useState<any[]>([])

  useEffect(() => {
    // 초기 로드
    supabase.from('notifications').select('*').eq('user_id', userId)
      .order('created_at', { ascending: false }).limit(20)
      .then(({ data }) => setNotifs(data ?? []))

    // 실시간 구독
    const channel = supabase
      .channel(`notifications:${userId}`)
      .on(
        'postgres_changes',
        {
          event: 'INSERT',
          schema: 'public',
          table: 'notifications',
          filter: `user_id=eq.${userId}`,
        },
        payload => {
          setNotifs(prev => [payload.new as any, ...prev])
        }
      )
      .subscribe()

    return () => { supabase.removeChannel(channel) }
  }, [userId])

  return <ul>{notifs.map(n => <li key={n.id}>{n.title}</li>)}</ul>
}

Realtime 활성화 (마이그레이션)

SQL📋 코드 (5줄)
-- Realtime publication에 테이블 추가
alter publication supabase_realtime add table notifications;
alter publication supabase_realtime add table generations;

-- RLS 적용 자동 (구독자가 본인 row만 받음)

Broadcast (메시지 전송)

TS📋 코드 (13줄)
// 채팅 룸 (실시간)
const channel = supabase.channel('room:lobby')
  .on('broadcast', { event: 'message' }, ({ payload }) => {
    console.log('받음:', payload)
  })
  .subscribe()

// 메시지 보내기
channel.send({
  type: 'broadcast',
  event: 'message',
  payload: { user: 'alice', text: 'hi' },
})

Presence (온라인 상태)

TS📋 코드 (20줄)
const channel = supabase.channel('presence:dashboard', {
  config: { presence: { key: userId } },
})

channel
  .on('presence', { event: 'sync' }, () => {
    const state = channel.presenceState()
    console.log('현재 접속자:', Object.keys(state))
  })
  .on('presence', { event: 'join' }, ({ key }) => {
    console.log(`${key} 접속`)
  })
  .on('presence', { event: 'leave' }, ({ key }) => {
    console.log(`${key} 떠남`)
  })
  .subscribe(async (status) => {
    if (status === 'SUBSCRIBED') {
      await channel.track({ online_at: new Date().toISOString() })
    }
  })

AI 생성 진행률 (Broadcast)

TS📋 코드 (14줄)
// 서버: AI 생성 중 progress 전송
const channel = supabase.channel(`gen:${gen.id}`)

await channel.send({
  type: 'broadcast',
  event: 'progress',
  payload: { progress: 50, status: 'generating' },
})

// 클라이언트
const channel = supabase.channel(`gen:${genId}`)
channel.on('broadcast', { event: 'progress' }, ({ payload }) => {
  setProgress(payload.progress)
}).subscribe()

메모리 누수 방지

TSX📋 코드 (4줄)
useEffect(() => {
  const ch = supabase.channel('xxx').subscribe()
  return () => { supabase.removeChannel(ch) }  // 필수!
}, [])

Realtime vs 폴링 비교

📋 코드 (15줄)
[Realtime]
+ 즉시 (밀리초)
+ 효율 (변경 시만)
- 연결 유지 비용
- 모바일 배터리

[폴링]
+ 단순
+ HTTP 캐시 활용
- 1초~30초 지연
- 대부분 빈 응답

추천:
- 알림·채팅 → Realtime
- 대시보드 통계 → 5분마다 refetch

다음 챕터

CH.31 "검색 API: 전문 검색 + 필터링".


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 마스터 프로젝트의 실시간 API 부분을 분석해서
실전 적용 + 개선 우선순위 3가지를 알려줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

실시간 API 관련 모범 사례·안티패턴 5개를
비교 분석해서 실전 적용를 위한 추천 방안을 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 프로젝트 전체에서 실시간 API
최적화 가능 위치와 리스크를 보고해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 한국 1인 개발자 시장의
실시간 API 트렌드와 차별화 포인트를 정리해줘.

⭐ 이것만 기억하세요
실시간 API: Supabase Realtime + WebSocket 이 3가지만 확실히 잡으세요
1.Postgres Changes로 DB 변경 자동 동기화
2.Broadcast = 임시 메시지, Presence = 온라인 상태
3.다음 챕터에서 검색 API


공유하기
진행도 30 / 50