"좋아요 버튼 만들었는데, 새로고침하면 좋아요가 사라져요." "분명히 눌렀는데 왜 안 남아있는 거예요?"
이런 상황, 왜 생길까요?
버튼 누르면 하트가 빨갛게 바뀌는 건 화면에서 일어나는 일이에요. 근데 그 좋아요가 저장되려면 서버 어딘가에 기록돼야 해요.
AI한테 "좋아요 버튼 만들어줘"라고만 하면, 하트 색만 바뀌는 버튼을 만들 수도 있고, 서버 저장까지 하는 걸 만들 수도 있어요. 뭘 원하는지 구체적으로 말 안 하면 AI가 추측해요.
프론트엔드 vs 백엔드, 뭐가 다른가요?
웹 서비스는 크게 두 부분으로 나뉘어요.
🎨 프론트엔드 (Frontend)
- 화면에 보이는 부분
- 버튼, 입력창, 이미지, 애니메이션
- 브라우저에서 돌아감
⚙️ 백엔드 (Backend)
- 뒤에서 처리하는 부분
- 데이터 저장, 인증, 계산
- 서버에서 돌아감
유튜브로 예시 들어볼게요.
| 프론트엔드 (보이는 것) | 백엔드 (안 보이는 처리) |
|---|---|
| 영상 재생 화면 | 영상 파일 저장/전송 |
| 좋아요 버튼 (하트 색 바뀜) | 좋아요 수 DB에 저장 |
| 댓글 입력창 | 댓글 저장, 불러오기 |
| 구독 버튼 | 구독자 수 계산 |
버튼을 누르면 프론트엔드가 "좋아요 눌렀어!"를 백엔드한테 알려줘요. 그럼 백엔드가 DB에 저장하고, 프론트엔드가 화면에 반영해요.
보이는 영역(프론트엔드) vs 처리하는 영역(백엔드)

전체 구조
↕ 화면 보고, 버튼 누르고
🎨 프론트엔드
- 화면 구성, 사용자 입력 받기
- Next.js (React 기반)
↕ 데이터 주고받기 (API)
⚙️ 백엔드
- 데이터 저장, 인증, 비즈니스 로직
- Supabase
↕ 데이터 저장/불러오기
💾 데이터베이스 전체 데이터 흐름: 유저 → 프론트엔드 → 백엔드 → DB

잠깐, 저 용어들 뭔데요?
위 그림에 나온 기술 이름들, 지금 다 이해할 필요 없어요. 그냥 "아, 이런 게 있구나" 정도만 알면 돼요.
├── HTML: 화면의 뼈대. "여기 버튼 넣어줘, 여기 글자 넣어줘"
├── CSS: 화면의 옷. "버튼 색깔 빨간색, 글자 크기 20px"
├── JavaScript: 화면의 두뇌. "버튼 누르면 이거 해라"
├── React: JavaScript를 편하게 쓰는 도구 (인기 많음)
└── Next.js: React를 더 편하게 쓰는 도구 (이 시리즈에서 사용)
⚙️ 백엔드 기술 (데이터 저장하는 도구)
└── Supabase: 백엔드를 통째로 빌려쓰는 서비스
(DB + 로그인 + 파일저장 다 해줌. 바이브 코더 필수템)
🚀 배포 (만든 걸 인터넷에 올리는 도구)
└── Vercel: Next.js 만든 회사에서 운영하는 배포 서비스
(GitHub 연결하면 자동으로 배포됨)이 시리즈에서 쓰는 스택:
Next.js (프론트) + Supabase (백엔드) + Vercel (배포)
왜 이 조합이냐면요:
- 레퍼런스가 많아요 → 그만큼 AI가 학습한 코드도 많아요
- AI한테 "Next.js로 만들어줘" 하면 잘 알아듣고 잘 만들어줘요
- 마이너한 기술 쓰면 AI가 헷갈려하거나 옛날 코드 뱉을 수 있어요
바이브 코더에게 중요한 건:
- 이 용어들을 외울 필요 없어요
- AI한테 "Next.js로 만들어줘"라고 말할 수 있으면 충분해요
- 나중에 더 알고 싶으면 그때 검색하면 돼요
이 구조를 알면, 단계적으로 요청할 수 있어요:
1단계: 화면 먼저
나: "장바구니 페이지 만들어줘"
→ AI가 UI 만들어줌 (프론트엔드)
2단계: 확인
→ 화면 잘 나오나 확인
3단계: 백엔드 연결
나: "좋아, 이제 API로 연동해줘"
또는 "지금은 localStorage인데, DB에 저장하게 바꿔줘"
→ AI가 백엔드 연결해줌
잠깐, localStorage랑 DB가 뭔데요?
├── localStorage (로컬 스토리지)
- 내 브라우저에만 저장됨
- 새로고침해도 남아있음
- 근데 다른 기기에서는 안 보임
- 예: 메모장에 혼자 적어둔 것
└── DB (데이터베이스)
- 서버에 저장됨
- 어디서든 접근 가능
- 다른 사람도 같은 데이터 볼 수 있음
- 예: 구글 드라이브에 올린 것그래서 "localStorage인데 DB로 바꿔줘"는 **"지금 내 브라우저에만 저장되는데, 서버에 저장하게 해줘"**라는 뜻이에요.
실제로 이런 순서로 개발하기도 해요:
1단계: localStorage로 먼저 테스트
→ 화면이 잘 동작하는지 확인
→ 어떤 데이터를 저장해야 하는지 파악
2단계: 스키마 정리
→ "이 데이터는 이런 형태로 저장하자" 확정
3단계: DB로 마이그레이션
→ "이제 localStorage → DB로 바꿔줘"
스키마(Schema)가 뭐냐면요: 데이터를 어떤 형태로 저장할지 정해둔 틀이에요.
├── id: 고유 번호 ├── title: 할 일 내용 ├── done: 완료 여부 (true/false) └── created_at: 만든 날짜
처음부터 스키마를 완벽하게 정하기 어려워요. localStorage로 이것저것 테스트하다 보면 "아, 이 데이터도 필요하네" 하고 알게 돼요. 그때 DB로 옮기면 더 효율적이에요.
프론트만으로 뭘 만들 수 있나요?
화면에서 끝나는 건 가능해요.
- 계산기, 단위 변환기 - 타이머, 스톱워치 - 메모장 (단, 새로고침하면 사라짐) ❌ 백엔드 필요 - 회원가입/로그인 → 사용자 정보 저장 - 게시글 → 다른 사람도 봐야 함 - 좋아요 수 → 모든 사람이 같은 숫자 - 장바구니 → 다음에 와도 남아있어야 함
핵심:
- 저장하거나 다른 사람도 봐야 하면 → 백엔드 필요
- 나 혼자, 화면에서 끝나면 → 프론트만으로 가능
BaaS: 백엔드 빌려쓰기
백엔드를 직접 안 만들고, 이미 만들어진 걸 쓸 수 있어요.
대표적인 BaaS: - Supabase: DB + 인증 + 저장소 (바이브 코더 추천) - Firebase: 구글에서 만든 BaaS
프론트 (내가 만듦) ↔ 백엔드 (내가 만듦) ↔ DB BaaS 쓸 때 프론트 (내가 만듦) ↔ Supabase (이미 구현됨)
바이브 코더 초보라면 BaaS부터 시작하세요.
실제 대화 예시: 할 일 관리 서비스
나: "할 일 관리 서비스 만들 건데,
프론트는 Next.js로, 백엔드는 Supabase 쓸 거야."
AI: "Supabase 쓰면 백엔드 코드 거의 안 짜도 돼요.
프론트에서 Supabase 클라이언트로 바로 DB 접근하면 됩니다."
나: "좋아. 프론트에서 어떻게 구성할지 추천해봐."
AI: "프론트엔드 구조 제안드려요:
- 로그인 페이지 (Supabase Auth 연동)
- 할 일 목록 페이지
- 할 일 추가 폼
이렇게 3개 페이지로 구성하면 어떨까요?"
나: "오케이, 그렇게 가자."
2단계: 화면 만들기 + 확인
나: "로그인 페이지부터 만들어줘.
이메일/비밀번호 입력창이랑 로그인 버튼 있어야 돼."
AI: "Next.js로 로그인 폼 만들었어요. 확인해보세요."
[기능 단위로 직접 확인]
- 이메일/비밀번호 입력 → 잘 됨
- 로그인 버튼 클릭 → 어? 에러 나네?
나: "로그인 버튼 누르니까 에러 나. 뭐가 문제야?"
AI: "Supabase 환경변수 설정 확인해보세요."
나: "아, 환경변수 설정 안 했네. 추가했어."
[다시 확인] → 로그인 잘 됨!
3단계: 데이터 연결
나: "할 일 목록 페이지 만들어줘.
Supabase DB에서 데이터 가져와서 보여주고,
추가하면 DB에 저장하게 해줘."
AI: "할 일 목록 페이지 만들었어요. 확인해보세요."
[기능 단위로 직접 확인]
- 할 일 목록 표시 → 잘 됨
- 할 일 추가 → 잘 됨
- 삭제 → 잘 됨
나: "완벽해!" 이게 기술적 대화예요.
- "프론트는 Next.js, 백엔드는 Supabase"
- "로그인 페이지 만들어줘"
- 기능 단위로 직접 확인
- 에러 나면 → "뭐가 문제야?"
- "할 일 목록 페이지 만들어줘. DB 연동해서"
프론트/백엔드 구분하고, 단계별로 확인하면서 대화하는 거예요.
오늘의 핵심 정리
→ 프론트: 화면 (브라우저) → 백엔드: 처리/저장 (서버) ✅ 프론트만으로는 "화면에서 끝나는 것"만 가능 → 저장하거나 공유해야 하면 → 백엔드 필요 ✅ BaaS 쓰면 백엔드 직접 안 만들어도 됨 → Supabase 추천 ✅ AI한테는 단계적으로 요청 1단계: "장바구니 페이지 만들어줘" (화면) 2단계: 확인 3단계: "API로 연동해줘" (백엔드 연결)
셀프체크
오늘 배운 내용, 제대로 이해했는지 확인해볼까요?
□ 로그인 화면의 디자인은 어디서 담당하나요?
□ 입력된 비밀번호가 맞는지 확인하는 건 어디서 하나요?
□ 우리 시리즈에서는 어떤 기술 스택을 쓰나요?
(정답: 프론트엔드 / 백엔드 / Next.js + Supabase + Vercel)
다음 글 예고
오늘은 프론트엔드와 백엔드를 배웠어요.
다음 글에서는 데이터는 어디에 저장되나를 알아볼게요.
"할 일 추가했는데, 새로고침하면 사라져요" → 이런 상황이 왜 생기는지, 어떻게 해결하는지 배워요.
이 시리즈 로드맵
PART 1: 마인드셋 (1~4편)
"AI를 부리는 마음가짐"
[ 1편 ] AI는 유능한 신입사원이다 ✅
[ 2편 ] 바이브 코딩이란 무엇인가 ✅
[ 3편 ] 바이브 코더가 알아야 할 것 ✅
[ 4편 ] 목표 수준: 유능한 상사 되기 ✅
↓
PART 2: 도구 세팅 (5~9편)
"일단 만들어보기"
[ 5편 ] 필수 도구 설치 ✅
[ 6편 ] 코드 에디터 세팅 ✅
[ 7편 ] 터미널 기초 ✅
[ 8편 ] Git & GitHub 기초 ✅
[ 9편 ] AI 코딩 도구 세팅 ✅
↓
PART 3: 기술 개념 - 큰 그림 (10~15편)
"전체 구조 이해하기"
[ 10편 ] 프로그램의 종류 ✅
[ 11편 ] 프론트엔드 vs 백엔드 👈 지금 여기
[ 12편 ] 데이터는 어디에 저장되나
[ 13편 ] 서비스들이 대화하는 방법: API
[ 14편 ] 프로젝트 구조
[ 15편 ] 데이터 흐름
↓
PART 4: 기술 개념 - 실무 용어 (16~20편)
"AI와 대화할 때 쓰는 용어"
[ 16편 ] 컴포넌트와 페이지
[ 17편 ] 상태(state)란 무엇인가
[ 18편 ] 에러 읽는 법
[ 19편 ] 타입과 린트
[ 20편 ] 디버깅 기초
↓
PART 5: 실전 - 프론트엔드 (21~24편)
"화면 만들기"
[ 21편 ] Next.js 프로젝트 시작
[ 22편 ] 첫 화면 만들기
[ 23편 ] 컴포넌트 분리와 스타일링
[ 24편 ] 사용자 입력 처리
↓
PART 6: 실전 - 백엔드 연동 (25~28편)
"데이터 저장하기"
[ 25편 ] Supabase 세팅
[ 26편 ] DB 테이블 만들기
[ 27편 ] CRUD 구현
[ 28편 ] 인증(로그인) 붙이기
↓
PART 7: 실전 - 배포 (29~31편)
"세상에 공개하기"
[ 29편 ] Vercel 배포
[ 30편 ] 환경변수 관리
[ 31편 ] 도메인 연결
↓
PART 8: 독립 성장 (32~35편)
"혼자서도 성장하기"
[ 32편 ] 에러 해결 루틴
[ 33편 ] 공식 문서 읽는 법
[ 34편 ] 바이브 코더 성장 로드맵
[ 35편 ] 에필로그
"좋아요 버튼 만들어줘"에서 "화면 먼저 → 확인 → DB 연동"으로. 이 흐름을 알면 AI한테 단계적으로 요청할 수 있어요.
궁금한 점이나 다뤘으면 하는 주제가 있으면 댓글로 남겨주세요!