next.js supabase 연동: 개념부터 실무 적용까지 완전 가이드
next.js supabase 연동을 통해 인증, DB 읽기/쓰기, 실시간 업데이트를 실무에 적용하는 방법을 개념부터 코드 예제와 운영 주의점까지 정리한 가이드입니다. 실무 적용 흐름과 자주 하는 실수까지 함께 확인할 수 있습니다.
next.js supabase 연동이 필요한 상황
next.js supabase 연동을 통해 빠르게 인증과 호스팅된 Postgres 기반 DB를 사용하고 실시간 기능을 구현할 수 있습니다. 이 글에서는 실무에서 바로 적용 가능한 구성(클라이언트/서버 초기화, SSR/SSG 적용, Edge 함수 사용), 보안(RLS, 비밀관리), 성능 고려사항을 단계별로 설명합니다.
next.js supabase 연동 핵심 개념
Supabase는 Postgres 기반의 BaaS로 인증(Auth), Database, Storage, Realtime을 제공합니다. Next.js와 연동할 때 주의할 점은 클라이언트 측 키(익스포즈 가능)와 서버 측 비밀(환경변수로 보호) 구분, SSR에서의 세션 관리 방법, RLS(Row Level Security) 정책 적용 여부입니다.
| 구분 | 항목1 | 항목2 | 항목3 |
|---|---|---|---|
| 내용 | 클라이언트 초기화 | 서버 초기화(비밀키) | SSR/ISR 차이 |
next.js supabase 연동 실무 예제
다음은 Next.js 앱에서 Supabase를 설정하고 서버 측에서 인증 정보를 확인하는 기본 예제입니다.
// lib/supabaseClient.js import { createClient } from '@supabase/supabase-js'; const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL; const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY; export const supabase = createClient(supabaseUrl, supabaseAnonKey); // pages/api/profile.js (서버 측 예제) import { createServerSupabaseClient } from '@supabase/auth-helpers-nextjs'; export default async function handler(req, res) { const supabase = createServerSupabaseClient({ req, res }); const { data: { session } } = await supabase.auth.getSession(); if (!session) return res.status(401).json({ error: 'Unauthorized' }); const { data, error } = await supabase.from('profiles').select('*').eq('id', session.user.id).single(); if (error) return res.status(500).json({ error: error.message }); res.status(200).json({ profile: data }); }
위 예제는 서버에서 세션을 안전하게 조회하고, 인증된 사용자만 프로필을 가져오는 흐름입니다. 환경변수는 NEXT_PUBLIC_ 접두사가 붙은 값은 클라이언트에 노출되므로 서비스 키와 구분해 관리해야 합니다.
언제 쓰면 좋고 언제 피해야 할까
-
언제 쓰면 좋은가
- 빠르게 Postgres 기반의 인증과 실시간 기능이 필요할 때
- 배포 편의성(호스팅 + DB 관리)을 단축하고 싶을 때
- 작은 팀에서 백엔드 개발 시간 절약이 목표일 때
-
언제 피해야 하는가
- 고도로 커스터마이징된 데이터 아키텍처나 복잡한 트랜잭션이 많은 워크로드(매우 대규모)는 직접 관리하는 DB 설계가 필요할 수 있습니다
- 엄격한 규제(데이터 레지던시, 특정 컴플라이언스)가 있는 경우 Supabase 호스팅 정책이 맞지 않을 수 있습니다
실무 체크리스트
- 환경변수 정리(NEXT_PUBLIC_* vs 서버 전용)
- RLS 정책 적용 여부 확인
- 서비스 키(서비스_role)는 절대 클라이언트에 노출 금지
- 인증 토큰 만료/갱신 흐름 점검
- 오류 로깅과 모니터링(서버 API 경로 포함)
- CORS/도메인 허용 설정 검토
성능·보안·운영 주의점
성능
- SSR에서 DB 호출을 최소화: 필요 시 캐시(Incremental Static Regeneration) 사용
- Realtime 연결은 수평 확장 시 비용/연결 수를 고려
보안
- RLS로 최소 권한 원칙 적용: 테이블별로 select/insert/update 권한을 세분화
- 서비스 키(anon/서비스_role) 구분 및 누출 방지
- 업로드된 파일(스토리지) 접근 제어 정책 설정
운영
- 마이그레이션 전략: Supabase CLI 또는 SQL 관리 도구 사용
- 백업 주기 및 복구 절차 정의
- 모니터링: 쿼리 성능과 연결 수 체크
비교 기준표: 클라이언트 초기화 vs 서버 초기화
| 구분 | 항목1 | 항목2 | 항목3 |
|---|---|---|---|
| 내용 | 클라이언트(anon key) | 서버(서비스 키) | 목적 |
| 내용 | 브라우저에서 직접 사용 | 서버 전용으로 사용 | 클라이언트 기능/서버 관리 |
자주 묻는 질문
Q1: anon key를 클라이언트에 둬도 안전한가? A1: anon key는 공개 키로 사용되며 읽기 중심 작업에 적합하지만, 쓰기/관리 권한이 필요한 작업은 서버에서 서비스 키로 처리해야 안전합니다.
Q2: SSR에서 세션을 어떻게 안전하게 다루나요? A2: 서버 측에서 쿠키 기반 세션을 읽고 createServerSupabaseClient 같은 헬퍼로 세션을 확인한 뒤 필요한 데이터를 가져오면 됩니다. 세션 토큰은 서버에서만 검증하세요.
Q3: RLS 설정이 복잡한데, 기본 권한만 쓰면 안 되나요? A3: 개발 초기에는 느슨한 권한으로 시작할 수 있으나, 운영 환경에서는 반드시 RLS를 적용해 각 사용자가 자신의 데이터만 접근하도록 해야 합니다.
정리
- next.js supabase 연동은 인증·DB·실시간을 빠르게 적용할 수 있는 실무 솔루션입니다.
- 환경변수와 키 관리, RLS 적용은 필수입니다.
- SSR/Edge 환경에서의 세션 처리와 캐싱 전략을 설계하세요.
- 체크리스트를 기반으로 배포 전 보안·운영 점검을 수행하세요.