master-project
CHAPTER 30 / 50
읽기 약 2분
FUNCTION
실시간 API: Supabase Realtime + WebSocket
핵심 개념
Postgres Changes·Broadcast·Presence — DB 변경·메시지·온라인 상태 실시간 동기화.
본문
Realtime 3가지 모드
1. Postgres Changes — DB INSERT/UPDATE/DELETE 구독
2. Broadcast — Client → Client 메시지 (WebSocket)
3. Presence — 온라인·타이핑 상태Postgres Changes (DB 동기화)
// 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 활성화 (마이그레이션)
-- Realtime publication에 테이블 추가
alter publication supabase_realtime add table notifications;
alter publication supabase_realtime add table generations;
-- RLS 적용 자동 (구독자가 본인 row만 받음)Broadcast (메시지 전송)
// 채팅 룸 (실시간)
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 (온라인 상태)
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)
// 서버: 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()메모리 누수 방지
useEffect(() => {
const ch = supabase.channel('xxx').subscribe()
return () => { supabase.removeChannel(ch) } // 필수!
}, [])Realtime vs 폴링 비교
[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