LESSON 12

백엔드 기초

데이터 저장하기

오늘의 목표

브라우저 저장과 데이터베이스 저장의 차이를 이해하고, 내 서비스에 데이터베이스를 연결해 첫 테이블에 데이터를 저장합니다.

예상 소요 시간 약 50분

저장에는 두 단계가 있습니다

1단계: 브라우저에 저장 (localStorage)

새로고침해도 남아 있지만, 이 브라우저에서만 보입니다. 폰에서 열면 없습니다. 회원 개념도 없습니다.

  • 장점: 서버 없이 5분이면 됨
  • 쓸 때: 설정값, 임시 입력, 로그인 없는 개인용 도구

2단계: 데이터베이스에 저장

서버에 저장되어 어디서 열어도 같은 데이터가 보입니다. 사용자별로 구분할 수 있습니다.

  • 장점: 진짜 서비스
  • 쓸 때: 여러 기기, 여러 사용자, 데이터가 자산인 경우

오늘은 1단계를 10분 만에 끝내고, 2단계를 합니다.

따라하기 1: 브라우저 저장 (10분)

#25 프롬프트 12-1🟢 초급

"IngredientInput의 재료 목록이 새로고침해도 남아 있도록 localStorage에 저장하고 불러오게 해줘. 키 이름은 'ingredients'. 다른 파일은 건드리지 마."

확인: 재료 추가 → 새로고침 → 남아 있음 → 커밋.

TODO.md의 "새로고침해도 남기" 조각이 끝났습니다. (개발자 도구 F12 → Application → Local Storage에서 ingredients 항목을 눈으로 볼 수도 있습니다.)

데이터베이스 고르기: Supabase

입문자에게 추천하는 조합은 Supabase(데이터베이스를 웹 화면에서 관리해주는 서비스)입니다.

  • PostgreSQL이라는 검증된 데이터베이스를 웹 화면에서 관리
  • 테이블을 엑셀처럼 화면에서 만들고 볼 수 있음
  • 14강의 로그인 기능도 같이 제공
  • 무료 플랜으로 충분

따라하기 2: Supabase 프로젝트 만들기

  1. supabase.com 가입 → New project → 이름, 비밀번호(메모!), 지역은 Northeast Asia (Seoul)
  2. 왼쪽 Table Editor → New table
  3. 첫 테이블을 만듭니다. 예: saved_menus
컬럼타입설명
idint8자동 (기본 생성됨)
created_attimestamptz자동 (기본 생성됨)
nametext메뉴 이름
ingredientstext재료 (쉼표 구분)
  1. Settings → API 에서 Project URL과 anon public 키를 복사해둡니다.
#26 프롬프트 12-2🔴 고급

RLS(행 수준 보안) 를 켜라는 안내가 뜹니다. 오늘은 학습용이니 테이블 만들 때 RLS를 끄고 시작하세요. 14강 로그인을 붙이며 다시 켭니다.

🧪 실습

  • localStorage 저장: 재료 추가 후 새로고침해도 목록이 남아 있다
  • Supabase Table Editor에서 saved_menus 테이블과 4개 컬럼이 눈에 보인다
  • Settings → API에서 Project URL과 anon public 키를 복사해 메모해 뒀다

환경변수: 키는 코드에 적지 않습니다

복사한 URL과 키는 코드에 직접 적으면 GitHub에 올라가서 누구나 볼 수 있습니다. 프로젝트 루트에 .env.local 파일을 만들어 넣습니다.

NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGc...

.env.local은 Next.js가 기본으로 Git에서 제외합니다(.gitignore). Code 탭에서 확인합니다.

"git이 .env.local을 추적하지 않는지 확인해줘. 파일 내용은 출력하지 마."

추적하지 않는다고 답하면 정상입니다.

터미널로도 할 수 있어요

git status

.env.local이 목록에 안 보이면 정상입니다.

따라하기 3: 연결하고 저장하기

이제 AI에게 시킵니다. 라이브러리(남이 만든 코드 묶음) 설치가 필요하니 허락을 포함해서, 3단계로 나눠 보냅니다.

단계 1: 연결 파일 만들기

#27 프롬프트 12-3🔴 고급

"Supabase를 연결하려고 해. @supabase/supabase-js 설치를 허락할게. src/lib/supabase.ts에 클라이언트를 만들어줘. URL과 키는 .env.local의 NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY를 써. 다른 파일은 건드리지 마."

확인: VS Code에 src/lib/supabase.ts가 생겼고, 파일 안에 키 값이 직접 적혀 있지 않고 process.env로 읽는 줄이 보입니다.

단계 2: 저장 버튼

#28 프롬프트 12-3a🔴 고급

"메뉴 카드의 '저장' 버튼을 누르면 saved_menus 테이블에 name과 ingredients를 insert(새 행 추가) 해줘. 성공하면 '저장했어요'를 보여줘. 확인하는 방법도 알려줘."

확인: 저장을 누르고 Supabase Table Editor를 새로고침하면 방금 저장한 행이 생깁니다.

단계 3: 목록 화면

#29 프롬프트 12-3b🔴 고급

"/menus 화면을 만들어서 saved_menus를 최신순으로 목록으로 보여줘. 다른 파일은 건드리지 마."

확인: 주소창에 /menus를 붙이면 저장한 메뉴가 최신순으로 보입니다.

폰에서 보이려면 Vercel에도 환경변수를 넣어야 합니다: Vercel 프로젝트 → Settings → Environment Variables에 같은 두 값 추가 → Redeploy. (16강에서 정리하지만 오늘 해두면 좋습니다.)

오늘의 체크리스트

직접 해보고 눈으로 확인한 것만 체크하세요.

🧪 실습

  • .env.local이 Git에 추적되지 않는다 (Code 탭에 확인을 시켰거나, 터미널이면 git status에 안 보인다)
  • 저장 클릭 → Table Editor에 새 행이 생기는 것을 눈으로 확인했다
  • /menus에 저장한 메뉴가 보인다
  • Vercel에 환경변수를 넣고 Redeploy(같은 코드로 다시 배포)한 뒤, 폰에서 배포 주소로 열어도 같은 메뉴가 보인다

더 해보기(선택)

본 과정에 꼭 필요하지 않은 심화입니다. 시간이 남거나 더 궁금할 때 해보세요.

CRUD 나머지 채우기

읽기(R)와 만들기(C)가 됐으니, 지우기(D)와 고치기(U)는 조각 하나씩:

#30 프롬프트 12-4🔴 고급

"/menus의 각 항목에 삭제 버튼을 추가해줘. 누르면 확인창 뒤 Supabase에서 delete."

다음 강의

13강, 가짜 메뉴 대신 진짜 AI가 추천하게. 외부 API 붙이기.