배움 트렌드 사이트 (요즘뭐배워요) 구축 4: Supabase 마이그레이션

소개

지난 3주간 진행해온 '요즘뭐배워요' 프로젝트가 한 단계 더 진화했습니다. 이번에는 데이터베이스를 Google Sheets에서 PostgreSQL 기반의 Supabase로 이전하여 시스템 성능과 확장성을 대폭 향상시켰습니다. 아래 화면을 보면 Lovable이 사이트 코드를 수정하면서 'Supabase 연동'이라는 텍스트를 넣었습니다. 그런 지시도 하지 않았는데 말이죠.^^ 놀라운 AI입니다.

한국 웹 사이트의 스크린 샷

기존 Google Sheets 시스템은 MVP 단계에서는 충분했지만, 일일 250개씩 수집되는 데이터가 누적되면서 성능상 한계가 조만간 드러날 것 같았습니다. 또한 향후 블로그 등 다양한 데이터 소스 확장과 생성형 AI 활용 시스템 구축을 위해서는 더 강력한 데이터베이스가 필요했습니다.

덧붙여, 이번 마이그레이션 과정을 통해 단순한 데이터베이스 교체를 넘어 무중단 전환 과정을 경험할 수 있었습니다.

진행 방법

1. 마이그레이션 전략 수립: 5단계 무중단 전환

Claude AI와의 상세한 논의를 통해 체계적인 마이그레이션 계획을 수립했습니다.

  • 1단계: Supabase 계정 생성 (러버블 사이트 메뉴를 통해)

  • 2단계: Supabase 연동 및 스키마 생성

  • 3단계: 데이터 이관 및 useSupabase 훅 생성

  • 4단계: 하이브리드 모드 운영 및 검증

  • 5단계: 완전 전환 및 최적화

이런 단계적 접근을 통해 사용자 경험에 영향을 주지 않으면서도 안전하게 시스템을 전환하는 방법을

2. 확장 가능한 데이터베이스 스키마 설계

향후 다양한 데이터 소스 확장을 고려한 유연한 스키마를 설계했습니다. 물론 이 스키마는 필요에 따라 수정되겠지요.

PostgreSQL 스키마 구조:

```sql

CREATE TABLE naver_news_learning (

id BIGSERIAL PRIMARY KEY,

date DATE NOT NULL,

timestamp TIMESTAMPTZ NOT NULL,

keyword VARCHAR(100),

title TEXT NOT NULL,

summary TEXT,

url TEXT,

original_url TEXT,

source VARCHAR(200),

pub_date TIMESTAMPTZ,

created_at TIMESTAMPTZ DEFAULT NOW(),

updated_at TIMESTAMPTZ DEFAULT NOW()

);

```

3. Lovable을 활용한 단계별 마이그레이션 실행

Lovable의 네이티브 Supabase 연동 기능을 활용하여 체계적으로 마이그레이션을 진행했습니다.

주요 구현 단계:

  • 테이블 생성: 기존 Google Sheets 구조 분석 후 PostgreSQL 스키마 자동 생성

  • 데이터 마이그레이션 도구: /admin/migration 페이지를 통한 배치 단위 데이터 이관 (꼭 필요하지 않음)

  • 환경변수 기반 전환 시스템: USE_SUPABASE 변수로 무중단 데이터 소스 전환

4. 성능 최적화: PostgreSQL 인덱스 구축

데이터베이스 성능 향상을 위한 전략적 인덱스를 구축했습니다.

5. RLS 보안 정책 적용

웹사이트 보안과 관리 편의성을 고려한 Row Level Security 정책을 적용했습니다.

  • 익명 사용자: SELECT만 허용 (데이터 조회만 가능)

  • 인증된 사용자: SELECT만 허용 (웹사이트 읽기 전용)

  • INSERT/UPDATE/DELETE: 관리자만 가능 (향후 확장 대비)

결과와 배운 점

성공적으로 달성된 개선사항

  • 구글시트의 데이터를 Supabase로 이전

  • 확장성 확보: 멀티 데이터 소스 및 AI 분석 시스템 통합 준비

  • 무중단 전환: 사용자 경험 무손실로 완전한 시스템 교체

  • 보안 강화: RLS 정책 기반 안전한 웹 서비스 운영

예상치 못한 도전과 해결 과정

RLS 정책 권한 문제가 가장 까다로웠습니다. 첫 시도에서는 Row Level Security 설정으로 인해 데이터 이관이 실패했습니다. 하지만 다음날 CSV 직접 업로드 방식을 활용하여 복잡한 권한 문제를 우회하는 실용적 접근으로 해결했습니다.

무중단 마이그레이션의 효과성도 좋았습니다. 환경변수 기반 전환 시스템 덕분에 코드 수정 없이 즉시 데이터 소스를 변경할 수 있었고, 문제 발생 시 즉시 롤백이 가능한 안전장치를 확보했습니다.

기술적으로 흥미로웠던 부분

PostgreSQL의 GIN 인덱스 활용이 흥미로웠습니다. 한국어 텍스트 검색에서 'korean' 설정이 실패했을 때 'simple' 구성으로 자동 대체되면서도 기본 검색 기능은 정상 작동했습니다.

AI 기반 개발 도구의 진화가 역시 놀라웠습니다. Lovable이 단순한 코드 생성을 넘어서 데이터베이스 스키마 설계, 인덱스 최적화, 보안 정책 설정까지 자연어 명령으로 처리하는 것을 보며, 개발 패러다임의 변화를 체감했습니다. 다만, Lovable의 제안을 받아들일 것인지 말 것인지 판단하는 것이 쉽지 않았습니다. 그래서 Claude와 많은 대화를 하였습니다.

재미있는사실 중에 하나는, 제 질문에 Lovable이 답변을 하면서 '승인' 여부를 묻는 경우가 생기는데, '승인'을 클릭하면 또 다른 크레딧이 차감되었습니다. 즉, 한 번의 질문에 두 개의 크레딧이 쓰였습니다.ㅠㅠ 그래도 이번 마이그레이션은 크레딧 9개를 사용해서 마쳤습니다. 그 중 3개는 웹페이지 기반 마이그레이션 기능을 위한 권한 설정에 썼고요. 나중에 보니 이 방식을 필요없더라고요.

향후 확장을 위한 기반 완성

이번 마이그레이션으로 단순한 뉴스 수집 사이트에서 종합적인 배움 트렌드 분석 플랫폼으로 진화할 수 있는 기술적 기반이 완성되었습니다.

이제 n8n을 Supabase에 직접 연동하는 업무가 남았고, 그럴 경우 네이버 블로그 검색 결과도 Lovable 사이트에 보여줄 수 있도록 사이트 내용을 개편해야 할 것 같습니다.

아래 n8n 워크플로우의 경우 '배움' 검색어로 네이버 뉴스를 먼저 검색하고, 60초 후에 네이버 블로그를 검색해서 결과를 구글시트에 저장하고 있습니다.

다양한 유형의 오디오 채널을 보여주는 다이어그램

1

👉 이 게시글도 읽어보세요