본문으로 건너뛰기

한 사람이 AI와 함께 만든 i-하루

아내의 아침은 늘 분주했습니다.

출근 준비를 하면서, 학교 갈 아이의 채비까지 함께 챙겨야 했으니까요.

오늘 날씨는 어떤지, 시간표는 무엇인지, 학사일정에 빠뜨린 건 없는지 —

매일 아침, 흩어져 있는 정보를 하나하나 따로 찾아봐야 했습니다.

책을 좋아해 자주 빌려 읽는 아이에게는

가까운 도서관과 좋은 책 소식을 더 잘 전해주고 싶었습니다.

"이 모든 걸 한 화면에서 볼 수 있다면 얼마나 좋을까."

i-하루는 바로 이 한 줄의 바람에서 시작되었습니다.

아이는 학업에 더 집중하고, 부모는 아이의 하루를 조금 더 쉽게 챙길 수 있도록.

2026.02.19, 첫 줄의 코드 → 2026.07, 세상에 나오기까지의 기록

개발 일수
첫 줄 코드부터 오늘까지
1600+
Commits
git 기준 누적
12
핵심 기능
출시 시점 제공 (급식 · 시간표 · 진로 · 도서 …)
0원
인프라 비용
AI 도구 + 도메인 외 무료
보기 모드
Phase 0 · 2026.02

첫 줄

한 줄의 고민이 한 줄의 코드가 되기까지

2026.02.19이정표

그 저녁의 첫 줄

아내가 출근 준비 중에 휴대폰을 들고 날씨 앱과 시간표, 학사일정 사이를 오가는 모습이 눈에 들어왔습니다.

학교에 갈 아이의 가방을 챙기면서, 또 자기 출근 가방도 챙기면서요.

"이걸 한 화면에서 볼 수 있다면" — 그날 저녁 첫 줄을 타이핑했습니다.

commit 712d4a8 — "EduLife v6.1 initial commit"

기술 디테일
사용 도구
Claude Code · Claude Opus 4.7
자동화
프로젝트 골격 자동 스캐폴딩 (Next.js + Expo + Supabase 모노레포)
사람이 결정한 것
"매일 쓰는 학교생활 도우미"라는 정체성을 첫 commit 메시지에 박음
2026.02.20덜어냄

둘째 날 — 갈림길에서

처음엔 진로 추천에 OpenAI를 써볼까 했습니다. 한 달 비용을 계산해보니, 사용자 한 명이 늘 때마다 비용이 발생하는 구조였습니다.

그날로 코드에서 다 지웠습니다. 무료로 만들려는 건 멋이 아니었습니다. 운영비가 늘어 결국 사용자에게 요금으로 돌아가는 걸 막고 싶었고, 솔직히 수익이 없는 동안 그 비용을 혼자 감당하기도 어려웠습니다.

그래서 "i-하루는 무료로 유지한다"를 원칙으로 두고, 이후 모든 기능을 한국의 무료 공공데이터로만 만들기로 했습니다.

기술 디테일
사람이 결정한 것
비용이 사용자 수에 비례하는 외부 API(OpenAI 등)는 전면 금지
통계
OpenAI 의존 코드 100% 제거 · 환경 변수 OPENAI_API_KEY 삭제
2026.02 마지막 주

흩어진 것들이 한곳에

학교 정보, 날씨, 급식 영양, 도서관 — 흩어져 있던 네 가지를 처음으로 한곳에 끌어모은 주였습니다.

비로소 "한 화면"이라는 말이 형태를 갖추기 시작했습니다.

기술 디테일
사용 도구
Claude Code
자동화
OpenAPI 명세를 그대로 입력 → TypeScript 타입 + fetcher 자동 생성하는 패턴 정착
통계
첫 연결 공공데이터 3종: NEIS · 기상청 · 도서관정보나루
2026.02 마지막 주

모바일 MVP UI 설계

React Native + Expo로 5탭 골격을 잡았습니다. 홈 · 급식 · 시간표 · 학사일정 · 설정.

이때만 해도 학원·체험학습·병원까지 욕심껏 다 넣을 생각이었습니다.

기술 디테일
사용 도구
React Native · Expo · React Navigation
자동화
홈·급식·시간표·학사일정·설정 5탭을 Bottom Tabs + Native Stack 골격으로 구성
사람이 결정한 것
탭은 5개까지만 — 늘리면 매일 쓰는 앱의 단순함이 깨진다고 판단
Phase 1 · 2026.03

옷 입히기

코드에 얼굴이 생기는 한 달

2026.03이정표

로고가 떠오르다

브랜드 이름 "i-하루"의 뜻 — "나의 하루"와 "나의 아이의 하루" — 을 그림으로 옮겼습니다.

떠오르는 해, 그 아래 흰색 "i" 한 글자. 크림색 배경(#FFF7ED)에 오렌지 #F97316.

슬로건 세 줄도 같이 굳혔습니다.

기술 디테일
사람이 결정한 것
메인 슬로건 "학교생활의 모든 것, i-하루" · 일출 로고(크림 #FFF7ED + 오렌지 #F97316) 확정
2026.03

화면마다 같은 얼굴을

화면을 하나씩 만들 때마다 버튼도 카드도 매번 새로 그렸습니다.

자주 쓰는 조각들을 한 벌로 정리하고 나니, 새 화면을 만드는 시간이 절반으로 줄었습니다. 무엇보다, 어느 화면을 열어도 같은 얼굴이었습니다.

기술 디테일
사용 도구
React Native Paper · Material Design 3
자동화
EduCard·EduButton·EduChip·EduTab·EduBadge·CardSkeleton 등 공유 컴포넌트로 추출
통계
공유 UI 11개 · 신규 화면 제작 시간 약 절반 단축
2026.03덜어냄

다크모드를 일단 접은 이야기

다크모드를 시도했지만 화면마다 색 일관성이 무너지는 것을 발견했습니다.

"잘 안 되는 다크모드는 없느니만 못하다" 판단으로 출시 후 재검토로 미뤘습니다.

되는 것만 내놓자 — 안 되는 걸 접는 것도 결정이었습니다.

기술 디테일
사람이 결정한 것
"잘 안 되는 다크모드는 없느니만 못하다" — 색 일관성 확보 전까지 출시 후로 보류
2026.03 말

12개 핵심 기능 골격 완성

급식 · 시간표 · 학사일정 · 아침 브리핑 · 날씨 · 도서관 · 추천도서 · 교육청 공지 · 직업 · 학과 · 자격증 · 심리검사.

메인 페이지의 12카드 그리드는 이 시점에 거의 자리를 잡았습니다.

기술 디테일
통계
핵심 기능 12종 골격 + 메인 12카드 그리드 확정
Phase 2 · 2026.04

사업이 되다

취미가 책임이 된 한 달

2026.04.06덜어냄

4월 6일 — 가지치기

두 달간 이것저것 넣었던 기능들을 한꺼번에 정리했습니다.

레시피, 병원·약국, 학원 목록, 교육체험, 안전지도 — 다 좋은 기능이었지만 "학교생활"에서 한 발짝 멀었습니다.

욕심을 줄이고 핵심에 집중했습니다. 급식 · 시간표 · 학사일정 · 진로 · 도서관 · 날씨 · 교육청 공지 — 학교생활 핵심 일곱 갈래만 남겼습니다.

이 일곱 갈래가 이후 진로(직업·학과·자격증·심리검사)와 도서(도서관·추천도서)로 나뉘고 아침 브리핑이 더해지며, 출시 시점엔 12가지 기능으로 자리잡습니다.

v7.0~v7.1 축소

기술 디테일
사람이 결정한 것
"학교생활"에서 한 발 먼 기능은 좋아도 제거 — 레시피·병원·학원·교육체험·안전지도
통계
v7.0~v7.1 기능 축소 · 핵심 7갈래 잔존 → 출시 시점 12가지로 확장
2026.04.07덜어냄

4월 7일 — 체험학습 서류

마지막까지 들고 있던 기능 하나를 더 정리했습니다.

학부모가 자주 쓰는 양식이라 아쉬웠지만, 양식을 자동 생성하는 책임은 학교 시스템이 져야 한다고 판단했습니다.

기술 디테일
사람이 결정한 것
양식 자동 생성의 책임은 학교 시스템 몫이라 판단 — 체험학습 서류 기능도 정리
2026.04.21

32초의 답답함

학교 위치로 정확한 날씨를 가져오려고 여러 API를 호출하다 보니, 한 화면 띄우는 데 32초가 걸렸습니다. 사용자 입장에서는 "고장난 앱"이었습니다.

일주일을 통째로 들여 호출 구조를 뜯어고쳤습니다. 결과는 2~4초. 같은 정보, 8분의 1 시간.

기술 디테일
사용 도구
Upstash Redis · Next.js Route Handler
자동화
순차 호출을 병렬로 전환 + Redis 12시간 캐시 + helpers.ts 로직 분리
통계
날씨 화면 응답 32초 → 2~4초 (약 8~15배 개선)
2026.04.22

매일 아침 6시 30분

신규 가입한 사용자가 다음 날 아침 자동으로 브리핑 푸시를 받도록 만들었습니다.

시간표 · 급식 · 날씨 · D-day가 한 줄로 도착합니다.

"가입하고 바로 가치를 경험"한다는 원칙이 여기서 출발했습니다.

v1.1.3 신규 가입 자동화

기술 디테일
사용 도구
FCM
자동화
신규 가입 시 프로필·푸시 토큰 자동 세팅 → 다음 날 아침 브리핑 자동 발송 (매일 새벽 배치)
사람이 결정한 것
온보딩 직후 첫 아침에 시간표·급식·날씨·D-day를 한 줄로 — "가입하고 바로 가치"
2026.04.24이정표

취미가 사업이 된 날

두 달 만에 사업자등록증을 받았습니다. 상호 "아이하루". 일반과세자.

광고나 투자 때문이 아니었습니다. 사용자에게 정직한 책임을 지려면 "장난이 아니다"는 신호가 필요했습니다.

그날 이후 모든 결정에 "이게 사용자에게 떳떳한가"를 한 번 더 묻게 되었습니다.

사업자등록번호 594-56-00915

기술 디테일
사람이 결정한 것
광고·투자가 아니라 사용자에 대한 정직한 책임으로 사업자 등록. 이후 "사용자에게 떳떳한가"를 기준에 추가
2026.04.26이정표

가족이 한 팀이 되어

한국관광공사 디지털콘텐츠 공모전 출전을 결정했습니다. 가족이 한 팀이 되어 출전한 첫 공모전이었습니다.

제안서는 11번을 고쳐 썼습니다. 마감 6일 전에 제출을 마쳤습니다.

기술 디테일
사람이 결정한 것
가족 3명이 한 팀으로 출전 · 제안서 11회 개고 후 마감 6일 전 제출

100일간의 기능 가지치기

7
도입했다 덜어낸 기능
  • · 레시피
  • · 병원·약국
  • · 학원 목록
  • · 교육체험
  • · 체험학습 서류
  • · 안전지도
  • · Sentry
2
접었다 다시 부른 기능
  • · 실종아동
  • · 관광 (v1.4.0 탐방 모듈)
1
시도 후 보류한 기능
  • · 다크모드 (출시 후 재검토)
Phase 3 · 2026.05

어른의 일들

보이지 않는 곳에서 더 많은 일이 일어난 한 달

2026.05.03

보이지 않는 일

데이터베이스 27개 테이블에 RLS(행 단위 보안)를 전수 적용했습니다.

에러 로그와 분석 로그에 개인정보 마스킹을 적용했습니다 — 사용자 개인정보가 평문으로 저장되는 일이 없도록.

사용자가 볼 수 없는 변화지만, 이게 안 되어 있으면 사업을 할 수 없습니다.

기술 디테일
자동화
Supabase 27개 테이블에 행 단위 보안(RLS) 일괄 적용 + 로그 write 시점 PII 자동 마스킹(allowlist)
사람이 결정한 것
사용자가 볼 수 없지만, 안 하면 서비스를 할 수 없는 일이라 출시 전 우선 처리
통계
27 테이블 RLS · dead 테이블 3개 DROP · 로그 평문 개인정보 0
2026.05.04덜어냄

5월 4일 — 유령 도구를 걷어내며

에러 모니터링용으로 Sentry를 붙여뒀습니다. 그런데 자세히 보니, 환경 변수 이름이 미묘하게 어긋나서 단 한 건의 에러도 전송되지 않고 있었습니다.

고쳐서 살릴까 고민하다, 결국 깔끔하게 지웠습니다. 자체 에러 리포팅 API와 Supabase 로그로도 충분했고, 비용 발생 외부 서비스를 늘리지 않는다는 원칙이 더 중요했습니다.

commit 2d2daed

기술 디테일
사람이 결정한 것
오작동하던 Sentry를 고쳐 살리는 대신 제거 — 비용 발생 외부 서비스를 늘리지 않는다는 원칙 우선
통계
에러 모니터링은 자체 error-report API + Supabase 로그 + PII 마스킹으로 통일
2026.05.05

교육부 + 17개 시도교육청 통합

전국 17개 시도 교육청 공지사항을 매일 자동으로 크롤링해서 한 화면에서 보여주도록 만들었습니다.

교육부 공지까지 합치니 학부모가 다른 사이트를 오갈 필요가 없어졌습니다.

기술 디테일
사용 도구
Puppeteer · Oracle Cloud VM
자동화
17개 시도 교육청 + 교육부 공지를 매일 새벽 VM에서 크롤링 → DB 적재 → 한 화면 통합
통계
교육청 17곳 + 교육부 · 전체/개별 탭 + 새 글 뱃지
2026.05.09이정표

i-haru.co.kr

이날 앱에 i-haru.co.kr이라는 정식 주소가 생겼습니다. 친구에게 공유 링크를 보내면, 앱이 깔린 폰은 앱으로, 없는 폰은 웹으로 알아서 열립니다.

받는 사람이 아무것도 신경 쓰지 않아도 되도록.

기술 디테일
사용 도구
Android App Links · Cloudflare
자동화
공유 링크 14곳 + App Links 경로 11개를 i-haru.co.kr로 일괄 마이그레이션 + vercel.app 308 리다이렉트
사람이 결정한 것
앱 설치 폰은 앱으로, 미설치는 웹으로 — production keystore SHA-256 등록
2026.05.10 → 05.12부활

다시 돌아온 친구

한번 정체성을 이유로 접었던 "실종아동 알림" 기능을 다시 살렸습니다. 아이를 키우는 사람으로서, 그 가족의 아픔을 조금이라도 나누고 싶었습니다.

그래서 광고가 나가는 자리에 함께 띄우기로 했습니다. 앱을 쓰는 분들이 지나다 한 번 더 봐주신다면, 누군가는 집으로 돌아갈 수 있을지 모릅니다.

비율은 처음엔 30%였는데, 실제로 폰에 깔아보고 답답해서 10%로 낮췄습니다.

데이터를 가져와 보니 전국에 168명. 1년 이내 사건은 4명뿐이고, 1958년 사건도 아직 찾고 있습니다.

시간 필터를 다 빼고, 우리 동네 → 같은 시도 → 전국 → 장기 미해결 순으로 보여주도록 v2로 재설계했습니다.

부활 결정 → v2 12 task 완료 (18 + 12 commit)

기술 디테일
사용 도구
safe182 OpenAPI · Oracle Cloud VM
사람이 결정한 것
"1년 이내가 4명뿐인데 365일 cutoff?" — 사용자 직관이 AI 가정을 정정
통계
우리 동네 ×5 / 같은 시도 ×3 / 전국 ×2 가중 · 광고:실종 = 90:10 · v2 12 task
2026.05.14이정표

App Store로 가는 자격

App Store에 회사로 등록하려면 D-U-N-S라는 국제 기업 식별번호가 필요합니다. 신청 5일 만에 도착했습니다.

아직 App Store에 올리지는 않았지만, 올릴 수 있는 자격은 이날 갖췄습니다.

기술 디테일
사람이 결정한 것
Google Play 조직 계정 + 본인·웹사이트·전화 3중 인증 통과 · Apple은 출시 안정화 후로 보류
통계
D-U-N-S 발급 — 신청 5일 만에(예상 7~14영업일보다 빠름)
2026.05.14

정직하게 광고를 받는 법

무료로 유지하려면 광고가 필요했습니다. 그래도 아무 광고나 받고 싶진 않았습니다.

광고주가 신청하면 직접 검토하고, 내보낸 뒤 다달이 리포트를 보내는 흐름까지 끝을 봤습니다. 광고를 받더라도 떳떳하게.

기술 디테일
사용 도구
reCAPTCHA v3 · Gmail SMTP · Vercel Cron
자동화
광고주 신청→검토→게재→월간 리포트 자동화 + 사업자번호 진위 검증 + 자동 만료 cron
통계
9 commit · 535 tests 통과 · production 라이브
2026.05.17

한 자리에 세 손님

한 광고 자리에 광고주 배너, 실종아동 알림, 자동 광고 세 가지가 번갈아 들어옵니다.

어느 것을 얼마나 자주 보여줄지, 그 비율을 직접 조절할 수 있게 만들었습니다.

기술 디테일
자동화
광고주 배너·실종아동·AdMob을 한 슬롯에서 가중 랜덤 노출 + 분점 운영(사업자번호+학원명+지역 UNIQUE) + 지역 자동 매칭
통계
subagent-driven 28 task · 마이그레이션 3종 · 노출 비율 슬라이더로 운영 제어
2026.05.17

아이 손에 더 좋은 책을

도서관 책에 더해, 서점에 갓 나온 책까지 아이에게 닿게 하고 싶었습니다.

새로 나온 책 44권과 많이 읽힌 책 50권을, 매일 새벽 자동으로 받아오도록 했습니다.

기술 디테일
사용 도구
알라딘 TTB OpenAPI · Oracle Cloud VM
자동화
ISBN10↔13 정규화 + VM 프록시 경유 호출 + 신간·베스트셀러 매일 새벽 동기화
통계
신간 44권 · 베스트셀러 50권 · 36 commit · 마이그레이션 4종 · 도서관(정보나루)·서점(알라딘) 완전 분리
2026.05.20부활

한 통의 메일

한국관광공사 공모전 예비심사 합격 통지가 도착했습니다.

한번은 정체성을 이유로 접었던 "관광" 기능이, 공모전 출전작 v1.4.0 탐방 모듈로 다시 돌아옵니다.

1차 심사가 9월 21일, 최종 심사가 10월 28일, 시상이 11월 5일. 갈 길은 멀지만, 처음으로 혼자 하는 일은 아니라는 느낌이 들었습니다.

기술 디테일
통계
예비심사 합격 · 1차 심사 9월 21일 · 최종 심사 10월 28일 · 시상 11월 5일
2026.05.27

미디어킷과 스토리

기자와 리뷰어가 쓸 수 있도록 로고와 앱 스크린샷을 정리한 미디어킷 페이지를 정식 가동했습니다.

같은 날 저녁, 지금 보고 계신 이 페이지의 작성을 시작했습니다.

기술 디테일
사람이 결정한 것
기자·리뷰어용 미디어킷 정식 가동(로고·스크린샷) + 같은 날 이 스토리 페이지 착수
Phase 4 · 2026.06~07

세상에 내보내기

준비를 마치고 문을 여는 시간

2026.06.15이정표

도서관 안내 한 줄에, 신고 한 건

주변 도서관을 위치로 안내하는 기능 하나 때문에, 위치정보법상 사업자 신고가 필요했습니다.

큰 회사만 밟는 절차 같았지만, 한 사람이 만든 무료 앱도 예외는 아니었습니다. 신청서를 쓰고, 보완 요청을 받아 양식을 다시 맞췄습니다.

2026년 6월 15일, 방송미디어통신사무소의 수리증이 도착했습니다. 신고번호 제1170호.

위치기반서비스사업 신고번호 제1170호

기술 디테일
사람이 결정한 것
기능 하나에도 법이 요구하는 절차는 다 밟는다 — 위치 정보는 서버에 저장하지 않고 일회성으로만
통계
부가통신 = 신고 면제 확정 / 위치기반 = 수리 완료(제1170호)
2026.06

보이지 않아도, 정직하게

출시를 앞두고 개인정보처리방침과 이용약관을 한 줄씩 다시 봤습니다.

데이터가 거쳐 가는 회사는 빠짐없이 적었습니다 — 이메일 발송, 캐시, 크롤러 서버까지. 어느 나라를 거치는지, 무엇이 오가는지.

약관의 "위치 정보를 서버에 저장하지 않는다"는 문장이 코드와 정말 일치하는지도 직접 대조했습니다.

기술 디테일
사람이 결정한 것
사용자가 잘 읽지 않는 페이지일수록 더 정직하게 — 약관의 문장과 실제 코드를 대조
통계
처리위탁·국외이전 수탁자 전수 명시 · 만 14세 미만 보호 · 위치정보 서버 미저장 코드 검증
2026.06.15

권장이었지만, 제대로

네이버 로그인 검수가 ‘승인’으로 돌아왔습니다. 다만 로그인 버튼을 가이드에 맞춰달라는 ‘권장’이 붙어 있었습니다.

권장이니 넘어가도 됐지만, 이왕 하는 김에 카카오·네이버·구글 세 곳의 공식 가이드를 모두 펼쳐 버튼을 처음부터 다시 그렸습니다.

각 브랜드의 진짜 로고와 정해진 문구, 정해진 색으로. 작은 버튼 하나도 남의 브랜드는 함부로 그리지 않는다는 마음으로요.

기술 디테일
사람이 결정한 것
‘권장’도 기왕이면 제대로 — 버튼 시안은 빌드 전에 목업으로 먼저 확인하고 결정
통계
카카오·네이버·구글 공식 BI 준수 · 로그인·회원가입 동시 적용
2026.06

Play Console AAB 등록 (예정)

Android 정식 출시를 위한 AAB 패키지를 Play Console에 업로드합니다.

2026.06~07

최종 QA

실제 학교 사용자 시나리오를 따라가며 마지막 검증을 진행합니다.

2026.07이정표

7월 초 — 정식 출시 (예정)

드디어 사용자에게 닿습니다.

한 줄의 고민에서 시작한 앱이, 누군가의 바쁜 아침을 조금이라도 가볍게 한다면 좋겠습니다.

Phase 5 · 계속

다음

끝이 아니라 또 다른 시작

2026.09~11

v1.4.0 탐방 모듈

한국관광공사 공모전 출전작입니다. 1차 심사 9월 21일, 최종 심사 10월 28일, 시상 11월 5일.

가족 여행 · 학교 탐방 · 지역 축제를 학생과 학부모 관점에서 다시 풀어냅니다.

계속

학생과 학부모의 하루를 더

학생은 학업에, 학부모는 아이의 하루에 — 거기에 보탬이 되는 기능을 하나씩 더해갑니다.

거창한 목표는 없습니다. 매일 쓰는 앱이 매일 조금씩 나아지면 됩니다.

바이브 코딩, 우리는 이렇게 했습니다

100일간 AI 도구로 1인 서비스를 만든 실전 워크플로

01워크플로 — 사람이 결정하고 AI가 구현

모든 작업을 네 단계로 나눴습니다. 브레인스토밍에서 무엇을 왜 만들지 합의하고, 스펙 문서로 화면·데이터·예외를 글로 못박고, 플랜에서 작업을 독립적인 task로 쪼갠 뒤, 마지막에 구현합니다.

단계마다 사람이 승인해야 다음으로 넘어갑니다. AI가 큰 그림을 멋대로 바꾸는 일이 구조적으로 막힙니다.

구현은 task 하나당 새 작업자(subagent)를 띄워 처리하고, 끝나면 두 번 검토합니다. 먼저 "스펙대로 만들었나 — 빠진 것·더한 것", 그다음 "코드가 깔끔한가".

지금 보고 계신 이 스토리 페이지도 14개 task 플랜으로 쪼개, 컴포넌트 하나씩 구현하고 매번 타입 검사·테스트·커밋을 거쳐 만들어졌습니다.

스펙과 플랜은 모두 git에 문서로 남깁니다. 나중에 "왜 이렇게 만들었지"를 코드가 아니라 문서에서 찾습니다.

  1. 브레인스토밍
    사람 결정
  2. 스펙
    AI 작성 + 사람 승인
  3. 플랜
    AI 작성 + 사람 승인
  4. 구현
    AI 작성 + 사람 검증

02컨텍스트 보존 — 대화는 끊겨도 기록은 남는다

AI와의 대화는 길어지면 끊깁니다. 그래서 매 대화가 끝날 때마다 결정사항·피드백·우여곡절을 메모리 파일로 남깁니다.

메모리는 네 종류입니다. 내가 누구인지(사용자), 어떻게 일해야 하는지(행동 지침), 지금 무엇을 하는지(프로젝트 현황), 외부 자원은 어디 있는지(참조).

한 파일에 사실 하나. 위에는 요약, 본문엔 "왜 그렇게 정했는지"와 "어떻게 적용할지"를 적습니다. 인덱스 한 장으로 전체를 훑습니다.

예를 들어 "존댓말로 말할 것", "보라 그라디언트 같은 AI 색은 금지", "공공데이터 키는 전부 같은 키" 같은 지침이 박혀 있어, 다음 세션의 AI가 같은 실수를 반복하지 않습니다.

덕분에 100일 넘게 세션이 수백 번 바뀌어도, AI는 매번 "이 프로젝트에서 무엇을 왜 정했는지"를 들고 시작합니다.

03AI에게 맡긴 일 / 사람이 결정한 일

경계는 분명했습니다. AI는 "어떻게"를 맡고, 사람은 "무엇을"과 "왜"를 쥡니다.

AI는 코드를 쓰고 테스트를 짜고 리팩토링하고, 마이그레이션 SQL과 커밋 메시지, 문서와 시각 디자인 1차안까지 만듭니다.

사람은 어떤 기능을 넣고 뺄지, 무료로 갈지, 사업자를 낼지, 마케팅을 어떤 톤으로 할지, 상표를 어디에 낼지를 정합니다. 실제 폰에 깔아 답답한지 확인하는 것도 사람 몫입니다.

AI가 짠 코드라도 보안·DB 마이그레이션·결제처럼 되돌리기 어려운 곳은 사람이 한 번 더 읽고 넘어갔습니다.

AI 영역

  • · 코드 작성, 테스트, 리팩토링
  • · 마이그레이션 SQL, 커밋 메시지
  • · 문서, 시각 디자인 1차안
  • · 자동 검증 (type-check · lint · test)

사람 영역

  • · 기능 추가·제거 판단
  • · 사업자 등록, 가격 정책
  • · 마케팅 톤, 상표 출원
  • · 실폰 베타 검증, 사용자 피드백

04검증이 먼저, 선언은 나중 — 매 변경마다 직접 돌려본다

"됐어"라고 말하기 전에 검증 명령을 실제로 돌리고 결과를 눈으로 본 다음에 말합니다. 타입 검사 통과, 테스트 통과, 배포 후 주소로 직접 호출해 정상 응답 — 그제서야 "됐다"입니다.

이 원칙이 빛난 순간이 있습니다. 이 스토리 페이지를 배포한 직후, 주소는 열리는데 본문이 비어 있었습니다. 공통 레이아웃의 한 줄 때문에 본문이 검색엔진에 안 보이는 상태였고, 한 줄을 고쳐 해결했습니다. "열리니까 됐겠지"로 넘겼으면 못 잡았을 문제입니다.

사람의 직관이 AI의 그럴듯한 가정을 뒤집은 적도 여러 번입니다. "공공데이터 키는 사실 다 같은 키 아니냐", "실종아동 1년 이내가 4명뿐인데 왜 1년으로 자르냐" — 한 줄의 의심이 며칠을 아꼈습니다.

AI는 빠르지만, 틀릴 때도 확신에 차 있습니다. 그래서 빠르게 만들되 그대로 믿지 않고 확인합니다.

05비용 — 운영비를 0원에 가깝게

운영비를 0원에 가깝게 유지하는 건 자랑이 아니라 약속에 가깝습니다. 비용이 늘면 결국 사용자에게 요금으로 돌아가니까요.

돈을 낸 건 둘뿐입니다. AI 코딩 도구 하나, 도메인 하나.

나머지는 전부 무료 등급으로 버텼습니다. 웹과 예약 작업은 Vercel, 데이터베이스·로그인·저장소는 Supabase, 캐시는 Upstash, 매일 도는 크롤러는 Oracle Cloud의 평생 무료 서버.

기능을 채우는 데이터도 전부 한국의 무료 공공데이터입니다. 급식·시간표는 교육부 NEIS, 날씨는 기상청, 진로는 커리어넷, 도서는 도서관정보나루 — 사용자가 늘어도 추가 요금이 붙지 않는 구조만 골랐습니다.

인프라 0원

유료

  • AI 코딩 도구Claude Code / Claude Opus 4.7
  • 도메인i-haru.co.kr

무료 인프라

  • VercelFree Tier (웹 호스팅 · cron)
  • SupabaseFree Tier (DB · Auth · Storage)
  • Upstash RedisFree Tier (캐시)
  • Oracle CloudAlways Free (크롤러 VM)
  • 공공데이터NEIS · 기상청 · 커리어넷 외 12종 무료

06AI의 한계, 그리고 우회법

AI는 만능이 아니었습니다. 한계를 알고 우회하는 게 일의 절반이었습니다.

첫째, 기억은 낡습니다. 메모리에 적힌 "이 파일 몇 번째 줄"은 며칠 뒤면 어긋나 있곤 합니다. 그래서 메모리를 믿되, 코드는 항상 다시 열어 확인합니다.

둘째, 모르면 그럴듯하게 지어냅니다. 빈 결과가 나오면 "필수 파라미터를 빠뜨린 것 아닌가"부터 의심하도록 가드레일을 메모리에 박아 뒀습니다.

셋째, 마케팅 문구에서 과장으로 흐릅니다. "검증할 수 없는 단언은 쓰지 말 것" 같은 규칙을 메모리에 적어 두면, AI가 알아서 그 표현을 피합니다.

결국 AI의 한계는 사람의 규칙으로 메꿨습니다. 한 번 정한 규칙은 메모리에 남아 다음 세션까지 따라갑니다.

07추천 패턴 (비슷한 시도를 하실 분들에게)

  • 할 일을 눈에 보이게 적으세요. 작업 목록을 만들어 두면 어디까지 됐는지 사람도 AI도 한눈에 봅니다.
  • 독립적인 일은 동시에 돌리세요. 서로 안 엉키는 작업은 여러 작업자에게 나눠 맡기면 빨라집니다.
  • 비밀값은 자동으로 막으세요. 커밋 직전 검사로 환경 변수나 키가 git에 올라가는 걸 차단했습니다.
  • AI가 짠 코드도 사람이 한 번 더 보세요. 특히 보안·DB 마이그레이션·결제는 되돌리기 어려우니 반드시.
  • 그리고 무엇보다, "됐다"는 직접 돌려보고 말하세요. 검증 없는 자신감이 가장 비쌉니다.

i-하루를 직접 써보고 싶으신가요?

오늘 아침의 시간표 · 급식 · 날씨 · D-day를 한 줄 푸시로