한눈에
- 출시 준비를 마친 복약·영양제 관리 앱을 혼자 완성했다.
- 코드·설계는 전부 AI(Claude Code)가 작성했다. 나는 무엇을 어떤 규칙으로 만들지 정의하고, AI 개발 워크플로를 설계·검수했다.
- 명세 우선 개발 · 교차 모델 검증 · 자동 검증 게이트로 품질을 통제했고, 핵심 로직은 자동 테스트로 검증했다.
실제 앱 화면 — 목록 · 캘린더 · 수정 · 복용 기록 PDF · 설정
어떻게 만들었나 — AI 개발 방법론
약 정보는 그 사람의 건강을 드러내는, 민감하고 정확해야 하는 데이터다. 그래서 “그냥 작동하는 연습용”이 아니라 출시해도 될 수준을 목표로 잡았고, 단순히 “AI야 만들어줘”로 끝내지 않고 품질을 보장하기 위한 개발 워크플로를 짜서 진행했다.
코드는 AI(Claude Code)가 작성했다. 내가 한 일은 무엇을 어떤 규칙으로 만들지 정의하고, AI가 그것을 제대로 구현하도록 개발 과정을 설계·관리하는 것이었다.
- 명세 우선 개발 (Spec-driven Development) — 구현 전에 요구사항을 글로 확정했다. 먼저 무엇을·왜 만들지 명세를 작성하고(specify), 그 명세에서 모호하거나 빠진 부분을 질문으로 짚어 메우고(clarify), 명세가 충분히 완전·명확한지 점검 목록으로 검증한(checklist) 뒤에야 구현에 들어갔다. 이 clarify 단계에서 “같은 약을 두 번 넣으면?”, “남은 개수가 0이 되면?”, “알림은 몇 번까지?” 같은 빈틈을 미리 메웠다. 명세의 품질이 결과물의 품질을 결정한다는 원칙으로 작업했다.
- 교차 모델 검증 (Cross-model Review) — 한 모델(Claude)이 세운 명세·계획을, 다른 제공자의 모델(OpenAI Codex)이 독립적으로 검토·반박하게 했다. 같은 모델은 자기 설계의 허점을 보지 못하기에, 결제·동시성·데이터 손실처럼 위험이 큰 부분일수록 서로 다른 모델로 교차 검증해 약점을 미리 걸러냈다.
- 자동 검증 게이트 (Verification Gates) — 계층 간 의존성 방향 같은 아키텍처 규칙을 검사 코드로 만들어, 변경할 때마다 규칙 위반을 자동으로 잡았다.
- 기능별 격리 · 살아있는 문서 · 코드 인덱싱 — 기능마다 독립 작업 공간(worktree)에서 진행하고, 설계 문서를 코드와 동기화해 유지하며, 코드 구조를 색인화해 AI가 정확한 맥락 위에서 작업하게 했다.
요컨대 내 기여는 코드 타이핑이 아니라, AI가 일관되고 검증 가능한 방식으로 프로덕션급 결과를 내도록 개발 방법론을 설계·운용한 것이다.
내가 책임진 결정 — 출시 수준으로 막은 것들
방법론이 말뿐이 아니라는 증거다. 까다로운 문제에서 내가 동작 규칙을 정하고, AI가 그 규칙대로 구현했다.
약 개수 계산이 어긋나지 않게
컴퓨터는 소수점 숫자(예: 0.5)를 계산할 때 미세한 오차가 생긴다. 약은 “30개에서 하루 1개씩 30일이면 정확히 0개”여야 하므로, “약 개수와 복용량은 오차가 생기지 않는 방식으로만 다룬다”를 규칙으로 정했다. 덕분에 “0.0000001개 남음” 같은 잘못된 표시가 나오지 않는다.
먹음·건너뜀·놓침을 구분해서 기록
약을 “먹었다”, “일부러 건너뛴다”, “그냥 놓쳤다”는 의미가 서로 다르다. 특히 일부러 건너뛴 건 안 먹은 것이라 재고가 줄면 안 된다. 그래서 “이 셋을 구분해 기록하고, 건너뜀은 약 개수를 깎지 않는다”를 규칙으로 정했다.
약을 지워도 과거 기록은 남게
약을 목록에서 지우면 보통 그 약의 복용 기록도 같이 사라진다. 하지만 “지난달에 무슨 약을 며칠 먹었는지”는 남아야 의미가 있다고 봤다. 그래서 “약을 지워도 과거 복용 기록은 그대로 보존한다”를 규칙으로 정했다.
약 일정을 바꿔도 과거 기록은 그대로
복용 시간이나 횟수를 중간에 바꾸면, 자칫 지난 날짜의 기록까지 새 일정 기준으로 엉킬 수 있다. 그래서 “과거는 그때 정해져 있던 일정 기준으로 그대로 두고, 바뀐 일정은 오늘부터 적용한다”를 규칙으로 정했다.
폰을 꺼놔도 정해진 시간에 자동 기록
요즘 휴대폰은 배터리를 아끼려고 안 쓰는 앱을 뒤에서 멈춘다. 약은 정해진 시간에 빠짐없이 기록되는 게 중요하므로, “앱이 꺼져 있거나 잠겨 있어도 정시에 복용을 자동으로 남긴다”를 규칙으로 정했다. 화면을 켤 때까지 미뤄지지 않도록 처리됐다.
알림이 한꺼번에 쏟아지지 않게
약이 많으면 복용·재고 알림이 한꺼번에 몰려 정작 급한 알림이 묻힌다. 그래서 “휴대폰이 감당할 수 있는 알림 한도 안에서, 급한 것(곧 떨어지는 약·오늘 먹을 약)부터 챙긴다”를 규칙으로 정했다.
여러 나라 말을 지원하되, 번역이 빠져도 안 깨지게
38개 언어를 지원하기로 했는데, 어떤 언어에서 번역이 하나라도 빠지면 화면에 빈칸이나 알 수 없는 글자가 뜨기 쉽다. 그래서 “번역이 없으면 영어로, 그것도 없으면 안전한 글자로 대신 채워 절대 깨진 화면이 안 나오게 한다”를 규칙으로 정했다.
개인 정보가 새지 않게
약 정보는 그 사람의 병을 짐작하게 하는 민감한 정보다. 그래서 “오류 기록이나 내보낸 파일에 약 이름·메모가 섞여 나가면 안 된다”를 규칙으로 두고, 출시 전에 이런 새는 구멍을 점검해 막았다.
결제를 속일 수 없게
광고 제거 결제는 앱을 조작해 공짜로 푸는 시도가 늘 있다. 그래서 “결제가 진짜인지는 휴대폰 안이 아니라 서버에서만 확인한다”는 규칙을 정했다. 이 규칙대로 구현된 결과, 앱 쪽 데이터를 손대도 서버가 인정하지 않으면 광고가 풀리지 않는다.
이 밖에도 대용량 백업이 안전하게 처리되는 것, 인터넷이 중간에 끊겨도 데이터가 깨지지 않는 것 같은 경계 상황까지 따져 처리했고, 그 동작이 깨지지 않는지 자동 테스트로 검증했다.
갖춘 기능
주요 기능을 7개 영역으로 묶었다.
- 약·복용 관리 — 추가·수정·삭제, 연속 추가, 자동 복용, 복용 중지·재개, 정렬·필터·카테고리
- 달력·기록 — 먹음/건너뜀/놓침 구분, 복용 달성률, 미래 재고 예측, 삭제해도 과거 기록 보존
- 알림 — 복용·리필 알림, 알림에서 바로 처리, 알림 개수 한도 자동 관리, 언어 바꾸면 재번역
- 언어·화면 — 38개 언어 자동 인식, 테마·시간 형식 설정, 길게 눌러 빠른 값 조절, 넓은 화면 달력 분할
- 계정·보안 — 구글/애플 로그인, 계정·데이터 완전 삭제, 결제 서버 검증, 동의 기반 오류 리포트
- 데이터 — 클라우드 백업·복원(손상 백업 자동 차단), 복용 기록·약 목록 PDF·엑셀 내보내기
- 광고·결제 — 광고 제거 1회 구매, 기기 간 동기화, 환불 자동 반영, 지역별 동의, 비맞춤형 광고
전체 기능 펼쳐 보기
약·복용 관리
- 약·영양제를 카드 목록으로 보기, 추가·수정·삭제
- 수량·단위(개·mg·mL·IU 등)·메모·카테고리·카드 색상(배경·글자) 지정
- 복용 간격(며칠마다)·하루 횟수, 회차별 시간·복용량·이름 설정
- 복용 시작일 지정(과거로 잡으면 지난 복용 기록 자동 채움)
- 연속 추가 모드로 비슷한 약을 빠르게 여러 개 등록
- 자동 복용(자동 차감) 켜기/끄기, 복용 중지·재개(재개 시 주기 오늘부터 다시 시작)
- 목록의 알약 아이콘·복용 알림에서 ‘먹었음’ 한 번에 처리(같은 회차 중복 복용 자동 차단)
- 삭제할 때 복용 기록을 캘린더에 남길지, 함께 지울지 선택
- 정렬(남은 일수·이름·지정순, 오름·내림 전환)·필터(전체/자동/수동·카테고리)·편집 모드에서 드래그로 순서 변경
달력·복용 기록
- 달력에서 날짜를 누르면 그날의 복용 일정과 기록을 시간순으로 보기
- 각 복용을 먹음·건너뜀·놓침 3가지로 눌러 구분 기록 (건너뜀은 약 수량을 깎지 않음)
- 날짜마다 복용 달성률을 원형 그래프로 표시 (건너뜀은 옅게 구분)
- 달력에 표시할 약을 골라서 보기
- 달력 위 월 이름을 누르면 원하는 연·월로 바로 이동
- 앞으로 날짜는 지금 재고로 채울 수 있는 복용만 미리 예측해서 보여줌
- 약 일정을 바꿔도 과거 달력은 그때 일정 기준 그대로 표시
- 약을 삭제해도 과거 복용 기록은 그대로 보존 (기록은 개별 삭제 가능)
알림
- 전체 알림 한 번에 켜기/끄기, 약마다 복용·리필 알림 따로 설정
- 리필 알림에 남은 날짜 카운트다운(D-3 등), 며칠 전부터·몇 시에 알릴지 약마다 설정
- 알림에서 바로 복용·건너뛰기 처리(앱 안 열어도 됨), 리필은 수량 입력 화면으로 연결
- 자동 복용 성공·실패 결과 알림, 재고 부족으로 실패 시 알림에서 바로 리필
- 휴대폰 알림 개수 한도 안에서 급한 약부터 우선 배정
- 한도가 차면 ‘앱을 열어 다시 등록’ 안내 알림 + 왜 필요한지 설명
- 언어를 바꾸면 이미 예약된 알림 문구까지 새 언어로 재번역
언어·화면
- 38개 언어 지원, 첫 실행 시 기기 언어를 자동 인식 (지역에 맞는 날짜·시간·소수점 표기)
- 테마(시스템·밝게·어둡게), 12/24시간제, 주 시작 요일(일요일·월요일) 설정
- 입력 칸을 길게 누른 채 위아래로 밀면 값을 한 단계씩 빠르게 조절
- 약 카드의 배경색과 글자색을 따로 선택
- 넓은 화면(태블릿 등)에서는 달력과 그날 복용 내역을 좌우로 나란히 표시
계정·보안·개인정보
- 구글(안드로이드)·애플(iOS) 계정으로 로그인, 로그인할 때 약관·개인정보 처리방침 동의 안내 표시
- 계정 연결 해제(백업은 그대로 두기)와 계정·데이터 완전 삭제(과거 백업본까지, 다시 로그인 확인 후) 중 선택
- 결제는 서버에서 진짜 구매인지 확인하고, 무단 접근은 차단
- 오류 리포트는 동의했을 때만 보내고(기본 꺼짐, 언제든 끄기), 약 이름·메모 같은 개인정보는 가려서 전송
- 익명으로 의견 보내기 (오프라인이면 연결된 뒤 자동 전송)
- 약 이름·메모·일정 메모·분류 이름 같은 민감한 입력은 키보드 학습에 남지 않게 처리
- 이용약관·개인정보 처리방침·계정 및 데이터 삭제 안내를 앱 안에서(오프라인에서도) 보기
데이터·백업·내보내기
- 애플·구글 계정으로 로그인해 복용 데이터를 클라우드에 백업·복원
- 백업하면 이전 백업을 덮어쓰고, 복원하면 현재 기기 데이터를 통째로 교체
- 복원 시 손상·미완성 백업은 자동으로 걸러내고, 여러 해치 기록도 안정적으로 처리
- 계정 연결만 해제하면 백업은 그대로 두고, 계정 삭제 시 백업까지 모두 영구 삭제
- 복용 기록 또는 약 목록을 PDF·엑셀 파일로 내보내 병원 제출 등에 활용
- 내보낼 기간·대상 약·형식을 고르고, 미리보기로 확인한 뒤 공유하거나 기기에 저장
광고·결제
- 광고 제거를 한 번 구매하면 끝, 결제 즉시 모든 광고가 사라짐
- 데이터 내보내기 시 전면 광고 1회, 평소엔 화면 하단 배너만 표시
- 구매 복원 버튼으로 되살리고, 로그인하면 기기끼리 자동 동기화
- 설치 후 7일간은 광고 없이 사용
- 환불하면 광고가 자동으로 다시 표시되고, 환불이 취소되면 광고가 다시 사라짐
- 유럽 등 동의가 필요한 지역은 광고 전 동의를 받고, 설정에서 언제든 다시 변경 가능
- 맞춤형 추적 없이 비맞춤형 광고만 표시 (광고 식별자 미수집)
정직하게 — 내가 한 일
이 앱의 코드와 설계는 AI(Claude Code)로 구현했다. 내가 한 일은 코드 작성이 아니라, 무엇을 어떤 규칙으로 만들지 정하고, AI가 제대로 만들도록 개발 방식을 설계하고 결과를 검수한 것이다.
이 프로젝트로 확인한 건 하나다 — 혼자서도, AI를 도구로 잘 다루면, 아이디어를 출시 가능한 제품까지 끌고 갈 수 있다.