VC Vibe Coding 101 AI 앱의 기본 구조

바이브코딩을 위한 AI 앱 지도

이 수업의 목표는 코드를 외우는 것이 아니다. AI가 무엇을 보고 답하는지, 문서를 어떻게 찾아오는지, 데이터가 어디에 저장되는지 말로 설명할 수 있게 만드는 것이다.

사용자 브라우저 버튼을 누르고 결과를 본다
웹서버 요청을 받아 일의 순서를 정한다
AI LLM API 컨텍스트를 읽고 다음 토큰을 예측한다
기억 DB 데이터를 규칙 있는 장부로 저장한다
도구 RAG · MCP · API 필요한 자료와 외부 기능을 가져온다

초보자가 먼저 잡아야 할 7개 단어

깊게 들어가기 전에 “이 부품은 무슨 역할인가”만 잡는다. 이후 모든 설명은 이 7개 단어 위에 올라간다.

LLM 다음 말을 잇는 엔진

앞의 텍스트를 보고 다음 토큰을 예측한다.

Token 글 조각과 비용 단위

AI가 읽고 쓰는 작은 단위다.

Embedding 의미를 좌표로 바꾸기

문장을 공간 위 위치로 바꾼다.

RAG 자료를 찾아 붙이기

관련 문서 조각을 컨텍스트에 넣는다.

MCP AI용 도구 연결 규격

파일, DB, 검색 도구를 안전하게 연결한다.

API 외부 서비스 창구

LLM, STT, 캘린더, 이메일을 호출한다.

DB 규칙 있는 장부

데이터를 테이블로 나눠 오래 저장한다.

LLM은 컨텍스트 창을 읽고 다음 토큰을 고른다

LLM은 “생각하는 사람”이라기보다, 지금 창에 들어온 텍스트를 보고 다음에 올 말 조각을 계속 고르는 모델이다. 그래서 좋은 답은 좋은 컨텍스트 관리에서 시작한다.

Context window 약 18% 사용
System prompt

한국어로 쉽게 설명해. 전문 용어에는 비유를 붙여.

User prompt

RAG가 뭔지 초보자에게 설명해줘.

추가 정보

문서 청크, 검색 결과, MCP 도구 결과, 프로젝트 파일 내용.

Assistant answer

RAG는 필요한 자료를 찾아 AI 책상 위에 올려주는 방식입니다.

Next user prompt

그럼 embedding은 RAG에서 어떤 역할이야?

다음 토큰 후보

문장의 의미를 3D 공간에 놓고 거리를 비교한다

임베딩은 문장을 숫자 좌표로 바꾸는 일이다. 의미가 비슷한 문장은 가까운 곳에 놓이고, 전혀 다른 주제는 멀리 떨어진다.

대상 감정 상황 질문: 반려동물 칭찬 강아지가 귀엽다 고양이가 예쁘다 맛있는 아이스크림은 00가게에 판다 회의 음성을 텍스트로 변환

문서를 조각내고, 의미가 가까운 조각을 컨텍스트에 넣는다

RAG는 AI를 다시 학습시키는 일이 아니다. 필요한 문서 조각을 찾아서 답변 직전에 붙여주는 방식이다.

예시 문서회의록 업로드 기능
# 회의록 업로드 기능

## 1. 오디오 업로드
사용자는 회의 녹음 파일을 업로드한다.
앱은 파일 형식과 용량을 먼저 확인한다.
업로드가 끝나면 서버는 처리 대기열에 작업을 넣는다.

## 2. STT 변환
서버는 STT API로 음성을 텍스트로 바꾼다.
긴 회의는 10분 단위로 나눠 변환한다.
변환 결과에는 발화 시간과 화자 후보를 함께 저장한다.

## 3. 저장, 검색, 비용 기록
긴 회의록은 주제별 챕터로 나누어 저장한다.
각 챕터는 임베딩되어 검색용 DB에 들어간다.
모든 STT와 LLM 호출은 사용량 로그에 기록한다.

청킹 방식 선택

청킹 = 긴 문서를 AI가 다루기 좋은 작은 조각으로 자르는 일이다.

길이 기준은 일정한 글자 수로 자르고, 앞뒤 내용을 조금 겹쳐 맥락이 끊기지 않게 한다.
Chunk 1

사용자는 회의 녹음 파일을 업로드한다. 앱은 파일 형식과 용량을 먼저 확인한다. 업로드가 끝나면 서버는 처리 대기열에 작업을 넣는다.

Chunk 2

업로드가 끝나면 서버는 처리 대기열에 작업을 넣는다. 서버는 STT API로 음성을 텍스트로 바꾼다. 긴 회의는 10분 단위로 나눠 변환한다.

Chunk 3

긴 회의는 10분 단위로 나눠 변환한다. 변환 결과에는 발화 시간과 화자 후보를 함께 저장한다. 긴 회의록은 주제별 챕터로 나누어 저장한다.

질문“회의 음성은 어떻게 텍스트가 되나요?”
질문 임베딩
거리 비교
Top-K 선택
컨텍스트 주입
선택된 조각: Chunk 2가 질문과 가장 가깝다. 겹쳐 둔 문장 덕분에 업로드 직후 STT 흐름까지 이어서 읽을 수 있다.

API는 다른 서비스에 일을 부탁하는 주문 창구다

앱이 모든 기능을 직접 만들 필요는 없다. 정해진 형식으로 요청을 보내고, 정해진 형식으로 결과를 받으면 된다.

내 앱 회의 파일을 텍스트로 바꿔줘
버튼을 누르면 요청 → 처리 → 응답 흐름이 표시됩니다.

DB 설계는 지저분한 엑셀을 장부로 정리하는 일이다

스키마 = 장부의 칸과 규칙을 정한 설계도다. 좋은 DB는 중복을 줄이고, 관계를 분명히 만든다.

wide form 엑셀한 장에 다 넣은 상태
사번이름이메일법인부서직책매니저FTE 1월FTE 2월
26001429김민수minsu@example.comKR01HRHR Manager이서연1.00.8
26001429김민수minsu@example.comKR01PeoplePeople Lead이서연1.00.8
26001802박지훈jihoon@example.comKR01OperationsOps Specialist김민수1.01.0

문제: 사람 정보, 자리 정보, 월별 FTE가 한 줄에 섞여 있다. 같은 사람이 반복되고, 직책명이 흔들리고, 월별 칸이 계속 늘어난다.

정리 버튼

버튼을 누르면 엑셀 한 장이 사람 장부, 자리 장부, 배정/FTE 장부로 나뉜다.

person

사람 자체의 신원 카드다. 이름과 이메일처럼 사람이 바뀌어도 계속 따라다니는 값을 둔다.

person_idemployee_idnamework_emaillegal_entity
P00126001429김민수minsu@example.comKR01
P00226001802박지훈jihoon@example.comKR01
position

자리, 즉 조직 안의 의자 장부다. 사람이 퇴사해도 자리는 남을 수 있다.

position_codeorg_codetitlefunctionmanager_position
KR01_HR_L4_001KR01_HR_1000HR ManagerHRKR01_HR_L5_001
KR01_OPS_L2_014KR01_OPS_1200Ops SpecialistOperationsKR01_HR_L4_001
assignment_fte_period

누가 어느 자리에 언제 몇 FTE로 앉았는지 적는 연결 장부다.

person_idposition_codeperiodactual_ftesource
P001KR01_HR_L4_0012026-011.0LOCAL_HR
P001KR01_HR_L4_0012026-020.8LOCAL_HR
P002KR01_OPS_L2_0142026-021.0GLOBAL_HR
관계 읽는 법

P001 김민수는 KR01_HR_L4_001 자리에 앉아 있고, 2026년 2월에는 0.8 FTE로 기록된다. DB는 한 줄에 다 우겨 넣지 않고, 사람/자리/기간별 배정을 나눠서 연결한다.

내 프로젝트를 사례로 다시 보기

앞에서 배운 LLM, 임베딩, RAG, API, DB가 실제 앱 안에서 어떻게 이어지는지 프로젝트별 상세 페이지로 본다.

뉴스 공장 NewsHub

뉴스를 수집하고, 의미가 가까운 기사끼리 묶고, LLM으로 검수한 뒤 뉴스레터와 화면으로 내보내는 파이프라인이다.

Crawling → Embedding → Clustering → Newsletter → Delivery
EmbeddingLLM 검수비용 로그
상세 사례 보기
보고서 제작 라인 Report Studio

사용자 대화, RAG 예시, 역할별 Agent, 표 생성, DOCX 렌더링이 이어지는 AI 문서 제작 시스템이다.

Chat → Prompt Builder → Agents → Normalizer → Renderer
RAG 예시Prompt 조립DOCX
상세 사례 보기
인사 데이터 검수실 HRIS

엑셀식 HR 데이터를 사람, 자리, 조직 장부로 나누고 AI가 검수 초안을 만들되 원장은 승인 후에만 바꾸는 구조다.

Upload → Validate → AI Draft → Approval → Audit
DB SchemaAI 안전장치Audit
상세 사례 보기
개인 지식창고 Second Brain

노트, 회의록, 채팅 기록, 메모리를 검색해 AI 채팅의 컨텍스트로 붙이는 개인 지식 시스템이다.

Ingest → Chunk → Retrieve → Chat → Memory
Semantic SearchSTTMemory
상세 사례 보기
상세 페이지에서 볼 것

각 페이지는 스크린샷 또는 안전한 화면 재현, 실제 프롬프트 구조, API 호출 예시, 결과값 예시, DB 장부, 컨텍스트가 쌓이는 순서를 같은 형식으로 보여준다.

뉴스 공장

NewsHub

뉴스를 모으고, 비슷한 기사끼리 묶고, LLM으로 검수한 뒤 뉴스레터와 프론트 화면으로 내보내는 파이프라인이다.

1Crawling

Naver, Google RSS, Baidu, Global RSS에서 기사를 가져온다.

2Embedding

본문을 의미 좌표로 바꿔 비슷한 기사끼리 찾을 준비를 한다.

3Clustering

HDBSCAN으로 기사 묶음을 만들고 Gemini가 주제 타당성을 검수한다.

4Newsletter

Top Story, Headlines, Insights, Glossary를 단계별로 만든다.

5Delivery

Next.js 화면, 관리자, 이메일, Telegram 운영 흐름으로 결과가 나간다.

Frontend

Next.js 14 프론트가 Vercel에 배포된다. 페이지는 처음 데이터를 서버에서 받아오고, 이후 검색/필터는 ClientContent 컴포넌트가 처리한다. ISR은 “잠깐 저장했다가 자동 갱신하는 화면 캐시”다.

Backend

FastAPI 백엔드와 cron 작업이 중심이다. `cron_helper.py`가 수집, 클러스터링, 요약, 뉴스레터 생성 같은 작업 이름을 받아 각 모듈로 보낸다.

DB Setup

PostgreSQL에 `news_articles`, `news_topics`, `email_*`, `newsletter_research_log`, `llm_usage_logs` 같은 장부가 있다. 기사 embedding은 pgvector처럼 “의미 좌표를 저장하는 칸”에 들어간다.

RAG / Semantic Search

채팅형 RAG라기보다 뉴스 기사 검색형 RAG에 가깝다. 기사와 토픽 embedding을 비교해 가까운 기사 묶음을 만들고, 최근 토픽과 중복되는지 검사한다.

APIs

Naver API, RSS, Baidu, OpenAI embedding, Gemini 검수/글쓰기, SearXNG/웹 fetch, 이메일 발송, Telegram bot이 붙는다. 유료 AI 호출은 비용 장부에 남긴다.

LLM / Prompt

Gemini 클러스터링 프롬프트는 “타깃 회사가 주인공인가, 주식/투자 잡음은 아닌가, 같은 그룹 계열사 뉴스는 아닌가”를 본다. 뉴스레터 프롬프트는 fact extraction → top story → headlines → insights → glossary 순서로 이어진다.

Context가 쌓이는 방식

  1. 기사 제목, 본문, 출처, 회사명, 기존 토픽이 기본 재료로 들어간다.
  2. 임베딩과 HDBSCAN이 먼저 후보 묶음을 줄인다. 이 단계는 LLM 비용을 줄이는 체다.
  3. Gemini는 후보 기사 묶음과 회사별 규칙을 읽고 keep/reject/topic title을 판단한다.
  4. 뉴스레터 단계에서는 Stage 1 fact가 Stage 2/3/4의 근거가 되고, 각 cite는 원문 기사 인덱스와 연결된다.
복사했습니다